[Scummvm-cvs-logs] scummvm master -> 55e88c9e43d854fc2b5082d33db57147ca4fd913

sev- sev at scummvm.org
Sun Sep 8 23:05:10 CEST 2013


This automated email contains information about 221 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
caa5c44e46 FULLPIPE: Add gameobj.h from the German version
b4bf88be46 FULLPIPE: Add engine to the build system
26e6f50860 FULLPIPE: Initial engine skeleton with detection
c69415112f FULLPIPE: Implemented NMI archive parser
7e1736cd70 FULLPIPE: Added constants for object names and partial translation
392093124b FULLPIPE: translated rest of the object names
94f2adb8d6 FULLPIPE: Initial stub for all classes in loadGam()
fa30dcef15 FULLPIPE: Add loader for GameProject
82cbf508b5 FULLPIPE: Refactored pascal style string reader
146e5a9224 FULLPIPE: Read SceneTags from fullpipe.gam
4eb9176274 FULLPIPE: Moved global variables to fullpipe.cpp
ba26e17980 FULLPIPE: Load inventory from fullpipe.gam
e624ee3442 FULLPIPE: Add utils.h which was overlooked
4f4834d934 FULLPIPE: CFile -> MfcArchive
4bc204cfc4 FULLPIPE: Start of Interaction loading
05418b908a FULLPIPE: Turn all MfcArchive loading functions into virtual methods
bd565771d0 FULLPIPE: Started work on CObList loader
0c03278937 FULLPIPE: Start of reading CInteraction
72aeac3f36 FULLPIPE: Continue parsing CInteraction
e9fa2e52df FULLPIPE: Continued loading CInteraction
ad47d5a5e2 FULLPIPE: Attampt to fix serializer. Still not working
9395ab11d2 FULLPIPE: Hack to enable object loader
67d30f29f9 FULLPIPE: Added ObjstateCommand loader
0b1bda78fc FULLPIPE: Fix object loading
da00b7143e FULLPIPE: Add more debug output to archive loading
54624966ce FULLPIPE: Finish loading CInteractions
775065af1d FULLPIPE: Started CGameVar loading
f106d79198 FULLPIPE: Fix object indexing
a116677e6e FULLPIPE: Finish loading fullpipe.gam
ffd8ebacc5 FULLPIPE: Removed excess debugging info and added variable levels
d3d3d01eb0 FULLPIPE: Started sc2 file loading implementation
928c19eeb0 FULLPIPE: More work on Sc2 loader
e24ce22ca7 FULLPIPE: Continued work on loading sc2 files
5eaa5696e7 FULLPIPE: Added module.mk
a3de44d3b2 FULLPIPE: Further work on sc2 loader
0f9c1281d4 FULLPIPE: CMovGraph loader
a8d733b2b2 FULLPIPE: Split out motion-related classes
5ea45699a8 FULLPIPE: Reading CMovGraphNode
630d5526ee FULLPIPE: Implemented CReactParallel loader
195d52e625 FULLPIPE: Implement loading CReactPolygonal. That completes .sc2 loading
fcf0d240d0 FULLPIPE: Finish reading CMctlCompund
2e6bad888e FULLPIPE: Put debug output at deeper levels
249c4bd118 FULLPIPE: implement initObjectStates()
3e948052f7 FULLPIPE: Make Inventory2 inherit from Inventory
8de8a901cb FULLPIPE: Put all inventory-related classes into separate file
dac4f23f84 FULLPIPE: Turned InventoryPoolItem into struct
569b794bfe FULLPIPE: Continued work on Inventory
2412eb23ad FULLPIPE: Further refactoring classes into separate files
bb4ea153ff FULLPIPE: Started scene loading
925f41b9c4 FULLPIPE: Made MfcArchive work with both files and archives
77ab4241d9 FULLPIPE: Continued work on Scene loading. Pictures
47faa88501 FULLPIPE: Furhter work on picture loading
29f323fd27 FULLPIPE: Completed Background loading
751f435df0 FULLPIPE: Continued on scene loading
0b6591e491 FULLPIPE: Continued work on scene loading
1c1d8db613 FULLPIPE: Now StaticANIObject is loaded fully
68c5cfdf2c FULLPIPE: Continued Scene loading
00971bf209 FULLPIPE: Shadows loading
5f7cf0131c FULLPIPE: Started sound loading
679c46a5bf FULLPIPE: Finished sound loading
8b50154626 FULLPIPE: Fix loading .qu files
88b3e27440 FULLPIPE: Load all scenes for debugging purposes
305692fefe FULLPIPE: Fix MemoryObject loading
ee5dc16eaa FULLPIPE: Implement Background::addPictureObject
d4e572843d FULLPIPE: Transcode Cyrillic into UTF-8 for debugging convenience
cb38892ce8 FULLPIPE: Continued on scene loading
69946ce963 FULLPIPE: Continued scene loading
c2103bb9cd FULLPIPE: Fix indentation
f18e318f78 FULLPIPE: Bitmap loading
56cb726ebc FULLPIPE: Added lots of debug output, Picture::setAOIDs() implementation
1aa11bd86f FULLPIPE: Further work on inventory
defc53d4d1 FULLPIPE: Scene drawing stubs
51a5b5c9c5 FULLPIPE: Stubs for picture drawing
57e03aedd3 FULLPIPE: Initial code for bitmap rendering
6518cb579c FULLPIPE: Bitmap loading.
a54a60f52e FULLPIPE: Fix crash in bitmap drawing code.
d0c9392862 FULLPIPE: Implemented quitting from picture browsing
ba93c8d084 FULLPIPE: Added links to articles with floating point structure description
4554ac24c6 FULLPIPE: Fixed to RB bitmap rendering
ade5ad2c74 FULLPIPE: Optimize bitmap rendering routine
5add3373fe FULLPIPE: Fix stupid bug in RB bitmap rendering
754858641b FULLPIPE: Proper parameters for screen blitting
75c4be7469 FULLPIPE: Split drawing of different image types. Optimize putDibCB
0c218f0144 FULLPIPE: Refactored putDibRB to a human-readable state.
cf35f34454 FULLPIPE: Beginning of scene drawing
8f0ff728e4 FULLPIPE: Rename _stringObj to relevant names in order to avoid ambiguity
69fc7a38bb FULLPIPE: Continued scene drawing
3ab56b0cc8 FULLPIPE: Initial code for scene switcher.
c76bec2646 FULLPIPE: Further work on sceneSwitcher()
62cbdd81f0 FULLPIPE: Further work on sceneSwitcher.
c4499bb4b2 FULLPIPE: Further work on sceneSwitcher
82b596a31e FULLPIPE: Several methods for motion controller
7aa2377bf7 FULLPIPE: Initial stubs for input system
9d83eb1aea FULLPIPE: More work on sceneSwitcher. MessageHandler
4dc47c5c08 FULLPIPE: More message handler-related functions
22eedf5600 FULLPIPE: Further work on Scene switcher
f54055d1ee FULLPIPE: Finished stubbing SceneSwitcher. Added Behavior Manager
dbe5524fe0 FULLPIPE: First part of scene drawing code
aaf5bae026 FULLPIPE: Fixed initial scene drawing. Scene bg is shown
7f332e1f20 FULLPIPE: Second part of scene drawing
b18f08d93b FULLPIPE: Started Statics drawing
5a182df099 FULLPIPE: Unstubbed StaticANIObject::addReverseStatics()
67bbf26ecd FULLPIPE: Rename messagequeue.* to messages.*
4dc3481ec1 FULLPIPE: Moved Messge class to messages.cpp
ad537b1a7e FULLPIPE: Further work on loadGam()
94fedf0128 FULLPIPE: Finished stubbing loadGam()
4d215a849d FULLPIPE: Moved all engine initialization functions to init.cpp
74b662516d FULLPIPE: Implemented StaticANIObject::countMovements()
3c77ad17af FULLPIPE: Implement FullpipeEngine::initCursors()
d8cca2357e FULLPIPE: Moved debug code to loadAllScenes()
795a926744 FULLPIPE: Unstubbed loadGam() and CGameLoader()
8cceaae590 FULLPIPE: Implement StaticANIObject::draw()
56cb6bbd45 FULLPIPE: Implemented CGameLoader::gotoScene()
f22f7a8682 FULLPIPE: Removed all garbage from constants list and added include guards
eeec3a79cb FULLPIPE: Renamed gameobj.h to constants.h
274f7d1737 FULLPIPE: Implement stubs for ModalObject
1c75ebcca9 FULLPIPE: main loop stub
856eb1b0fa FULLPIPE: Implemented FullpipeEngine::updateScreen()
6e64897e72 FULLPIPE: Rename some CGameLoader members
633a0fcd86 FULLPIPE: Fix scene loading
9232315880 FULLPIPE: Fix CGameVar::addSubVar()
c78803db2d FULLPIPE: Unstubbed ExCommand::handleMessage()
da7ef00173 FULLPIPE: Implement MessageQueue::sendNextCommand()
ce0af03a4a FULLPIPE: Implement Movement::initStatics()
766c5552fe FULLPIPE: Implement Movement::gotoLastFrame() and Movement::setDynamicPhaseIndex()
35fbf39448 FULLPIPE: Implement Movement::gotoNextFrame()
ab190d2f0b FULLPIPE: Fix Movement::gotoLastFrame()
7257d8804b FULLPIPE: Implement CGameLoader::applyPicAniInfos()
6d92638e7f FULLPIPE: Fixed scene object sorting
8a84a1133f FULLPIPE: Implement copy constructor for StaticANIObject
133a77887f FULLPIPE: Started work on intro
ea91b8f799 FULLPIPE: Initial code for SC_1
1d55aa0c6e FULLPIPE: Attempt to fix crash on SC_1 startup. Domino is missing
3b86b149ed FULLPIPE: Added missing file
a80f934640 FULLPIPE: Implemented main event handler
d866e2aabf FULLPIPE: First phase of StaticANIObject::update() implementation
1ca1a5dfa0 FULLPIPE: Implement MessageQueue::chain()
60ca9f74ac FULLPIPE: Fix bug with lost picture palettes
cee12678dc FULLPIPE: Implement sceneHandler01()
c12ea8bd2b FULLPIPE: Implement global_messageHandler1()
f90371ebce FULLPIPE: Implement global_messageHandler4() and startAnim()
687d0624e5 FULLPIPE: Fix stupid bug with not processed messages
13059906c5 FULLPIPE: Rename base class variables to avoid ambigiuity
3cacf6486d FULLPIPE: Implement BehaviorManager::updateBehaviors()
db290e9b0c FULLPIPE: Implement BehaviorManager::initBehavior()
682eb87af6 FULLPIPE: Implement BehaviorInfo::initObjectBehavior()
fce8c0f595 FULLPIPE: Implement BehaviorEntry
4db2d7e21b FULLPIPE: Fix crash
9f52e9f650 FULLPIPE: More work on behaviors. Animations start to (buggy) work.
2167968d21 FULLPIPE: Implement Movement::draw()
0945b45956 FULLPIPE: Implement StaticANIObject::stopAnim_maybe()
4db508bec1 FULLPIPE: Unstubbed Picture::draw()
6a172694fb FULLPIPE: Implement Bitmap::reverseImage()
f9cefd02df FULLPIPE: Implement Picture::isPointInside()
5e21cefa72 FULLPIPE: Implement PictureObject::isPointInside()
f079565692 FULLPIPE: Implement global_messageHandler2()
6ba453fa2a FULLPIPE: Fix number of bugs found by Coverity
14ca32ee97 FULLPIPE: Fix mistype
625de9c9a3 FULLPIPE: Implement CInventory2::slideIn()
e08340e64d FULLPIPE: Turn noisy stub warnings into debug messages.
e826d359c9 FULLPIPE: Implement StaticANIObject::show1()
ebaf5f6b4d FULLPIPE: Bugfix StaticANIObject::stopAnim_maybe()
739c24cdd1 FULLPIPE: Implement CInventory2::addItem()
54f4a81461 FULLPIPE: Fix formatting
cba0fb54f1 FULLPIPE: Started CInventory2::rebuildItemRects() implementation
2a59b51689 FULLPIPE: Implemented CInventory2::rebuildItemRects()
87488185a8 FULLPIPE: Implement CInventory2::draw()
1261cd421d FULLPIPE: Implement CInventory2::getHoveredItem()
3e4670e6be FULLPIPE: Implement Scene::initObjectCursors()
ee18a54554 FULLPIPE: Implemented FullpipeEngine::updateCursorsCommon()
3d3ebc6ae7 FULLPIPE: Implement CInputController::setCursor()
44081e6b1e FULLPIPE: Implement InputController::drawCursor()
86aaaecc97 FULLPIPE: Unstubbed couple small functions
624309b0db FULLPIPE: Started implementation of global_messageHandler3()
d8bc218ce8 FULLPIPE: More work on global_messageHandler3()
028772d153 FULLPIPE: Finish global_messageHandler3()
b209329a1d FULLPIPE: Implemented several high level *AtPos functions
f1eb4043c2 FULLPIPE: Fix couple of Coverity defects
0daaadc604 FULLPIPE: Fixed off-screen bitmap rendering
7154d1f2cd FULLPIPE: More *AtPos functions
d8d5e2d67f FULLPIPE: Finished Picture::getPixelAtPosEx()
cac623a821 FULLPIPE: Bugfixes for StaticANIObject::startAnim()
638bd3014e FULLPIPE: Fix bugs in Movement::updateCurrDynamicPhase()
b559257358 FULLPIPE: Implement CInventory2::handleLeftClick()
f43b145ad4 FULLPIPE: Fixed several unitialized members as pointed by Coverity
11cfbe4bc5 FULLPIPE: Fixe few warnings
d6309755fc FULLPIPE: Bugfixes to StaticANIObject::update()
9abf4f6f89 FULLPIPE: Added more debug output
b457771b7d FULLPIPE: Implemented setAlpha() functions
7c3640b2b7 FULLPIPE: Some WIP debugging
0dc4914cc4 FULLPIPE: Remove redundant debug info
5c759da7a3 FULLPIPE: Fix long standing bug with animation
a522f5bc15 FULLPIPE: WIP debug output
0b43182674 FULLPIPE: Remove rdundant debug output
0bc0aa1658 FULLPIPE: Implement GlobalMessageQueueList::compact()
1b057ba346 FULLPIPE: Implement MessageQueue::finish()
eea48b4f12 FULLPIPE: Implement Shadows::initMovement()
8ffbbccbfc FULLPIPE: Bugfix shadow drawing
b3abc58675 FULLPIPE: Hid noisy stub message
0814826f12 FULLPIPE: Implement StaticANIObject::setSpeed()
ff9cd54fd1 FULLPIPE: Fix default cursor
d048446768 FULLPIPE: Implement Bitmap::isPixelHitAtPos()
8ea65ec40f FULLPIPE: Fix *AtPos() functions
f61b77e07e FULLPIPE: Implement Bitmap::isPixelHitAtPos()
6b242c0f9f FULLPIPE: Implement GameObject::canInteractAny()
39e126f3c4 FULLPIPE: Implement CInteraction::canInteract()
8b885d4c7e FULLPIPE: Make engine conditionally compilable as dynamic plugin
0f1cc86896 FULLPIPE: Use consistent include guard
7c8570d499 FULLPIPE: Remove unused class
1ed2069f86 FULLPIPE: Inherit GlobalMessageQueueList from Common::Array
e672452462 FULLPIPE: Added guard #define
f7d10b5b8f FULLPIPE: Turn Sc2Array into typedef
a5800dfe1a FULLPIPE: Fixed compiler warning
0b88635ef4 FULLPIPE: Fix const'ness
c55862a378 FULLPIPE: Fix const'ness
af91d2a5ce FULLPIPE: Whitespace fix
6226b5862d FULLPIPE: Replace goto usage
ec650efb47 FULLPIPE: Fix mouse event handling
940c686858 FULLPIPE: Implement CInteraction::isOverlapping()
747e70a38e FULLPIPE: Implement CInteractionController::handleInteraction()
55e88c9e43 Merge pull request #388 from sev-/fullpipe


Commit: caa5c44e46734b2a9f7ada1685cc4b39184a1124
    https://github.com/scummvm/scummvm/commit/caa5c44e46734b2a9f7ada1685cc4b39184a1124
Author: johndoe123 (john_doe at techie.com)
Date: 2013-09-04T01:53:13-07:00

Commit Message:
FULLPIPE: Add gameobj.h from the German version

Changed paths:
  A engines/fullpipe/gameobj.h



diff --git a/engines/fullpipe/gameobj.h b/engines/fullpipe/gameobj.h
new file mode 100644
index 0000000..54a3f85
--- /dev/null
+++ b/engines/fullpipe/gameobj.h
@@ -0,0 +1,5095 @@
+#define PIC_MAP_H09 5365
+#define PIC_SC19_RTRUBA31 5320
+#define PIC_SC7_LTRUBA 709
+#define PIC_SC5_RTRUBA1 664
+#define MV_MOM_JUMPFW 661
+#define PIC_SC8_RTRUBA 736
+#define PIC_CSR_LIFT 5176
+#define SC_FINAL4 2460
+#define SND_FIN_009 5081
+#define MV_FNHED_LOOK 5046
+#define ANI_FN3_HEAD 5042
+#define QU_SC32_TRYKUBIK 4981
+#define QU_BRD16_STARTBEARDED 4948
+#define MV_BRDCMN_TURN_RL 4946
+#define SND_CMN_064 4933
+#define PIC_CSR_ARCADE8 4911
+#define SND_22_034 4866
+#define PIC_INV_SWAB_C 4854
+#define PIC_INV_GLASSES_C 4839
+#define PIC_INV_BOARD_C 4824
+#define PIC_INV_COIN_H 4794
+#define PIC_INV_CARPET 1875
+#define MSG_RESTARTGAME 4767
+#define rMV_BRDCMN_FLYAWAY 4740
+#define SND_30_015 4710
+#define MV_EGTR_MD1_SHOW 4694
+#define MV_EGTR_SLIMSHOW 4693
+#define MV_CPT35_NORM 4593
+#define ST_BTN27_NORM 4581
+#define MV_SCK26_NORM 4554
+#define ANI_SOCK_26 4553
+#define SND_34_033 4493
+#define SND_34_022 4482
+#define SND_34_011 4471
+#define SND_33_012 4449
+#define SND_31_003 4381
+#define MV_VNT34_NORM 4308
+#define MV_MAN34_TURNVENT_R 2500
+#define MV_MAN32_PIPETOTUBE 4298
+#define MSG_SC28_ENDLIFT1 4259
+#define MV_MAN25_TRYHAND 4217
+#define MV_MAN_LOOKLADDER_RRV 4212
+#define SND_27_040 4141
+#define SND_25_020 4073
+#define SND_21_024 3978
+#define SND_21_013 3967
+#define SND_21_002 3951
+#define SND_13_032 3777
+#define SND_13_021 3766
+#define SND_12_011 3731
+#define SND_10_013 3679
+#define SND_10_002 3663
+#define SND_7_017 3597
+#define SND_7_006 3586
+#define SND_6_029 3568
+#define SND_6_018 3557
+#define SND_6_007 3544
+#define SND_CMN_031 3516
+#define QU_DRP25_TOFLOOR 3502
+#define MV_MAN25_TRYSPADE 3497
+#define QU_SC28_WORKINSIDE 3449
+#define MV_WMN28_IN_2 3445
+#define QU_MAN_DEF_SHOES1 3380
+#define MV_MAN_STARTSHOES_1 3373
+#define ST_BTH_1 3365
+#define MV_MAN_TURN_SRL 1081
+#define MSG_SC13_CLOSEFAST 1267
+#define MV_CDI_SHOWEYE 3309
+#define QU_GRL_LAUGH_POPA 3281
+#define QU_KZW14_TOEDGE 3272
+#define MSG_SC14_SHOWBALLGMAHIT2 3245
+#define QU_SC5_SND5 3244
+#define QU_SC4_SND4 3238
+#define QU_SC3_SND3 3232
+#define QU_SC2_SND1 3225
+#define SND_4_009 3124
+#define QU_STR_TURNL_L 3058
+#define QU_MID11_LOOK 3033
+#define ANI_CLOCK_8 2989
+#define QU_SC38_SHOWBOTTLE_ONTABLE 2838
+#define ST_LBN_6P 2769
+#define ST_LBN_4N 2762
+#define MV_LBN_2 2755
+#define MV_GRT9_FALL 2720
+#define MV_PTI25_NORM 2674
+#define PIC_SC33_TUMBA 2619
+#define PIC_SC33_LTRUBA 2618
+#define QU_SC35_SHOWHOSE 2519
+#define ST_CTS34_GROWN2 2474
+#define ST_CTS34_EMPTY 2383
+#define MV_DMN38_NORM4 2252
+#define ANI_PORTER 2082
+#define PIC_SC29_RTRUBA 2079
+#define QU_DRV_FROMRIGHT 2037
+#define QU_DRV_LOOKRIGHT2 2035
+#define QU_DRV_STOPDRIVE 2031
+#define ANI_BITA 2026
+#define MV_MID_SWAB2 2024
+#define QU_SC26_OPEN4 1941
+#define MV_MAN25_TOTRUBA 1884
+#define PIC_SC25_LADDERUP 1854
+#define ST_LUK23_CLOSED 1815
+#define QU_SC22_HANDLEDOWN 1804
+#define MV_MAN23_PUSH2 1725
+#define MV_GRFU_STARTKISS 1680
+#define QU_GRFU_STARTCHMOK 1669
+#define QU_GRFB_TAILUP 1644
+#define PIC_SCD_20 1622
+#define PIC_SC21_LADDER 1555
+#define MV_CDI_HIDEEMPTY 1541
+#define MV_MAN18_STANDKRESLO 1500
+#define MV_BOY18_JUMPFROM 1478
+#define QU_SMG_FILLBOTTLE 1433
+#define MSG_SC17_SHOWSUGAR 1416
+#define QU_SC17_SHOWSUGAR 1415
+#define ANI_INV_SUGAR 1410
+#define MSG_SC13_STARTWHIRLGIG 1388
+#define ST_GRL_EMPTY 1336
+#define MV_GRD2_LOOKRIGHT 1285
+#define MV_MAN15_TRIESOFF 1273
+#define QU_SC13_OPENBRIDGE 1213
+#define MV_MAN13_TAKEGUM 1208
+#define ST_MAN11_STARTJUMP 1130
+#define MSG_SC2_SHOWLADDER 1027
+#define MV_MAN6_PUSHBUTTON 1016
+#define MV_GLT_EAT 930
+#define ST_BLK_CLOSED 912
+#define MSG_SC8_GETHIMUP 789
+#define MV_BTT_CHESHET 752
+#define MV_BTT_LOOKMAN_SPOON 750
+#define MSG_STARTHAND 612
+#define ST_HND_EMPTY 603
+#define MV_CLK_CLOSE 594
+#define MSG_TESTKZWFLIGHT 570
+#define MSG_CLICKPLANK 549
+#define MSG_TESTPLANK 538
+#define MV_MAN_TURN_DL 492
+#define MV_MAN_TURN_UL 488
+#define MV_EGBR_SIGH 377
+#define MV_EGTR_FAT2SORROW 354
+#define MV_DYAS_CLOSEBOX 310
+#define MV_DYAS_FROMUS 313
+#define MV_EGTR_SLAPPIN 347
+#define MV_EGTR_SLAPPING 348
+#define MV_EGBR_RAISEHEAD 380
+#define MV_KZW_FROMHOLE 496
+#define QU_KZW_JUMPBOTTLE1 580
+#define MV_OTM_HANDLEUP 621
+#define QU_SC5_ENTER 637
+#define QU_SC6_TAKEBALL 681
+#define TrubaRight 696
+#define QU_BTT_LOOKMAN2 761
+#define MV_MAN8_HANDSUP 777
+#define MV_HGN_MORG 812
+#define ANI_INV_BOOT 881
+#define ANI_VISUNCHIK 904
+#define MV_NDV_LOOKBACK 951
+#define QU_GLT_BREATHE 960
+#define ANI_PACHKA 975
+#define PIC_INV_MENU 991
+#define MV_STR_NOSE 1182
+#define QU_STR_SHOW 1185
+#define QU_SC17_ENTER_UP 1326
+#define MV_JTI_FLOWIN 1394
+#define ANI_INV_BOTTLEFULL 1421
+#define QU_HND_TAKE2 1442
+#define MV_HND17_FIGA 1449
+#define PIC_SC19_RTRUBA1 1513
+#define PIC_SC16_LADDER 1523
+#define MSG_SC18_MANCLIMBEDDOWN 1540
+#define MV_GFA_SWING 1595
+#define QU_GFA_CHESHET 1608
+#define QU_GFA_STOPSOCK 1617
+#define MV_GRFU_TURN_LU 1646
+#define PIC_SC1_UTRUBA2 1696
+#define MV_CND_2_3 1708
+#define MSG_SC23_CLICKBTN3 1738
+#define MV_MAN21_COINTOBROOM 1773
+#define PIC_SC22_WALL 1797
+#define MSG_SC22_ONSTOOL 1798
+#define PIC_SC24_DTRUBA 1824
+#define PIC_SC24_UTRUBA 1829
+#define ANI_SHOOTER2 2111
+#define ST_DMN38_NORM 2202
+#define QU_DLD_DENY 2218
+#define QU_MLS_BLINK 2222
+#define MV_CTS_GROWMAN 2271
+#define MV_CTS_SHRINK 2272
+#define PIC_INV_PIPE 2321
+#define MV_LEG_POT2_OUT 2370
+#define MSG_SC32_SPIN 2405
+#define QU_SC35_ENTER_DOWN 2409
+#define MV_MAN32_POUR 2413
+#define MV_GMA20_STD_LOOK 2437
+#define QU_GMA20_STL_LOOK 2446
+#define QU_SC31_ENTER_RIGHT 2454
+#define MV_MAN34_PUTBOX 2483
+#define MV_BRD34_0_1 2510
+#define MV_PDV_NRM_BLINK 2525
+#define QU_PDV_CUT_BLINK 2528
+#define QU_SC37_ENTER_RIGHT 2565
+#define PIC_SCD_31 2566
+#define ANI_GUARD3 2577
+#define PIC_SC37_WALL2 2601
+#define ST_DMN01_default 2617
+#define ST_SCR36_NORM 2649
+#define MV_TSTG_FLOW 2663
+#define ANI_BOOTS_11 2704
+#define PIC_SC31_FLOOR 2712
+#define ST_TBE33_NORM 2717
+#define MV_DMN3_NORM 2733
+#define QU_SC32_EXITLIFT 2828
+#define MV_MOM_STANDUP 2891
+#define MV_MAN3_GIVEBLACK_2 2915
+#define MV_EGTR_1_2 343
+#define QU_CST_TRY 2875
+#define MV_BDP_SHOW 2953
+#define MV_CST_DENY_WHANDLE 2979
+#define QU_SWR_SITDOWN 3018
+#define SND_5_008 3149
+#define SND_5_019 3160
+#define SND_CMN_020 3167
+#define MV_DOMINO_18_default 3175
+#define ST_DOMINO_18_default 3176
+#define PIC_SC15_DFLOOR 3254
+#define ST_MAN_SHOES1_1 3458
+#define rMV_MAN_SNEEZE 3460
+#define QU_MAN_DEF_CLEAN 3462
+#define QU_MAN_DEF_SNEEZE_R 3465
+#define PIC_CMN_EVAL 3468
+#define MV_MAN25_ROWHAND 3482
+#define SND_8_005 3615
+#define SND_8_016 3626
+#define SND_9_004 3643
+#define SND_9_015 3659
+#define SND_11_001 3680
+#define SND_11_012 3696
+#define SND_11_023 3707
+#define SND_13_010 3755
+#define SND_20_003 3931
+#define SND_20_014 3947
+#define SND_22_001 3979
+#define SND_22_012 3995
+#define SND_23_011 4029
+#define SND_CMN_042 4035
+#define SND_24_010 4045
+#define QU_DRP24_TOWATER2 4046
+#define PIC_SC28_DARK3 4268
+#define MSG_SC28_TURNOFF_2 4277
+#define MV_CTS34_FALLEFT 4314
+#define SND_30_004 4362
+#define SND_32_002 4393
+#define SND_32_013 4409
+#define SND_32_024 4420
+#define SND_32_035 4431
+#define SND_33_001 4433
+#define SND_35_010 4508
+#define SND_35_021 4519
+#define MV_MAN34_TAKEBOX_FLOOR 4568
+#define ST_GRT38_NORM 4575
+#define PIC_MNU_SAVE_L 4630
+#define PIC_MSV_4_D 4654
+#define QU_SC28_LIFT5_START 4674
+#define PIC_SC30_EGG 4711
+#define ST_EYE_NORM 4715
+#define ST_LEG31_EMPTY 4726
+#define SND_CMN_053 4748
+#define MSG_HMRKICK_STUCCO 4765
+#define PIC_MNU_MUSICSLIDER_L 4915
+#define MV_FLY_FLY 4917
+#define QU_BRD28_GOR 4959
+#define PIC_SC12_WALL 4943
+#define ANI_FN2_HAND2 5031
+#define ST_FNHND2_NORM1 5033
+#define PIC_FN2_LEG 5035
+#define ST_FN4MAN_LAUGH 5100
+#define ANI_IN1GLASSES 5119
+#define SC_19 1143
+#define PIC_TTL_CREDITS 5172
+#define PIC_SC4_PLANK 5183
+#define MSG_DISABLESAVES 5201
+#define MSG_SC5_BGRSOUNDOFF 5315
+#define PIC_MAP_A10 5272
+#define PIC_MAP_P01 5277
+#define PIC_MAP_P12 5288
+#define ANI_BUTTON_32 5347
+#define MV_BTN32_TURNON 5348
+#define PIC_MEX_BGR 5300
+#define PIC_MAP_S20 5241
+#define PIC_MAP_S23_1 5244
+#define SND_26_020 5342
+#define MV_MAN11_JUMPFROMSWING 5209
+#define SND_30_016 5165
+#define MSG_INTR_GETUPMAN 5135
+#define MV_FNHED_EYES 5043
+#define ST_FNHND3_NORM1 5038
+#define QU_FIN1_TAKECOIN 5023
+#define SND_CMN_065 4934
+#define PIC_INV_VENT_C 4857
+#define PIC_INV_HAMMER_C 4841
+#define PIC_INV_EGGCOIN_C 4836
+#define PIC_INV_EGGBLACK_H 4798
+#define PIC_INV_BOOT_H 4788
+#define PIC_INV_COIN 861
+#define PIC_INV_BROOM 1783
+#define PIC_INV_BOX 866
+#define MV_MAN_LOOKUP 4773
+#define SND_13_033 4685
+#define ANI_CARPET_35 4592
+#define SND_35_022 4587
+#define SND_36_010 4534
+#define SND_34_023 4483
+#define SND_34_012 4472
+#define SND_34_001 4456
+#define SND_33_013 4450
+#define SND_31_004 4382
+#define SND_CMN_043 4319
+#define PIC_SC34_DTRUBA2 4311
+#define MV_TTA_STARTD 4287
+#define QU_SC28_LIFT6_START 4243
+#define ST_BAL14_GMA 4210
+#define SND_38_030 4197
+#define SND_27_041 4142
+#define SND_27_030 4131
+#define SND_25_021 4074
+#define SND_25_010 4063
+#define SND_23_001 4014
+#define SND_21_025 3972
+#define SND_21_014 3968
+#define SND_21_003 3952
+#define QU_SC19_SND1 3914
+#define SND_13_022 3767
+#define SND_12_012 3732
+#define SND_12_001 3716
+#define SND_10_003 3664
+#define SND_7_018 3598
+#define SND_7_007 3587
+#define SND_6_019 3558
+#define SND_6_008 3545
+#define SND_CMN_032 3517
+#define MSG_SC28_ENDCABIN 3456
+#define MV_WMN28_IN_3 3446
+#define MSG_SC25_STOPBEARDEDS 3424
+#define QU_SC17_FILLMUG_DROP 3415
+#define ST_BTH_2 3363
+#define MV_BTH_5_4 3358
+#define MSG_SC14_GMATOTRUBA 3249
+#define QU_SC4_SND5 3239
+#define QU_SC3_SND4 3233
+#define QU_SC2_SND2 3226
+#define QU_SC1_SND1 3220
+#define ST_GMA_SIT2 3212
+#define rMV_STR_THROWGLASSES 3202
+#define QU_SC38_SHOWBOTTLE_FULL 3173
+#define SND_CMN_010 3080
+#define QU_STR_TURNR 1186
+#define ST_HDL_LAID 3039
+#define MV_VSN_CYCLE2 2987
+#define MV_MAN8_STANDUP 2970
+#define QU_MOM_LOOKEMPTY 2948
+#define ST_LBN_5P 2766
+#define ST_LBN_3N 2759
+#define MV_LBN_3 2758
+#define ANI_GRIT_14 2724
+#define MV_NBL_DEFORM 1075
+#define MV_BDP_DROP 2686
+#define ANI_NEWBALL 1073
+#define ANI_KADKA 2670
+#define QU_SC32_FLOWG 2668
+#define MV_MAN34_TAKEBOX 2502
+#define ST_CTS34_GROWNEMPTY2 2475
+#define ST_LEG_UP1 2329
+#define PIC_SCD_32 2312
+#define ST_STR1_RIGHT 2143
+#define MV_SHR_NORM 2131
+#define ST_MAN29_RUN 2086
+#define QU_DRV_DRIVE 2030
+#define MV_MAN27_TAKEVENT 1993
+#define QU_SC26_OPEN5 1943
+#define ANI_VENT 1927
+#define QU_SC25_PUTBOARD 1896
+#define ST_LUK26_CLOSED 1870
+#define MV_WTR24_0_1 1842
+#define QU_SC22_FROMSTOOL 1800
+#define MSG_SC22_FROMSTOOL 1799
+#define PIC_SC21_WALL 1788
+#define MV_MAN23_PUSH3 1726
+#define PIC_SCD_21 1623
+#define PIC_SC19_LADDER 1538
+#define MV_CDI_HIDE 1533
+#define ST_MAN18_JUMP 1512
+#define MSG_SC18_SHOWMANJUMP 1510
+#define ST_GRL18_FLYTO 1490
+#define MV_JTI_FLOWBY 1393
+#define QU_SC16_BOYOUT 1364
+#define MSG_SC13_CHEW 1220
+#define PIC_SC8_RTRUBA_ITN 1014
+#define PIC_SCD_10 981
+#define ST_PLV_SIT 921
+#define MV_PBAR_RUN 897
+#define MV_BTT_MORG 743
+#define ANI_BATUTA 737
+#define PIC_SC3_UTRUBA 700
+#define PIC_SC4_MONETOPR 689
+#define MV_MAN_TAKEBALL 673
+#define QU_MOM_JUMPFW 670
+#define QU_SC6_ENTER 669
+#define MV_MANHDL_HANDLEUP 631
+#define MV_MAN_LOOKLADDERRV 556
+#define ANI_SPRING 542
+#define PIC_SC3_BOX 536
+#define QU_EGTR_SLIMOBLRV 528
+#define QU_DYAS_DEFAULT1 319
+#define MV_MAN_TURN_LD 490
+#define MV_MAN_TURN_LU 486
+#define ST_MAN_UP 449
+#define MV_EGBR_BRK_APPLE 385
+#define MV_DYAS_MORGOPEN 316
+#define MV_DYAS_MORGTOUS 315
+#define ST_DYAS_LIES 318
+#define ANI_MAN 322
+#define MV_EGTR_SORROW2SLIM 341
+#define MV_OTM_BOX_TURNL 436
+#define MSG_SHOOTKOZAW 557
+#define ST_KZW_SIT 560
+#define QU_KZW_JUMPBOTTLE2 583
+#define PIC_SC4_MASK 585
+#define MSG_CLICKBUTTON 609
+#define MV_OTM_BOXHANDLEUP 627
+#define QU_BTT_LOOKMAN 760
+#define MV_CST_LOOKHOLE 713
+#define MV_MAN7_HANDLE2BOX 802
+#define MV_INV_OLDAPPLE_default 393
+#define ST_SLN_POT_HOBOTUP 843
+#define QU_SLN_POT_MORG2 850
+#define MV_NDV_LOOK 949
+#define QU_GLT_OPEN 961
+#define QU_SC5_MANBUMP 1167
+#define QU_SC13_ENTER_LEFT 1191
+#define ST_HDLL_DOWN 1212
+#define QU_TEST 1056
+#define QU_SC14_ENTER_LIFTUP 1066
+#define MV_MAN14_DECLINE 1239
+#define MV_HDLL_1_2 1309
+#define MV_GRL_PULL 1338
+#define MSG_SC16_FILLMUG 1363
+#define MSG_SC17_TESTTRUBA 1458
+#define PIC_SC19_RTRUBA2 1514
+#define MV_MAN17_GIVECOIN 1557
+#define MV_INV_EGGCOIN_default 1568
+#define MV_GFA_STOP 1601
+#define MV_GFA_STOPSOCK 1602
+#define QU_GFA_GREETSOCK 1607
+#define QU_GFA_BREATHE 1610
+#define PIC_SC22_LADDERD 1632
+#define MSG_SC23_CLICKBTN4 1739
+#define ANI_CHHI 1957
+#define MV_MAN25_ONBOARD 1885
+#define MV_HDL23_DEF 1979
+#define QU_GRFM_PODMYSHA 1987
+#define MV_ASS_SHOW 2123
+#define QU_ASS_SIT 2134
+#define MV_MAN29_TOPORTER 2085
+#define ST_GLV_HAMMER 2156
+#define MV_GLV_LOOKHMR 2168
+#define ANI_MUG38 2191
+#define MV_MUG38_NORM 2192
+#define QU_DLD_TAKE1 2214
+#define MV_FFT_TUBE_START 2230
+#define MV_GLV_PROPOSE 2278
+#define MV_DMN38_NORM5 2282
+#define MV_LEG_2_3 2345
+#define PIC_INV_POTTIE 2393
+#define MSG_SC34_CLIMB 2490
+#define MV_MAN34_BOARD_FLY 2505
+#define ST_BRD34_GRANDMA 2511
+#define MV_PDV_1_2 2521
+#define QU_LUK34_CLOSE 2547
+#define PIC_SC37_RTRUBA 2562
+#define MSG_SC35_SHRINK 2570
+#define MV_GRD3_LOOKR 2582
+#define MV_GRD37_LOOKR 2594
+#define PIC_SC37_WALL3 2602
+#define ANI_MUG_33 2623
+#define ST_INV_MUGFULL_default 2635
+#define ST_TST31_NORM 2654
+#define ANI_GRIT_6 677
+#define MV_MAN13_TAKEFIRECAN 2711
+#define MV_MUG17_NORM 2738
+#define QU_SC35_ENTER_LIFTUP 2817
+#define QU_SC34_ENTER_LIFTUP 2821
+#define QU_SC32_ENTER_LIFTDOWN 2830
+#define rMV_MAN_TOTRUBAHOR2 2840
+#define MV_MAN3_GIVEBLACK_3 2916
+#define MV_PL3_FLOW 2925
+#define QU_SC4_ENTER_DOWN 2937
+#define ST_BTN6_OFF 2993
+#define ST_GUM_NORM 977
+#define SND_5_009 3150
+#define SND_CMN_021 3168
+#define PIC_SC13_LWALL 3169
+#define MV_MAN13_TAKEHAMMER 3207
+#define ANI_ROPE_15 3255
+#define PIC_SC17_PIPE2 3293
+#define MV_MAN17_TAKEBOTTLEEMPTY 3308
+#define ANI_DOMINOS 3317
+#define MV_MAN_STARTSHOES_2 3385
+#define QU_MAN_DEF_SITDOWN_R 3390
+#define QU_MAN_DEF_SHOES2 3395
+#define MV_MAN_LOOKLADDER_R 3418
+#define ST_MAN_SHOES2_1 3459
+#define SND_8_006 3616
+#define SND_8_017 3627
+#define SND_9_005 3644
+#define SND_9_016 3660
+#define SND_11_002 3681
+#define SND_11_013 3697
+#define SND_11_024 3708
+#define SND_13_011 3756
+#define SND_14_010 3792
+#define SND_16_030 3850
+#define SND_20_004 3932
+#define SND_22_002 3980
+#define SND_22_013 3996
+#define SND_23_012 3948
+#define SND_24_011 4047
+#define MV_MAN17_TAKEBOOT 4224
+#define ST_MAN_SIT_NOBOOT 4229
+#define PIC_SC28_DARK4 4269
+#define MSG_SC28_TURNOFF_3 4275
+#define SND_30_005 4363
+#define SND_32_003 4394
+#define SND_32_014 4410
+#define SND_32_025 4421
+#define SND_32_036 4432
+#define SND_33_002 4434
+#define SND_35_011 4509
+#define SND_34_034 4614
+#define PIC_MNU_AUTHORS_L 4624
+#define PIC_MSV_5_D 4655
+#define MV_EYE30_HIDE 4718
+#define ANI_LEG_31 4723
+#define MV_BRD_STARTR 4733
+#define SND_CMN_054 4762
+#define SND_20_015 4888
+#define PIC_CSR_GOFAR_L 4895
+#define PIC_SCD_FIN 5026
+#define MV_FNHND2_MOVE 5032
+#define ST_FNHND2_NORM2 5034
+#define MV_FNHND6_MOVE2 5068
+#define ST_IN1MAN_LOOK 5118
+#define ST_IN1MAN_GONE 5125
+#define ST_IN2BOOT_EMPTY 5143
+#define MSG_SC32_TRUBATOBACK 5181
+#define PIC_MNU_SLIDER_D 4913
+#define MSG_SC33_TESTMUG 5185
+#define MSG_MANSHADOWSOFF 5196
+#define SND_22_035 5211
+#define PIC_SC5_RTRUBA2 665
+#define PIC_MAP_A11 5273
+#define PIC_MAP_P02 5278
+#define PIC_MAP_P13 5289
+#define PIC_INV_MAP 5324
+#define MSG_SC28_LIFT6MUSIC 5355
+#define MSG_FN4_STARTMUSIC 5356
+#define PIC_MSV_BGR 4634
+#define PIC_MAP_S10 5232
+#define PIC_MAP_S21 5242
+#define PIC_MAP_S23_2 5245
+#define PIC_SC3_LADDER 1102
+#define PIC_SC19_REACTOR 1498
+#define SND_INTR_010 5155
+#define QU_INTR_STARTINTRO 5133
+#define ST_IN1CLK_CLOSED 5128
+#define MSG_SC31_TESTCACTUS 5095
+#define QU_FN3_SHOWKICKING 5074
+#define QU_FN2_DOFINAL 5066
+#define ANI_FN3_HAND3 5036
+#define ST_MANFIN1_RIGHT 5021
+#define MSG_SC16_LAUGHSOUND 4993
+#define rMV_BBL_GOR 4926
+#define MV_BBL_GOR 4924
+#define PIC_INV_SCISSORS_C 4850
+#define PIC_INV_EGGBOOT_C 4835
+#define PIC_INV_POT_H 4813
+#define PIC_INV_BOOT 863
+#define MV_DRP25_TOWATER 3503
+#define SND_13_034 4686
+#define MV_PDV_LEGS 4589
+#define SND_35_023 4588
+#define SND_36_011 4535
+#define SND_34_024 4484
+#define SND_34_013 4473
+#define SND_34_002 4457
+#define SND_33_014 4451
+#define SND_31_005 4383
+#define SND_CMN_044 4320
+#define MV_MAN34_TRYTABUR 2489
+#define QU_KDK_DRIZZLE 4301
+#define ST_MAN28_SIT 4253
+#define SND_38_031 4198
+#define SND_38_020 4187
+#define SND_27_031 4132
+#define SND_27_020 4121
+#define SND_25_022 4075
+#define SND_25_011 4064
+#define SND_23_002 4015
+#define SND_21_026 3974
+#define SND_21_015 3969
+#define SND_21_004 3953
+#define QU_SC19_SND2 3915
+#define QU_SC18_SND1 3901
+#define SND_15_010 3812
+#define SND_13_023 3768
+#define SND_12_013 3733
+#define SND_12_002 3717
+#define SND_10_004 3665
+#define SND_7_019 3599
+#define SND_7_008 3588
+#define SND_CMN_033 3554
+#define SND_6_009 3546
+#define PIC_CMN_EXIT 3467
+#define MV_WMN28_IN_4 3447
+#define ANI_WOMAN_28 3439
+#define QU_SC25_BEARDED2 3426
+#define MV_MAN_SMILE 3416
+#define SND_CMN_022 3404
+#define QU_SC27_SHOWBET 3368
+#define ST_BTH_3 3361
+#define ST_VNT27_LIES 3355
+#define MV_MAN16_TRYBOTTLE 3305
+#define QU_SC19_ENTER_DOWNRIGHT 3300
+#define MV_KZW14_TOEDGE 3265
+#define QU_SC3_SND5 3234
+#define QU_SC2_SND3 3227
+#define QU_SC1_SND2 3221
+#define ST_BAL14_NORM2 3215
+#define MV_BAL14_TOGMA 3214
+#define SND_CMN_011 3081
+#define QU_SC13_CLOSEFAIL 3063
+#define rMV_STR_HIDE 3055
+#define QU_STR_RTOL 3053
+#define ANI_MAID_11 3024
+#define MSG_SC11_PUTBOOT 1117
+#define MSG_SC4_DROPBOTTLE 2896
+#define QU_SC15_ENTER_LIFTUP 2813
+#define QU_SC10_EXITLIFT 2809
+#define ST_LBN_4P 2763
+#define MV_LBN_4 2761
+#define ST_LBN_2N 2756
+#define PIC_SCD_33 2636
+#define MV_BRD34_1_2 2573
+#define MV_MAN34_BOARD_FLY2 2572
+#define QU_SC34_FROMBOX 2494
+#define MV_CTS34_0_1 2387
+#define ANI_CACTUS_34 2381
+#define ST_LEG_EMPTY 2338
+#define ST_LEG_UP2 2333
+#define PIC_SC32_UTRUBA 2293
+#define MV_MAN38_TAKEHAMMER 2289
+#define MV_DMN38_NORM6 2284
+#define MV_MAN29_PUSHASS 2145
+#define ST_STR2_RIGHT 2144
+#define QU_SC29_ENTER_LEFT 2078
+#define QU_MID_SWITCHBACK 2044
+#define QU_DRV_FROMLEFT2 2038
+#define ST_INV_VENT_default 1970
+#define MV_MAN25_BACKTOLADDER 1954
+#define QU_SC25_ENTERUP_WATER 1895
+#define MV_MAN25_PUTBOARD 1878
+#define ST_LUK26_NOHANDLE 1869
+#define QU_SC25_ENTER_UP 1860
+#define MV_HDL22_FALL 1760
+#define MV_MAN23_PUSH4 1727
+#define QU_GRFU_CHMOKLEFT 1667
+#define MV_GRFB_TAILUP 1640
+#define MV_GRFB_TRYSTAND 1634
+#define ANI_GIRAFFE_BOTTOM 1633
+#define PIC_SCD_22 1624
+#define QU_GRD_LOOKLEFT 1001
+#define ST_GRD_SIT2 1525
+#define ST_INV_SUGAR_default 1412
+#define MV_INV_SUGAR_default 1411
+#define ANI_SAMOGONSHCHIK 1397
+#define QU_SC16_GIRLOUT 1365
+#define MSG_SC16_HIDEMUG 1351
+#define MSG_SC16_SHOWWIRE 1350
+#define ST_BOY_STAND 1331
+#define QU_GMS_DRYG_BOOTLESS 1276
+#define ST_BAL14_MAIN 1248
+#define ST_HDLR_UP 1198
+#define ST_SWR_SITBALD 1153
+#define ANI_SC2_BOX 1020
+#define MV_MAN12_POT2BOOT 983
+#define ST_GLT_OPEN 928
+#define MV_GLT_BREATHE 925
+#define QU_SLN_POT_TURN 851
+#define MSG_SC7_CLOSELUKE 822
+#define ST_BTT_NOSPOON 739
+#define ST_CST_HEADUP 717
+#define TrubaUp 680
+#define PIC_SC6_UTRUBA 668
+#define MV_CLK_HAND 592
+#define ST_MAN_LOOKPLANK 555
+#define QU_DYAS_DEFAULT2 471
+#define ST_MAN_GOD 480
+#define ST_MAN_GOU 459
+#define MV_OTM_GLS_TURNR 422
+#define MV_EGBR_BRK_COIN 389
+#define MV_EGTR_SORROW2FAT 356
+#define MV_OTM_BOX_MORGRIGHT 439
+#define MV_KZW_TOPLANK 497
+#define QU_KZW_WALKBOTTLE 578
+#define PIC_SC4_ULTRUBA 615
+#define ST_HDL_DOWN 625
+#define MV_MANOTM_BOX2GLASSES 628
+#define QU_OTM_VNT_TRIESOFF 648
+#define MV_BRD_DROPBALLROT 695
+#define MV_LUK_0_1 804
+#define ST_LUK_CLOSED 805
+#define MV_CST_CLOSELUKE 807
+#define MV_INV_BOOT_default 882
+#define PIC_SC2_DFLOOR 891
+#define QU_GRD_MORG 1004
+#define MV_MAN6_SPINHANDLE 1008
+#define ANI_SC4_COIN 690
+#define MV_MAN_TAKECOIN 1031
+#define MV_SLN_0_1 834
+#define LiftUp 1057
+#define PIC_SCD_11 1098
+#define MV_MAN11_SWING_0 1109
+#define ST_MAN_SIT 1164
+#define MV_STR_CHEW 1177
+#define PIC_SC15_LTRUBA 1261
+#define PIC_SC16_RTRUBA 1293
+#define MV_HDL_1_2 1308
+#define MV_INV_MUG_default 1371
+#define QU_SMG_STOPFINGERS 1408
+#define QU_SC17_FILLBOTTLE 1437
+#define QU_HND_TAKEBOTTLE 1443
+#define ST_HND17_EMPTY 1448
+#define QU_SC18_ENTER_WHIRLIGIG 1469
+#define PIC_SC19_RTRUBA3 1515
+#define QU_CDI_DRYG 1536
+#define MSG_SC3_TESTFAT 1582
+#define QU_GFA_GREET 1606
+#define QU_SC22_ENTER_LEFT 1618
+#define QU_SC23_ENTER_DOWN 1630
+#define ST_CND_0 1704
+#define MV_CND_3_4 1710
+#define MV_INV_BROOM_default 1775
+#define ST_INV_BROOM_default 1776
+#define QU_SC22_FALLBROOM 1786
+#define PIC_SC24_PIPE 1828
+#define MV_MAN_FROMTRUBAVER2_R 1849
+#define ANI_BOARD25 1898
+#define QU_SC25_TRUBATOBOARD 1909
+#define PIC_INV_LOPAT 1924
+#define ST_CHI_EMPTY 1959
+#define MV_MAN27_BROOMTOSWAB 1992
+#define ST_BTA_HILITE 2052
+#define QU_SC29_MANTO_R 2100
+#define MV_SHR_HITASS 2152
+#define ANI_DYLDA 2169
+#define ST_MLS_LEFT 2179
+#define MV_MLS_TURNLR 2181
+#define MV_MAN38_TAKEBOTTLE 2184
+#define QU_SC38_SHOWMUG 2198
+#define QU_GLV_TOSMALL_NOHMR 2209
+#define QU_GLV_DRINK 2210
+#define QU_DLD_TAKE2 2215
+#define QU_MLS_TURNL 2220
+#define ST_FFT_TUBE 2231
+#define ST_FFT_TUBEOPEN 2236
+#define MV_CTS_GROW 2268
+#define QU_FFT_PIPE_CYCLE 2297
+#define QU_FFT_TUBE_FLOW 2304
+#define PIC_SC35_FLOOR 2407
+#define ST_HZE_NORM 2426
+#define MV_CTS34_EYES 2478
+#define MV_BRD34_RIGHT 2507
+#define MSG_SC35_PLUGHOSE 2524
+#define ST_LUK34_CLOSED 2543
+#define MV_PDV_SML_BLINK 2551
+#define PIC_SC35_DTRUBA_L 2558
+#define QU_GRD3_LOOKR 2587
+#define PIC_SC31_WALL 2603
+#define ANI_TESTO_BLUE 2659
+#define MV_MAN6_TAKEBALL 2691
+#define ST_GRT6_GRIT 2693
+#define MV_JET17_FLOW 2747
+#define MSG_SC4_MANFROMBOTTLE 2854
+#define QU_EGTR_MD1_BOLTLEGS 2877
+#define MV_MAN_PLANKTOLADDER 553
+#define MV_MAN3_GIVEBLACK_4 2917
+#define MV_EGTR_2_3 351
+#define ST_STP8_3 2980
+#define ST_BALL9_NORM 2973
+#define ST_PCH2_NORM 3021
+#define MV_SLN_POT_DENY 3040
+#define MV_MAN38_TRYTAKEBOTTLE 3178
+#define MV_HDLL_1_3 3204
+#define rMV_MAN_STARTSHOES_1 3382
+#define rMV_MAN_STOPSHOES_1 3384
+#define MV_MAN17_GIVEBOOT 3432
+#define ST_GRFU_KISSOPEN 3475
+#define MV_GRFU_CLOSEEYES 3476
+#define ST_DRP26_NORM2 3483
+#define SND_8_007 3617
+#define SND_8_018 3628
+#define SND_9_006 3650
+#define SND_9_017 3661
+#define SND_11_003 3682
+#define SND_11_014 3698
+#define SND_11_025 3709
+#define SND_13_012 3757
+#define SND_14_011 3793
+#define SND_16_020 3840
+#define SND_16_031 3851
+#define SND_17_030 3894
+#define SND_20_005 3933
+#define SND_22_003 3981
+#define SND_22_014 3997
+#define SND_22_025 4008
+#define SND_23_013 3949
+#define SND_24_001 4003
+#define SND_24_012 4048
+#define SND_26_010 4091
+#define MV_BOT17_FILL 4221
+#define ST_BOT17_NORM 4222
+#define ST_MAN25_ROW2 4235
+#define ST_MAN_TEMPPP 4236
+#define PIC_SC28_DARK5 4270
+#define MSG_SC28_TURNOFF_4 4282
+#define QU_SC29_SND1 4335
+#define SND_30_006 4369
+#define MV_MAN30_ITCHSWAB 4373
+#define SND_32_004 4395
+#define SND_32_015 4411
+#define SND_32_026 4422
+#define SND_33_003 4435
+#define SND_35_001 4494
+#define SND_35_012 4510
+#define ANI_CARPET_36 4600
+#define SND_34_035 4615
+#define PIC_MLD_OK_L 4647
+#define PIC_MSV_6_D 4656
+#define SND_32_037 3560
+#define QU_EYE30_HIDE 4722
+#define SND_CMN_055 4763
+#define SND_CMN_066 4966
+#define PIC_FN2_BODY 5027
+#define ST_FNHND6_BEFORE2 5069
+#define MSG_ENABLESAVES 5202
+#define PIC_SC23_BOXOPEN 1723
+#define SND_22_036 5304
+#define PIC_MAP_A01 5263
+#define PIC_MAP_A12 5274
+#define PIC_MAP_P03 5279
+#define PIC_MAP_P14 5290
+#define MV_MAN35_CUTPIPE 2514
+#define PIC_MAP_S11 5233
+#define PIC_MAP_S22 5243
+#define PIC_MAP_S33 5257
+#define MV_MOM_TAKE1 2885
+#define ST_MAP_NORM 5323
+#define ANI_INV_MAP 5321
+#define PIC_MEX_OK 5301
+#define PIC_SC6_LADDER 1104
+#define MV_MOM_CYCLEBK 3012
+#define QU_SC16_MANDRINK 5200
+#define ST_PBAR_START2 5178
+#define MV_MAN30_ITCHSPADE 5164
+#define SND_INTR_011 5156
+#define ANI_IN1CLOCK 5126
+#define ANI_IN1HAND 5113
+#define ST_FNHND6_BEFORE3 5057
+#define ANI_FN3_HAND4 5048
+#define ANI_FIN1_MAN 5019
+#define ANI_FIN_COIN 5014
+#define SND_29_030 4879
+#define SND_13_035 4871
+#define SND_21_027 4867
+#define PIC_INV_EGGDOM_C 4837
+#define PIC_INV_APPLE_C 4823
+#define PIC_INV_STOOL_H 4817
+#define PIC_INV_EGGGLS_H 4801
+#define PIC_INV_EGGAPL_H 4797
+#define PIC_INV_EGG_H 4796
+#define rMV_MAN_LOOKUP 4775
+#define SND_CMN_056 4772
+#define MV_MAN_LOOKSTUCCO 4771
+#define SND_15_011 4754
+#define MV_BRD_FALL 4731
+#define SND_36_012 4606
+#define QU_PDV_LRG_LEGS 4591
+#define SND_35_024 4590
+#define QU_SC34_FROMBOX_FLOOR 4572
+#define SND_36_001 4520
+#define SND_34_025 4485
+#define SND_34_014 4474
+#define SND_34_003 4458
+#define MV_MAN33_TAKEMUGEMPTY 4452
+#define SND_28_020 4329
+#define SND_CMN_045 4321
+#define MV_LEG_POT0_DENY 4283
+#define QU_SC28_LIFT1_WORK 4256
+#define MSG_SC21_UPDATEASS 4211
+#define SND_9_018 4200
+#define SND_38_032 4199
+#define SND_38_021 4188
+#define SND_38_010 4175
+#define SND_27_032 4133
+#define SND_27_021 4122
+#define SND_27_010 4111
+#define SND_25_023 4076
+#define SND_25_012 4065
+#define SND_25_001 4049
+#define SND_23_003 4016
+#define SND_21_016 3970
+#define SND_21_005 3954
+#define QU_SC19_SND3 3916
+#define QU_SC18_SND2 3902
+#define PIC_SC38_ROPE 3859
+#define SND_13_024 3769
+#define SND_13_013 3758
+#define SND_12_014 3734
+#define SND_12_003 3718
+#define SND_10_005 3666
+#define SND_7_009 3589
+#define SND_CMN_034 3555
+#define QU_SC25_TRYROWHAND 3493
+#define MV_WMN28_IN_5 3448
+#define QU_SC25_BEARDED3 3427
+#define SND_CMN_023 3405
+#define MV_MAN_SHOES1 3375
+#define MSG_SC27_SHOWNEXTBET 3369
+#define ST_BTH_4 3359
+#define MV_KZW14_TOUS 3267
+#define QU_SC2_SND4 3228
+#define QU_SC1_SND3 3222
+#define ST_BAL14_NORM3 3216
+#define QU_GLV_TAKEDOMINO_NOHMR 3182
+#define SND_CMN_012 3082
+#define SND_CMN_001 2927
+#define MV_MAN8_JUMPOFF 2969
+#define ANI_PLUSMINUS 2938
+#define PIC_SC1_OSK2 2932
+#define MV_KZW_JUMPHIT 2857
+#define MV_MAN4_FROMBOTTLE 2849
+#define MV_LBN_5 2764
+#define ST_LBN_3P 2760
+#define ST_LBN_1N 2753
+#define MV_MAN2_TRYBOX 2736
+#define ST_GRT14_NORM 2726
+#define ST_MAN6_BALL 2688
+#define QU_SC35_SHOWSTOPPER 2520
+#define QU_SC32_SHOWHANDLE 2399
+#define MV_FLG_STARTL 2258
+#define MV_FLG_CYCLER 2266
+#define MV_LEG_POT2_SHOW 2332
+#define MSG_SC38_PROPOSE 2287
+#define ST_SHG_NORM 2118
+#define ST_MAN29_SIT 2089
+#define ST_DRV_LEFTNOVENT 2000
+#define QU_SC25_TRYSWAB 1913
+#define ANI_INV_BOARD 1872
+#define ANI_LUK26 1867
+#define LadderDown 1851
+#define PIC_SC22_DTRUBA2 1810
+#define MV_MAN22_STANDTABUR 1750
+#define ANI_INV_SOCK 1698
+#define QU_GRFG_SHOW 1683
+#define PIC_SCD_23 1625
+#define ST_CDI_SUGAR 1532
+#define MV_MAN19_TAKESUGAR 1528
+#define MV_MAN18_JUMPTOTRUBA 1511
+#define MV_BOY18_JUMPTO 1481
+#define ST_SMG_HANDSUP 1403
+#define QU_MOM_START 1389
+#define MV_WHR13_SPIN 1384
+#define MSG_SC14_SHOWBALLMAN 1254
+#define ANI_INV_GUM2 1204
+#define ST_GLT_EMPTY 1070
+#define MV_MAN_LIFTFROMU 1061
+#define MV_MAN_LIFTFROMD 1060
+#define ANI_HDL6 1009
+#define MV_MAN_FROMVTRUBA 966
+#define ST_BALL9_default 935
+#define ST_SLN_POT 835
+#define QU_SC8_FINISH 788
+#define PIC_SC8_LADDER_D 755
+#define MV_CST_SPINHANDLE 714
+#define ANI_INV_BOX 890
+#define PIC_SC4_DOWNTRUBA 619
+#define MV_BTN_CLICK 599
+#define ST_CLK_OPEN 591
+#define MV_CLK_GO 589
+#define MSG_SHAKEBOTTLE 584
+#define ST_SPR_DOWN 545
+#define MV_PNK_WEIGHTLEFT 541
+#define QU_KOZAW_WALK 505
+#define QU_DYAS_DEFAULT3 514
+#define QU_SC1_EGBRHEADDOWN 513
+#define rMV_EGBR_SIGH 464
+#define MV_EGBR_BRK_BOOT 384
+#define MV_EGTR_TAKEMONEY 352
+#define MV_EGTR_FATBOLTLEGS 374
+#define MV_MANDYAS_GIVESGLAS 363
+#define MV_MANEGBR_EGG2APPLE 444
+#define MV_MAN_TURN_RL 332
+#define QU_KZW_GOOUT 567
+#define QU_OTM_GLS_TURNL 641
+#define QU_OTM_BOX_MORGR 643
+#define MV_MAN_TAKESBALL 674
+#define QU_SC1_ENTER_RIGHT 702
+#define QU_CST_TURNDOWN 724
+#define ANI_VMYATS 764
+#define MV_MAN8_DRYGDOWN 770
+#define MV_MAN8_STARTJUMP 779
+#define ST_HGN_LUKE 810
+#define PIC_SCD_12 857
+#define PIC_SC9_DTRUBA 902
+#define MV_VSN_TURNLEFT 953
+#define MV_GRD_MORG1 1000
+#define MV_MAN_TAKEBOOT 1034
+#define ANI_SC4_BOOT 1035
+#define MV_LFT_OPEN 1048
+#define MV_MAN_TURN_SDR 1085
+#define MV_MAN_TURN_SUR 1088
+#define MV_MAN11_SWING_1 1111
+#define MSG_SC13_UPDATEBRIDGE 1217
+#define QU_SC14_ENTER_LIFTDOWN 1068
+#define MSG_SC14_MANKICKBALL 1257
+#define MV_GMS_DRYGNOBOOT 1268
+#define PIC_SC18_LTRUBA 1320
+#define QU_SC16_GOBOY 1347
+#define QU_SC16_GOGIRL 1348
+#define QU_SC16_BOYDRINK 1353
+#define QU_SC16_BOYKICK 1367
+#define ST_GRL_LAUGH 1342
+#define MV_BDG_CLOSE 1382
+#define MV_MAN17_TAKEBOTTLE 1427
+#define QU_HND17_TOCYCLE 1454
+#define QU_CDI_SHOW 1535
+#define PIC_INV_EGGDOM 1576
+#define MV_GFA_0_1 1605
+#define MV_GRFU_BLINKLEFT 1651
+#define MV_GRFU_STOP 1655
+#define ST_CND_1 1705
+#define QU_SC23_TOCALENDAR 1733
+#define QU_SC25_SHOWBOARD_L 1907
+#define MSG_SC26_UPDATEPOOL 1956
+#define MV_PTR_MOVEFAST 2102
+#define ST_STR1_EMPTY 2115
+#define QU_ASS_SIT_R 2136
+#define MV_SHG_HITASS 2151
+#define MV_GLV_PUTDOMIN 2157
+#define ST_GLV_NOHAMMER 2159
+#define MV_HMR38_NORM 2195
+#define MV_FFT_TUBE_FLOWOPEN 2237
+#define MV_FFT_STARTPIPE 2239
+#define MSG_SC38_POSTHMRKICK 2256
+#define QU_GLV_PROPOSE_NOHMR 2281
+#define ANI_INV_TUBE 2314
+#define MV_RHT_BLINK 2361
+#define PIC_SCD_34 2389
+#define MV_POTTIE_default 2391
+#define MV_HDL32_FALL 2395
+#define MSG_SC32_STARTCACTUS 2414
+#define ST_PDV_SMALL 2420
+#define QU_CTS34_EYES 2384
+#define MV_LUK34_CLOSE 2545
+#define ANI_DMN01 2615
+#define QU_SC33_SHOWMUG 2631
+#define QU_TST_FLOW 2655
+#define ANI_TESTO_ORANGE 2656
+#define MV_MAN17_TAKEMUG 2744
+#define MV_MAN_TOLADDER 448
+#define QU_SC6_DROPS2 2905
+#define MV_MAN3_GIVECOIN_2 2931
+#define MV_MAN4_LOOKINBOTTLE 2935
+#define rMV_MAN_HMRKICK_COINLESS 2965
+#define MV_STP8_FALL 2972
+#define PIC_SC9_UTRUBA 2985
+#define MV_VSN_FROMLEFT 1015
+#define QU_VSN_FROMR 3000
+#define QU_SC11_MANFALL 3017
+#define MSG_SC8_ENTERUP 3037
+#define ANI_DOMINO_18 3174
+#define MSG_SC38_TRYTAKEBOTTLE 3179
+#define QU_DRP7_DROP 3188
+#define MV_BTT_LOOK_SPOON 3194
+#define QU_RPE_NORM 3258
+#define MV_JET17_DROP 3291
+#define QU_JET17_FLOW 3294
+#define MSG_SC19_UPDATESUGAR 3315
+#define QU_SC22_TOSTOOL_R 3332
+#define rMV_MAN_STARTSHOES_2 3398
+#define rMV_MAN_STOPSHOES_2 3400
+#define rMV_MAN_CLEANNOSE 3461
+#define QU_GRFU_KISSOPEN 3480
+#define SND_8_008 3618
+#define SND_8_019 3629
+#define SND_9_007 3651
+#define SND_11_004 3683
+#define SND_11_015 3699
+#define SND_11_026 3710
+#define SND_13_002 3742
+#define SND_14_001 3778
+#define SND_14_012 3794
+#define SND_16_010 3830
+#define SND_16_021 3841
+#define SND_16_032 3852
+#define QU_SC17_SND1 3865
+#define SND_17_020 3884
+#define SND_17_031 3895
+#define SND_20_006 3939
+#define SND_22_004 3982
+#define SND_22_015 3998
+#define SND_22_026 4009
+#define SND_24_002 4004
+#define SND_26_011 4092
+#define QU_SC28_SND1 4148
+#define ANI_SHD_01 4202
+#define PIC_SC28_DARK6 4271
+#define PIC_SC32_LADDER 4296
+#define QU_SC29_SND2 4336
+#define SND_30_007 4370
+#define SND_31_006 4389
+#define SND_32_005 4396
+#define SND_32_016 4412
+#define SND_32_027 4423
+#define SND_33_004 4436
+#define SND_35_002 4495
+#define SND_35_013 4511
+#define MV_MAN34_PUTBOX_FLOOR 4567
+#define MV_MAN34_FROMBOX_FLOOR 4570
+#define ANI_GRIT_38 4573
+#define MV_MID_CLEANVENT 4582
+#define SND_34_036 4616
+#define PIC_MNU_DEBUG_L 4632
+#define PIC_MSV_7_D 4657
+#define MSG_HMRKICK_METAL 4764
+#define ST_FLY_FLY 4918
+#define QU_GLV28_GOL 4958
+#define SND_CMN_067 4967
+#define SND_32_038 4996
+#define SND_FINAL1_001 5007
+#define MV_FN4MAN_LAUGH 5101
+#define MV_IN1MAN_GETUP 5117
+#define PIC_MSV_DOT_D 5188
+#define SND_23_014 5193
+#define MSG_MANSHADOWSON 5197
+#define MV_MAN_LOOKUP_EYES 5206
+#define SND_22_037 5305
+#define PIC_MAP_A02 5264
+#define PIC_MAP_A13 5275
+#define PIC_MAP_P04 5280
+#define PIC_MAP_P15 5291
+#define PIC_MAP_S01 5223
+#define PIC_MAP_S12 5234
+#define PIC_MAP_S34 5258
+#define PIC_MAP_S02 5224
+#define QU_SC32_FALLHANDLE 5351
+#define MV_HDL_FALL 2396
+#define SND_17_032 5212
+#define SND_21_028 5192
+#define PIC_SC18_DOMIN 5184
+#define SND_INTR_012 5157
+#define SND_INTR_001 5146
+#define QU_INTR_CLOCK 5137
+#define PIC_IN1_LADDER 5102
+#define ST_FNHND6_BEFORE 5058
+#define ANI_FN2_HAND6 5056
+#define ANI_FN3_HAND5 5052
+#define ST_FNHND3_HMR 5041
+#define ST_MANFIN1_EMPTY 5022
+#define SND_29_031 4880
+#define SND_25_024 4872
+#define SND_CMN_057 4868
+#define PIC_INV_LOPAT_C 4844
+#define PIC_INV_BOX_C 4828
+#define PIC_INV_VANTUZ_H 4821
+#define PIC_INV_TUBE_H 4820
+#define PIC_INV_SOCK_H 4816
+#define PIC_INV_GUM2_H 4804
+#define QU_MAN_DEF_LOOKUP_R 4777
+#define PIC_SC27_HITZONE2 4756
+#define rMV_BRD_STARTR 4738
+#define SND_38_033 4729
+#define PIC_MSV_0_L 4644
+#define PIC_MSV_FULL_L 4642
+#define SND_36_013 4607
+#define MSG_SC34_CLIMBBOX 4571
+#define MSG_SC4_HIDEBOOT 4563
+#define SND_37_001 4536
+#define SND_36_002 4521
+#define SND_34_026 4486
+#define SND_34_015 4475
+#define SND_34_004 4459
+#define SND_29_020 4354
+#define SND_CMN_046 4322
+#define QU_SC28_LIFT1_END 4257
+#define SND_9_019 4201
+#define SND_38_022 4189
+#define SND_38_011 4176
+#define QU_SC38_SND1 4166
+#define SND_27_033 4134
+#define SND_27_022 4123
+#define SND_27_011 4112
+#define QU_SC27_SND1 4102
+#define SND_25_013 4066
+#define SND_25_002 4050
+#define SND_23_004 4017
+#define SND_21_017 3971
+#define SND_21_006 3960
+#define QU_SC19_SND4 3917
+#define QU_SC18_SND3 3903
+#define SND_15_001 3798
+#define SND_13_025 3770
+#define SND_13_014 3759
+#define SND_12_015 3735
+#define SND_12_004 3719
+#define SND_10_006 3672
+#define SND_2_020 3514
+#define SND_1_010 3511
+#define QU_DRP24_TOFLOOR 3510
+#define QU_SC28_WMN_START 3452
+#define SND_CMN_024 3406
+#define ST_TEST 3367
+#define ST_BTH_5 3357
+#define MV_SPK4_PLAY 3276
+#define QU_KZW14_TOUS 3273
+#define QU_SC2_SND5 3229
+#define QU_SC1_SND4 3223
+#define SND_CMN_013 3112
+#define SND_CMN_002 2928
+#define rMV_STR_NOSE 3052
+#define MSG_SC13_TESTOPEN 3048
+#define PIC_SC10_FLOOR 3001
+#define ST_LBN_0N 2832
+#define MV_LBN_6 2767
+#define ST_LBN_2P 2757
+#define MV_EGBR_DENY 2735
+#define ANI_GRIT_9 2719
+#define MV_TEST2 2684
+#define ST_BRD34_GRANDMA2 2574
+#define MV_MAN34_FROMBOX 2493
+#define MV_CTS34_HIDE 2476
+#define MV_CTS34_GROW 2382
+#define MV_LEG_POT1_SHOW 2328
+#define MV_MAN32_SITDOWN 2276
+#define QU_SC38_SHOWDMN_DLD1 2254
+#define PIC_SC38_UTRUBA 2171
+#define QU_SC29_MANFROM_R 2104
+#define MV_DRV_TOLEFT_V 2007
+#define MV_MAN26_TURNVENT_R 1932
+#define MV_MAN25_CHIH 1886
+#define QU_SC26_ENTER_LEFT 1866
+#define PIC_SC26_LTRUBA 1864
+#define MV_MAN22_TAKEBROOM 1753
+#define MV_INV_SOCK_default 1699
+#define PIC_SC21_HDLBASE 1635
+#define QU_GRFG_BLINKBALD 1684
+#define QU_GRFB_DANGLE 1643
+#define MV_GRFB_TAIL 1636
+#define rMV_MANEGBR_EGG2APPLE 465
+#define MV_GRD_LOOKRIGHT 1527
+#define MV_GRD_LOOKLEFT 1526
+#define MV_KSL_0_1 1466
+#define ST_WR16_DEFAULT 1346
+#define MSG_SC17_HIDESUGAR 1417
+#define QU_SMG_FINGERS 1407
+#define ST_SMG_SIT 1399
+#define MSG_SC13_STOPWHIRLGIG 1387
+#define MSG_SC16_SHOWMUG 1352
+#define MV_GRL_GOOUT 1340
+#define ANI_BOY 1327
+#define ANI_WHIRLGIG_19 1302
+#define MSG_SC14_SHOWBALLGMADIVE 1260
+#define MSG_SC14_GMAJUMP 1250
+#define PIC_SC14_DTRUBA 1222
+#define MV_MAN11_JUMPOVER 1131
+#define QU_SC10_ENTER_LIFTDOWN 1063
+#define QU_SC10_ENTER_LEFT 989
+#define MSG_SC9_EATBALL 941
+#define MSG_SC5_HIDEHANDLE 917
+#define MV_BLK_CLOSE 911
+#define SC_TEST 903
+#define MV_SLN_POT_TURN 632
+#define SC_INV 858
+#define QU_SC12_ENTER_RIGHT 856
+#define ST_SLN_BOOT 830
+#define MSG_SC7_HIDELUKE 821
+#define MV_BTT_LOOKMAN 738
+#define MV_BTT_ZANIUKH 742
+#define PIC_SCD_1 727
+#define QU_SC7_ENTER_RIGHT 721
+#define QU_SC7_ENTER_LEFT 720
+#define ANI_CORNERSITTER 711
+#define MSG_SC6_TAKEBALL 682
+#define ST_INV_BOX_default 892
+#define ANI_BUTTON 598
+#define MV_KZW_TOHOLERV 537
+#define QU_EFTR_FATTOSORROW 530
+#define MV_MAN_TOTRUBAVER2 519
+#define ST_MAN_1PIX 518
+#define QU_DYAS_DEFAULT4 515
+#define QU_SC1_EGBRSIGH 510
+#define PIC_SC3_RTRUBA 414
+#define MV_EGBR_BRK_DOMINO 388
+#define ST_EGBR_HEADLOWER 378
+#define MV_EGTR_SLIMBOLTLEGS 335
+#define PIC_SC2_LTRUBA 411
+#define MV_MANEGTR_GIVESEGGSLIM 418
+#define MV_OTM_BOX_MORGLEFT 427
+#define ST_OTM_BOX_RIGHT 430
+#define ST_KZW_FRONT 573
+#define MV_KZW_GOEDGE 575
+#define QU_OTM_GLS_MORGRIGHT 640
+#define QU_SC4_ENTER_RIGHT 707
+#define ST_MAN8_FLYUP 769
+#define MV_MAN8_HANDSDOWN 772
+#define MV_BRD_PICKBALL 692
+#define MV_INV_OLDGLASSES_default 403
+#define PIC_INV_OLDEGG 370
+#define MV_INV_OLDCOIN_default 390
+#define ANI_INV_OLDCOIN 386
+#define MV_SLN_POT_TURNBACK 634
+#define ST_VSN_NORMAL 906
+#define ST_VSN_RIGHT 956
+#define QU_VSN_DRYG 958
+#define PIC_SC6_CLKAXIS 1006
+#define MV_MAN_FROMTRUBAVER2 1024
+#define MV_SC4_COIN_default 1029
+#define PIC_SC4_HOLE 1038
+#define MSG_SC2_LADDERCLICK 1101
+#define MSG_SC8_HIDELADDER_D 1107
+#define MV_MAN11_SWING_2 1112
+#define MV_MAN11_JUMPONSWING 1125
+#define PIC_SCD_13 1195
+#define MV_GMA_TOTRUBA 1234
+#define MV_BAL14_SPIN 1247
+#define QU_SC15_ENTER_RIGHT 1274
+#define ST_WHR19_SPIN 1318
+#define PIC_SC18_RTRUBA2 1322
+#define ST_BDG_CLOSED 1380
+#define ST_INV_BOTTLEFULL_default 1423
+#define QU_SC16_TAKEMUG 1435
+#define MV_BTL_FILL 1430
+#define MV_HND17_CYCLE 1452
+#define MSG_SC18_SHOWMANJUMPTO 1508
+#define QU_SC18_ENTER_RIGHT 1521
+#define ST_HND17_ASK 1559
+#define MV_INV_EGGAPL_default 1565
+#define MV_GFA_BREATHE 1589
+#define ST_GFA_SITSOCK 1592
+#define ST_GFA_SWINGSOCK 1598
+#define QU_SC22_ENTER_UP 1619
+#define ST_CND_2 1707
+#define MV_CND_4_5 1712
+#define MV_CND_9_0 1722
+#define PIC_SCD_24 1845
+#define MV_MAN24_TAKEBOARD 1876
+#define ANI_INV_SWAB 1917
+#define MV_CHI_HIDE 1961
+#define ST_BTA_EMPTY 2050
+#define ST_SHR_EMPTY 2150
+#define MV_MAN29_HIT 2088
+#define QU_DLD_BLINK 2216
+#define QU_FFT_PIPE_LOOKFLAG 2302
+#define PIC_SCD_35 2412
+#define MV_GMA20_FLR_LOOK 2430
+#define MV_GMA20_STD_BLINK 2435
+#define ANI_STOOL_20 2463
+#define MV_CTS_CYCLEDOWN 2470
+#define MSG_SC22_SHOWSTOOL 2495
+#define MV_BOX34_MAIN 2499
+#define MV_MAN1_TAKEDOMINO 2614
+#define QU_SC33_STARTWATER 2644
+#define ST_HZE_CUT 2678
+#define MV_POT_9 2698
+#define ST_BTS11_2 2707
+#define QU_SC14_EXITLIFT 1226
+#define QU_SC34_ENTERLIFT 2819
+#define ST_EGTR_MID1 2863
+#define MV_MOM_TAKE2 2886
+#define MSG_SC6_JUMPFW 2901
+#define MSG_SC6_RESTORESCROLL 2906
+#define ST_DRP3_NORM2 2923
+#define MV_MAN3_GIVECOIN_3 2930
+#define MSG_SC31_PULL 2944
+#define QU_SC6_DROPS3 2955
+#define ANI_NADUVTAIL 3023
+#define PIC_SC11_LADDER 3038
+#define QU_BTT_CLOCK 3195
+#define ST_BAL14_NORM4 3219
+#define MSG_SC14_HIDEPINK 3248
+#define QU_JET17_DROP 3295
+#define ST_BTL_FULL2 3307
+#define MV_MAN_SHOES2 3387
+#define SND_8_009 3619
+#define SND_9_008 3652
+#define SND_11_005 3684
+#define SND_11_016 3700
+#define SND_11_027 3711
+#define SND_13_003 3743
+#define SND_14_002 3779
+#define SND_14_013 3795
+#define QU_SC16_SND1 3821
+#define SND_16_011 3831
+#define SND_16_022 3842
+#define SND_16_033 3853
+#define QU_SC17_SND2 3866
+#define SND_17_010 3874
+#define SND_17_021 3885
+#define SND_20_007 3940
+#define SND_22_005 3983
+#define SND_22_016 3999
+#define SND_22_027 4010
+#define SND_24_003 4006
+#define SND_26_001 4077
+#define SND_26_012 4093
+#define QU_SC28_SND2 4149
+#define SND_28_010 4157
+#define MSG_SC9_TOLADDER 4206
+#define MV_MAN25_STARTROW 1880
+#define MSG_SC28_TURNOFF_6 4273
+#define QU_SC29_SND3 4337
+#define SND_30_008 4371
+#define SND_31_007 4390
+#define SND_32_006 4402
+#define SND_32_017 4413
+#define SND_32_028 4424
+#define SND_33_005 4437
+#define MV_JTI33_POURFULL 4455
+#define SND_35_003 4496
+#define SND_35_014 4512
+#define MV_BOX34_FLOOR 4564
+#define MV_GLV_DRINKBOTTLE 2164
+#define SND_35_025 4603
+#define SND_34_037 4617
+#define PIC_MSV_8_D 4658
+#define QU_TBL_GOR 4709
+#define SND_27_044 4687
+#define ST_BRDCMN_GOR 4734
+#define ST_BOT15_NORM 4781
+#define MV_LUK26_HIT 4889
+#define PIC_CSR_GOR 4898
+#define rMV_BRDCMN_STOPR 4945
+#define MSG_SC16_SHOWBEARDED 4956
+#define SND_CMN_068 4968
+#define rMV_KBK_FROMTRUBA 4973
+#define SND_13_036 4992
+#define SND_32_039 4997
+#define PIC_INTR1_RTRUBA 5002
+#define PIC_FIN1_UTRUBA 5004
+#define ST_FNFNG_AFTER 5065
+#define ST_FNG_SINGLE 5078
+#define SND_22_038 5306
+#define SND_23_015 5309
+#define PIC_MAP_A03 5265
+#define PIC_MAP_A14 5276
+#define PIC_MAP_P05 5281
+#define PIC_MAP_P16 5292
+#define SND_CMN_035 3714
+#define SND_28_021 4672
+#define PIC_MAP_S13 5235
+#define PIC_MAP_S24 5246
+#define PIC_MAP_S35 5259
+#define PIC_MAP_H30 5384
+#define PIC_MAP_S03 5225
+#define SND_13_037 5335
+#define PIC_SC26_SOCK 5312
+#define PIC_SC11_RTRUBA 1120
+#define PIC_SC3_DOMIN 5182
+#define MV_BHD_GOR 4939
+#define rMV_BHD_GOR 4941
+#define SND_INTR_013 5158
+#define ST_IN1HAND_BEFORE 5115
+#define MV_IN1HAND_DO 5114
+#define MV_FNHED_NOSE 5045
+#define ST_FNHED_NORM 5044
+#define ST_FNHND3_NORM 5039
+#define MSG_FIN_GOTO2 5024
+#define QU_SC33_TRYKUBIK 4979
+#define QU_BRD16_FLYL 4954
+#define QU_EGG6_GOL 4936
+#define ST_BBL_GOR 4925
+#define SND_25_025 4874
+#define SND_CMN_058 4869
+#define PIC_INV_MUGFULL_C 4846
+#define PIC_INV_HANDLE_C 4842
+#define PIC_INV_DOMINO_C 4832
+#define PIC_INV_CARPET_C 4830
+#define PIC_INV_SWAB_H 4819
+#define PIC_INV_GLASSES_H 4802
+#define PIC_INV_BOARD_H 4787
+#define MV_MAN_LOOKMONETOPR 4770
+#define SND_38_034 4730
+#define SND_36_014 4608
+#define ANI_BOOT_34 4560
+#define QU_SC26_SHOWSOCK 4556
+#define QU_SC37_SND1 4541
+#define SND_37_002 4537
+#define SND_36_003 4522
+#define SND_34_027 4487
+#define SND_34_016 4476
+#define SND_34_005 4460
+#define SND_33_006 4443
+#define SND_29_021 4355
+#define ST_STL34_BOX2 4305
+#define MV_TTA_GOD 4290
+#define MSG_SC28_ENDLIFT6 4244
+#define SND_38_023 4190
+#define SND_38_012 4177
+#define QU_SC38_SND2 4167
+#define SND_38_001 4161
+#define SND_27_034 4135
+#define SND_27_023 4124
+#define SND_27_012 4113
+#define QU_SC27_SND2 4103
+#define SND_27_001 4097
+#define SND_25_014 4067
+#define QU_SC25_SC3 4056
+#define SND_25_003 4051
+#define SND_21_007 3961
+#define QU_SC19_SND5 3918
+#define QU_SC18_SND4 3904
+#define QU_SC15_SND1 3803
+#define SND_15_002 3799
+#define SND_13_026 3771
+#define SND_13_015 3760
+#define SND_12_016 3736
+#define SND_12_005 3720
+#define SND_10_007 3673
+#define SND_1_011 3524
+#define SND_2_021 3515
+#define MSG_SC26_UPDATEDROP 3496
+#define QU_CHI_NORM 3485
+#define QU_WMN_SHOWBEFORE 3450
+#define ST_WMN28_EMPTY 3444
+#define MV_MUG17_FILLDROP 3412
+#define QU_MAN_DEF_STARTSHOES1 3379
+#define MV_CDI_BLINK 3311
+#define PIC_SC19_LADDER2 3301
+#define ST_GRL_POPA 3277
+#define ST_SPK4_NORM2 3113
+#define QU_SC1_SND5 3224
+#define SND_CMN_014 3138
+#define SND_2_010 3092
+#define MV_MID11_SWAB 3025
+#define ST_BOT4_LEFT 2882
+#define MV_MAN_STOPLADDER2 2845
+#define QU_SC6_ENTER_LIFTDOWN 2810
+#define QU_SC6_EXITLIFT 1055
+#define MV_LBN_9H 2806
+#define MV_LBN_7 2770
+#define ST_LBN_1P 2754
+#define ANI_BALLDROP 2685
+#define MV_MAN25_TAKEPOTTIE 2676
+#define MV_KDK_DRIZZLE 2671
+#define MV_MAN35_PLUGPIPE 2513
+#define MV_LEG_POT0_SHOW 2323
+#define QU_SC32_ENTER_RIGHT 2295
+#define PIC_SC32_RTRUBA 2292
+#define MV_FLG_STOPL 2261
+#define QU_SC38_SHOWDMN_DLD2 2255
+#define QU_SC29_ENTER_UP 2077
+#define QU_SC28_ENTER_RIGHT 2076
+#define QU_DRV_STARTDRIVE 2029
+#define ST_MID_BROOM 2022
+#define ST_DRV_RIGHTNOVENT 2002
+#define MV_DRV_TOLEFT 1998
+#define ANI_VODILLA 1994
+#define ANI_INV_VENT 1968
+#define QU_SC26_CLOSE1 1936
+#define MV_MAN25_TRYSWAB 1888
+#define PIC_SC24_PIPE2 1871
+#define QU_SC25_ENTER_RIGHT 1862
+#define ST_LUK23U_CLOSED 1819
+#define MV_LUK23U_OPEN 1818
+#define MV_LUK23_OPEN 1814
+#define QU_SC22_SHOWSACK 1792
+#define QU_SC22_SHOWSTOOL 1793
+#define MV_MSH_MOVE 1755
+#define MV_TABURETTE_default 1746
+#define PIC_INV_SOCK 1701
+#define MV_MAN2_TAKEBOX 1695
+#define ST_GRFU_KISS 1681
+#define PIC_SC22_UTRUBA 1587
+#define PIC_SC22_DTRUBA 1586
+#define MV_KSL_SWING 1460
+#define QU_GRL_LAUGH 1376
+#define ST_WHR18_SPIN 1301
+#define MV_GRD2_LOOKLEFT 1284
+#define QU_GRD2_BLINK1 1288
+#define QU_GMS_DRYG 1277
+#define ANI_BALL14 1246
+#define PIC_INV_GUM2 1207
+#define ST_INV_GUM2_default 1206
+#define MV_HDLR_0_1 1197
+#define ST_SWR_SIT 1147
+#define QU_NDV_EAT 968
+#define ANI_BIGLUK 909
+#define ANI_INV_OLDBOOT 396
+#define ST_SLN_POT_HOBOT 839
+#define MV_BTT_SLEEP 751
+#define ST_BTT_SPOON 741
+#define PIC_SCD_2 728
+#define MV_CST_TURNDOWN 719
+#define MV_CST_SPINHEADUP 716
+#define ST_CLK_CLOSED 590
+#define QU_EGTR_SORROWTOSLIM 526
+#define QU_DYAS_DEFAULT5 516
+#define MV_EGTR_BRK_BOOT 383
+#define MV_DYAS_SLEEPS 317
+#define MV_EGTR_SMOBLRV 338
+#define ANI_EGGBREAKER 376
+#define MV_MANYAS_TAKESCRATE 362
+#define ANI_KOZAWKA 495
+#define PIC_SC5_LTRUBA 636
+#define QU_SC3_ENTER_UP 706
+#define ST_MAN8_FLYDOWN 771
+#define MV_HGN_PLUU 813
+#define ST_SC7_BOX_default 793
+#define QU_SCT_LOOK 819
+#define MV_SLN_BOOT_DECLINE 832
+#define ST_INV_COIN_default 877
+#define MV_INV_GLASSES_default 888
+#define PIC_SC10_LTRUBA 972
+#define LiftDown 1058
+#define rMV_MAN_TURN_RL 1072
+#define MV_MAN11_FROMDOWN 1151
+#define MV_STR_TURNL 1173
+#define QU_STR_HIDE 1187
+#define PIC_SCD_14 1224
+#define QU_GMA_THROW 1255
+#define MV_BDG_OPEN 1379
+#define QU_SC18_ENTER_UP 1468
+#define MSG_SC18_MANCLIMBEDUP 1539
+#define ANI_INV_EGGCOIN 1567
+#define ST_INV_EGGCOIN_default 1569
+#define QU_GFA_SWINGSOCK 1615
+#define QU_DYAS_SLEEP 1690
+#define ST_CND_3 1709
+#define MV_CLN_ZHMUR 1768
+#define PIC_SCD_25 1846
+#define QU_SC25_ROWTOLADDER 1910
+#define ST_INV_SWAB_default 1919
+#define MV_GRFM_ASS 1982
+#define MV_ASS_TAIL 2121
+#define rMV_ASS_SHOW 2126
+#define ST_BTL38_NORM 2190
+#define QU_GLV_HMRKICK 2207
+#define MV_FFT_0_1 2274
+#define QU_GLV_DRINKBOTTLE 2286
+#define PIC_INV_TUBE 2320
+#define MV_MAN36_GOOUT 2367
+#define MV_MAN36_SHAKE 2368
+#define QU_SC35_ENTER_LEFT 2410
+#define ANI_HOSE 2424
+#define QU_GMA20_STL_NOSE 2447
+#define QU_GMA20_STD_BLINK 2450
+#define MV_STL20_NORM 2464
+#define QU_CTS34_BLINK 2388
+#define MV_MAN34_GOUP 2484
+#define ANI_INV_STOPPER 2535
+#define MV_LUK34_OPEN 2542
+#define PIC_SCD_36 2567
+#define MV_GRD3_PULL 2578
+#define MV_GMA22_TAKESTOOL 2610
+#define QU_SC22_FALLSACK_GMA 2613
+#define ANI_JETTIE_FLOW 2627
+#define MV_TSTB_FLOW 2660
+#define ST_TSTG_NORM 2664
+#define ST_POT_9 2699
+#define PIC_SC9_LADDER_R 2700
+#define ST_DMN3_NORM 2734
+#define MV_MAN_FROMHORTRUBA2 2846
+#define MV_MAN_FROMLADDER 493
+#define ST_EGTR_MID2 2869
+#define MV_MOM_TAKE3 2887
+#define MV_MOM_JUMPCLOSED 2892
+#define ST_INV_EGGBLACK_default 2920
+#define MV_CST_TRYCLOSE 2874
+#define QU_SC6_FALLGRIT2 2966
+#define PIC_CMN_SAVE 3034
+#define MV_GRIT2_FALL 3190
+#define ST_HDLL_HAMMER 3205
+#define MSG_SC14_SHOWBALLLAST 3246
+#define MSG_SC14_HIDEBALLLAST 3251
+#define PIC_SC18_BOARD 3296
+#define PIC_SC18_RTRUBA3 3298
+#define ST_DMS_3 3319
+#define ST_HDL_BROKEN 3342
+#define rMV_MAN_SHOES1 3383
+#define MV_DRP24_TOWATER 3506
+#define SND_9_009 3653
+#define SND_11_006 3690
+#define SND_11_017 3701
+#define SND_11_028 3712
+#define SND_13_004 3744
+#define SND_14_003 3780
+#define SND_14_014 3796
+#define SND_16_001 3816
+#define QU_SC16_SND2 3822
+#define SND_16_012 3832
+#define SND_16_023 3843
+#define SND_16_034 3854
+#define QU_SC17_SND3 3867
+#define SND_17_011 3875
+#define SND_17_022 3886
+#define SND_20_008 3941
+#define SND_22_006 3989
+#define SND_22_017 4000
+#define SND_22_028 4011
+#define SND_24_004 4007
+#define SND_26_002 4078
+#define QU_SC26_SND1 4082
+#define SND_26_013 4094
+#define QU_SC28_SND3 4150
+#define SND_28_011 4158
+#define MV_LFT28_OPEN 4239
+#define ST_LFT28_CLOSED 4240
+#define QU_MAN32_LOOKDOWN 4303
+#define QU_SC29_SND4 4338
+#define SND_29_010 4344
+#define SND_30_009 4372
+#define SND_31_008 4391
+#define SND_32_007 4403
+#define SND_32_018 4414
+#define SND_32_029 4425
+#define SND_35_004 4497
+#define SND_35_015 4513
+#define SND_3_020 4550
+#define SND_4_030 4551
+#define MSG_SC27_TAKEVENT 4584
+#define QU_SC35_FALLGRIT 4611
+#define SND_34_038 4618
+#define PIC_MNU_CONTINUE_D 4625
+#define PIC_MLD_CANCEL_L 4649
+#define PIC_MSV_9_D 4659
+#define PIC_MSV_1_L 4660
+#define SND_28_022 4673
+#define SND_CMN_047 4692
+#define ST_TBL_R 4707
+#define ST_BRDCMN_RIGHT 4732
+#define SND_35_026 4863
+#define MV_MAN11_TAKEBOOT 4884
+#define MV_GMA20_STL_DENY 4886
+#define PIC_CSR_DEFAULT 4891
+#define QU_BALL_WALKR 4919
+#define SND_CMN_069 4969
+#define QU_KBK32_START 4982
+#define SND_18_010 4994
+#define QU_FN1_ENTER_RIGHT 5005
+#define SND_FIN_030 5105
+#define MSG_FIN_ENDFINAL 5109
+#define MV_IN1GLS_NORM 5120
+#define ANI_IN2BOOT 5140
+#define SND_INTR_002 5147
+#define PIC_MSV_SPACE_L 5191
+#define SND_21_029 5213
+#define SND_17_033 4018
+#define SND_23_016 5310
+#define MSG_SC34_ONBUMP 5313
+#define PIC_MAP_A04 5266
+#define PIC_MAP_P06 5282
+#define PIC_MAP_P17 5293
+#define PIC_CSR_MAP 5339
+#define SND_CMN_025 3407
+#define SND_CMN_036 3715
+#define PIC_MOV_BGR 5343
+#define PIC_MAP_S14 5236
+#define PIC_MAP_S25 5247
+#define PIC_MAP_S36 5260
+#define PIC_MAP_H31 5385
+#define PIC_MAP_H20 5374
+#define PIC_MAP_S04 5226
+#define MSG_SC3_ONTAKECOIN 5338
+#define PIC_CSR_HELPERBGR 5331
+#define SC_30 2064
+#define SND_INTR_014 5159
+#define SND_INTR_003 5148
+#define ST_CLK1_CYCLE 5129
+#define SND_FIN_020 5092
+#define MSG_FIN_GOTO3 5071
+#define MV_FCN_FALL 5015
+#define SND_25_026 4875
+#define SND_CMN_059 4873
+#define PIC_INV_LEVERHANDLE_C 4843
+#define PIC_INV_BROOM_C 4829
+#define PIC_INV_BOTTLE_C 4826
+#define PIC_INV_VENT_H 4822
+#define PIC_INV_HAMMER_H 4805
+#define PIC_INV_EGGCOIN_H 4800
+#define QU_SC29_BRD1 4741
+#define SND_CMN_048 4702
+#define QU_EGTR_MD2_SHOW 4698
+#define SND_3_021 4696
+#define SND_28_023 4683
+#define MSG_SC28_TURNON_0 4677
+#define ANI_BUTTON_27 4579
+#define QU_SC37_SND2 4542
+#define SND_37_003 4538
+#define QU_SC36_SND1 4525
+#define SND_36_004 4523
+#define SND_34_028 4488
+#define SND_34_017 4477
+#define SND_34_006 4466
+#define SND_33_007 4444
+#define SND_29_022 4356
+#define ANI_TIOTIA 4286
+#define MSG_SC28_LIFT1_SHOWAFTER 4261
+#define ST_MAN28_WASH 4250
+#define QU_SC25_MANLOOKUP 4213
+#define SND_38_024 4191
+#define QU_SC38_HMRKICK 4180
+#define SND_38_013 4178
+#define QU_SC38_SND3 4168
+#define SND_38_002 4162
+#define SND_27_035 4136
+#define SND_27_024 4125
+#define SND_27_013 4114
+#define QU_SC27_SND3 4104
+#define SND_27_002 4098
+#define SND_25_015 4068
+#define QU_SC25_SND1 4054
+#define SND_25_004 4052
+#define SND_23_006 4024
+#define SND_21_019 3973
+#define SND_21_008 3962
+#define SND_19_010 3923
+#define QU_SC18_SND5 3905
+#define QU_SC15_SND2 3804
+#define SND_15_003 3800
+#define SND_13_027 3772
+#define SND_13_016 3761
+#define SND_12_017 3737
+#define SND_12_006 3726
+#define SND_10_008 3674
+#define SND_1_012 3525
+#define SND_2_022 3518
+#define MV_MAN27_SPADE2SWAB 3486
+#define MSG_SC17_DROP 3414
+#define QU_SC27_RESTARTBETS 3370
+#define QU_SC22_TRYHANDLE 1802
+#define ANI_SPEAKER_4 3275
+#define SND_CMN_015 3139
+#define SND_4_020 3135
+#define SND_3_010 3109
+#define SND_2_011 3093
+#define SND_CMN_004 3074
+#define QU_SC13_CLOSESUCCESS 3062
+#define QU_STR_TURNR_L 3059
+#define QU_SC13_OPENFAIL 3042
+#define QU_MOM_OPENEYE 2949
+#define MSG_SC6_ENABLEDROPS 687
+#define PIC_SC4_LBTRUBA 2884
+#define MV_MAN17_TAKEFIRECAN 2859
+#define ST_LBN_0P 2833
+#define QU_SC15_ENTERLIFT 2811
+#define ST_LBN_9H 2807
+#define MV_LBN_8H 2804
+#define MV_LBN_8 2773
+#define QU_SC6_FALLBALL 2690
+#define MV_SPR_NORM 2516
+#define ST_LEG_DOWN1 2330
+#define ANI_LEG 2322
+#define ST_FLG_LEFT 2260
+#define PIC_SC38_TABLE 2206
+#define MV_MAN29_BEND 2091
+#define PIC_SC29_LTRUBA 2081
+#define QU_MID_BROOM 2046
+#define QU_MID_LOOK 2045
+#define MV_MID_SWITCH 2020
+#define ST_MID_SWAB2 2019
+#define QU_SC26_CLOSE2 1938
+#define MV_WTR25_FLOW 1857
+#define PIC_SC25_UTRUBA 1852
+#define MV_JET24_FLOW 1838
+#define QU_SC23_STARTKISS 1822
+#define QU_GRFU_KISS 1821
+#define QU_SC22_PUTSTOOL 1803
+#define MV_MAN22_TAKEHANDLE 1752
+#define ST_TABURETTE_default 1747
+#define QU_GRFU_STOPCHMOK 1671
+#define QU_GRFU_BLINKDOWN 1668
+#define PIC_SC22_LADDER 1585
+#define ST_KSL_JUMPMAN 1505
+#define ST_GRL18_FLYFROM 1486
+#define ANI_GIRL18 1484
+#define MV_KSL_1_2 1467
+#define MV_MAN16_TAKEMUG 1362
+#define MV_BOY_PULL 1332
+#define MV_GMA_JUMPFW 1230
+#define MV_MAN13_PUTGUM 1203
+#define ST_HDLR_GUM 1201
+#define MV_SWR_SWING 1114
+#define MSG_SC3_UTRUBACLICK 1103
+#define MV_MAN_STOPLADDERD 458
+#define MSG_SC10_HIDEGUM 993
+#define MSG_SC5_SHOWHANDLE 918
+#define MSG_SC5_TESTLUK 914
+#define MV_BLK_OPEN 910
+#define PIC_INV_OLDCOIN 406
+#define ST_INV_EGG_default 871
+#define ANI_INV_APPLE 878
+#define QU_SLN_POT_MOVEBACK 854
+#define MV_SLN_BOOT_KICK 828
+#define MV_BTT_EAT 740
+#define PIC_SCD_3 729
+#define ST_CST_WHANDLE 715
+#define PIC_SC1_UTRUBA 699
+#define MSG_CLICKBOTTLE 569
+#define ST_PNK_WEIGHTRIGHT 504
+#define ST_SPR_UP 544
+#define QU_EGTR_FATSLAP 529
+#define MV_MAN_TURN_DR 491
+#define MV_MAN_TURN_UR 487
+#define MV_MAN_FROMHORTRUBA 475
+#define ST_OTM_GLS_LEFT 421
+#define MV_EGBR_KACHAET 381
+#define MV_EGTR_FATOBLRV 373
+#define MV_EGTR_SLIMTRAIN 342
+#define MV_OTM_BOXDEFAULT 431
+#define MV_MAN_TOTRUBAHOR 445
+#define ST_KZW_RIGHT 559
+#define QU_KZW_WALKBOTTLE2 579
+#define QU_SC4_CLOSECLOCK 597
+#define PIC_SC4_LRTRUBA 616
+#define MV_OTM_HANDLEDOWN 620
+#define MV_OTM_BOXHANDLEDOWN 626
+#define ST_MOM_STANDS 658
+#define MV_CST_MORG 712
+#define ST_INV_OLDHANDLE_default 797
+#define PIC_INV_OLDAPPLE 409
+#define ST_PBAR_FINISH 899
+#define PIC_SC9_RTRUBA 901
+#define ST_BALL9_EMPTY 940
+#define ST_NDV_TURN 950
+#define ANI_LIFT 982
+#define MV_MAN4_TAKEAPPLE 1039
+#define ST_LFT_CLOSED 1049
+#define MV_MAN_TURN_SDU 1086
+#define MV_MAN_TURN_SUD 1089
+#define MV_MAN_STARTR 324
+#define MSG_SC6_UTRUBACLICK 1105
+#define ANI_MAN11 1108
+#define PIC_INV_GUM 1160
+#define ST_GMA_SIT 1229
+#define MV_MAN14_STEPFW 1240
+#define PIC_SCD_15 1278
+#define MV_GRD2_PULL 1280
+#define PIC_SC17_LADDER 1324
+#define PIC_INV_MUG 1373
+#define MV_HND17_FROMCYCLE 1453
+#define QU_HND17_ASK 1456
+#define MSG_SC17_UPDATEHAND 1560
+#define ST_INV_EGGAPL_default 1566
+#define ANI_INV_EGGBOOT 1570
+#define MV_INV_EGGBOOT_default 1571
+#define ST_GFA_SWING 1596
+#define MV_GFA_CHESHSOCK 1604
+#define ST_GRFG_HAIR 1677
+#define ST_CND_4 1711
+#define MV_CND_5_6 1714
+#define ST_CLN_STAND 1769
+#define ANI_INV_LEVERHANDLE 1777
+#define ST_INV_LEVERHANDLE_default 1779
+#define ANI_INV_STOOL 1780
+#define PIC_SCD_26 1847
+#define ST_BRD25_RIGHT 1900
+#define PIC_INV_SWAB 1923
+#define ST_CHI_NORM 1960
+#define QU_CHI_SHOW 1964
+#define MSG_SC29_DISABLERIDEBACK 2106
+#define QU_ASS_TAIL_R 2135
+#define ST_FFT_TUBEFLOW 2232
+#define ST_FFT_PIPEOPEN 2244
+#define PIC_SC32_HDLBASE 2400
+#define MV_MAN32_SPIN 2403
+#define ST_PDV_LARGE 2421
+#define MV_CTS34_SHRINK 2477
+#define MV_VNT34_SPIN 2480
+#define MV_MAN34_TRY 2485
+#define MV_MAN34_BOARD_BUMP 2504
+#define QU_LUK34_OPEN 2546
+#define PIC_SCD_37 2568
+#define MV_MOM_BLINK 825
+#define rMV_MAN_FROMHORTRUBA2 2847
+#define MV_EGTR_MD1_JOY 2867
+#define MV_MOM_TAKE4 2888
+#define ANI_POOL_3 2924
+#define MSG_SC1_SHOWOSK2 468
+#define MSG_SC4_HANDOVER 2960
+#define MV_GRIT1_FALL 2962
+#define QU_SWR_SITBALD 3007
+#define ST_SWR_STAND3 3014
+#define QU_SWR_STAND 3015
+#define MV_PCH_NORM 979
+#define QU_MID11_SWAB 3032
+#define SND_1_001 3041
+#define ST_MUG38_NORM2 3183
+#define ST_GRIT2_GRIT 3192
+#define ST_DMS_4 3320
+#define QU_CLN_TUZH 3327
+#define MV_MAN23_TRY 3333
+#define rMV_TABURETTE_default 3336
+#define QU_MAN_DEF_STARTSHOES2 3394
+#define rMV_MAN_SHOES2 3399
+#define ST_DRP24_EMPTY 3507
+#define SND_11_007 3691
+#define SND_11_018 3702
+#define SND_11_029 3713
+#define SND_13_005 3745
+#define SND_14_004 3781
+#define QU_SC14_SND1 3783
+#define SND_14_015 3797
+#define SND_16_002 3817
+#define QU_SC16_SND3 3823
+#define SND_16_013 3833
+#define SND_16_024 3844
+#define SND_16_035 3855
+#define SND_17_001 3860
+#define QU_SC17_SND4 3868
+#define SND_17_012 3876
+#define SND_17_023 3887
+#define SND_20_009 3942
+#define SND_22_007 3990
+#define SND_22_018 4001
+#define SND_22_029 4012
+#define SND_CMN_037 4030
+#define SND_24_005 4028
+#define SND_26_003 4079
+#define QU_SC26_SND2 4083
+#define SND_26_014 4095
+#define SND_28_001 4143
+#define QU_SC28_SND4 4151
+#define SND_28_012 4159
+#define MSG_SC25_TOLADDER 4215
+#define MV_MAN1_PUTBOOT 4230
+#define MSG_SC32_ONLADDER 2270
+#define QU_SC29_SND5 4339
+#define SND_29_011 4345
+#define SND_32_008 4404
+#define SND_32_019 4415
+#define SND_35_005 4498
+#define SND_35_016 4514
+#define MV_DRV_PUSHBUTTON 2005
+#define ST_CPT36_NORM 4602
+#define QU_SC36_SHOWCARPET 4605
+#define SND_36_015 4610
+#define SND_34_039 4619
+#define PIC_MNU_EXIT_D 4621
+#define PIC_MSV_OK_L 4636
+#define PIC_MSV_CANCEL_L 4638
+#define PIC_MSV_2_L 4661
+#define SND_31_009 4727
+#define SC_1 301
+#define PIC_CSR_DEFAULT_INV 4892
+#define QU_KBK33_START 4983
+#define SND_4_031 4988
+#define MV_FNFNG_0_1 5077
+#define SND_FIN_031 5106
+#define MSG_LIFT_STARTEXITQUEUE 5186
+#define SND_38_035 5204
+#define SND_17_034 4023
+#define PIC_MNU_RESTART_L 5299
+#define QU_SC22_TRYBOX 5311
+#define PIC_MAP_A05 5267
+#define PIC_MAP_P07 5283
+#define PIC_MAP_P18 5294
+#define SND_CMN_026 3408
+#define PIC_MAP_S15 5237
+#define PIC_MAP_S26 5248
+#define PIC_MAP_S37 5261
+#define PIC_MAP_H32 5386
+#define PIC_MAP_H21 5375
+#define PIC_MAP_H10 5366
+#define PIC_SC17_RTRUBA2 5297
+#define SND_36_016 5208
+#define ST_PBAR_FINISH2 5179
+#define SC_31 2065
+#define SND_INTR_015 5160
+#define SND_INTR_004 5149
+#define MV_IN1CLK_SHOW 5127
+#define ST_IN1MAN_SLEEP 5112
+#define PIC_FN4_LADDER 5096
+#define SND_FIN_021 5093
+#define SND_FIN_010 5082
+#define MSG_FIN_GOTO4 5075
+#define ST_FNHND5_AFTER 5055
+#define ST_FNHND4_AFTER 5051
+#define MV_FNHED_SHOWHAND 5047
+#define QU_FIN1_FALLCOIN 5018
+#define PIC_SC35_DTRUBA_R2 4986
+#define ANI_BIGBALL 4923
+#define SND_25_027 4876
+#define PIC_INV_SCISSORS_H 4815
+#define PIC_INV_EGGBOOT_H 4799
+#define rMV_MAN_LOOKMONETOPR 4774
+#define MSG_SC15_ASSDRYG 4755
+#define MV_TBE36_NORM 4750
+#define QU_SC29_BRDOUT1 4743
+#define QU_SC29_BRD2 4742
+#define rMV_BRD_FALL 4737
+#define SND_CMN_049 4703
+#define QU_EGTR_MD1_SHOW 4697
+#define MSG_SC23_HIDEGIRAFFEE 4650
+#define ST_CPT35_NORM 4594
+#define ST_BOT34_NORM 4562
+#define MV_MAN26_PUTSOCK 4557
+#define QU_SC37_SND3 4543
+#define SND_37_004 4539
+#define QU_SC36_SND2 4526
+#define SND_36_005 4524
+#define SND_34_029 4489
+#define SND_34_018 4478
+#define SND_34_007 4467
+#define SND_33_008 4445
+#define SND_29_023 4357
+#define QU_SC32_FROMLADDER 4300
+#define SND_38_025 4192
+#define SND_38_014 4179
+#define QU_SC38_SND4 4169
+#define SND_38_003 4163
+#define SND_27_036 4137
+#define SND_27_025 4126
+#define SND_27_014 4115
+#define QU_SC27_SND4 4105
+#define SND_27_003 4099
+#define SND_25_016 4069
+#define QU_SC25_SND2 4055
+#define SND_25_005 4053
+#define SND_23_007 4025
+#define SND_21_009 3963
+#define SND_19_011 3924
+#define SND_14_016 3813
+#define QU_SC15_SND3 3805
+#define SND_15_004 3801
+#define SND_13_028 3773
+#define SND_13_017 3762
+#define SND_12_018 3738
+#define SND_12_007 3727
+#define SND_10_009 3675
+#define SND_6_030 3569
+#define SND_1_013 3526
+#define SND_2_023 3520
+#define ST_DRP25_EMPTY 3501
+#define MV_MID_SPADE 3488
+#define MSG_SC25_STARTBEARDEDS 3423
+#define ST_BRDCMN_EMPTY 3422
+#define SND_CMN_027 3409
+#define ST_VNT27_LIES2 3354
+#define ST_VNT26_UP 1929
+#define rMV_MAN25_CHIH 3343
+#define MV_MAN24_TRY 3340
+#define SND_2_001 3083
+#define QU_SC18_ENTER_UPRIGHT 3302
+#define QU_SC16_SHOWBOOT 3290
+#define MV_KZW14_JUMP 3268
+#define ST_KZW14_FRONT 3264
+#define MV_KZW14_SHOW 3262
+#define MV_GMA_BACKOFF2 3217
+#define ST_BTL38_FULL 3172
+#define SND_CMN_016 3140
+#define SND_4_021 3136
+#define SND_4_010 3125
+#define SND_2_012 3094
+#define SND_CMN_005 3075
+#define SND_1_002 3066
+#define rMV_STR_TURNL 3050
+#define QU_SC13_OPENSUCCESS 3047
+#define MSG_SC7_PULL 2943
+#define MV_FCN_NORM 2861
+#define QU_SC15_ENTER_LIFTDOWN 2814
+#define ST_LBN_8H 2805
+#define MV_LBN_7H 2802
+#define LIFTBTN_1 2781
+#define MV_LBN_9 2776
+#define ST_GRT9_NORM 2721
+#define ST_BDP_NORM 2687
+#define MV_MAN34_BOARD_STAND 2548
+#define MV_MAN34_JUMPDOWN 2385
+#define ST_LEG_DOWN2 2334
+#define MV_MAN32_TUBETOPIPE 2275
+#define ANI_FLAG 2257
+#define MSG_SC29_ENABLEPORTER 2096
+#define QU_MID_SWAB2 2043
+#define MV_MID_KERN 2016
+#define MV_DRV_FROMCYCLE 2003
+#define PIC_INV_VENT 1971
+#define MSG_SC26_HIDEVENT 1945
+#define QU_SC26_CLOSE3 1940
+#define QU_SC25_TRYBROOM 1912
+#define MV_MAN25_ROW 1882
+#define QU_SC26_ENTER_UP 1865
+#define QU_WTR25_FLOW 1859
+#define MV_WTR24_FLOW 1835
+#define QU_JET24_FLOW 1841
+#define ANI_JET24 1837
+#define QU_SC21_SHOWLEVER 1789
+#define QU_GRFU_TURN_UD 1664
+#define MV_GRFB_DANGLE 1639
+#define ST_MAN18_STANDKSL 1501
+#define MV_WR16_DEFAULT 1345
+#define MV_SMG_FINGERS 1404
+#define MV_MAN16_PUTMUG 1369
+#define PIC_SC16_TUMBA 1368
+#define MV_GRL_STARTLAUGH 1341
+#define MV_GRL_DRINK 1339
+#define PIC_SCD_16 1299
+#define QU_GMA_JUMPFW 1249
+#define MV_INV_BALL_default 1243
+#define PIC_SC14_RTRUBA 1221
+#define MV_HDLR_1_2 1200
+#define PIC_SC11_LTRUBA2 1150
+#define MSG_SC11_RESTARTMAN 1133
+#define MV_MAN11_JUMPHIT 1129
+#define PIC_SC1_LADDER 1091
+#define ST_KCH_180 1097
+#define MSG_SC10_SHOWGUM 994
+#define MV_MAN12_BOOT2POT 984
+#define QU_NDV_LOOK 970
+#define ST_GLT_FLOWN 932
+#define ANI_PLEVATEL 919
+#define PIC_INV_OLDBOOT 407
+#define QU_SLN_POT_MOVE 853
+#define QU_SLN_BOOT_LOOK 848
+#define MV_SLN_POT_INOUT 845
+#define ANI_SC7_BOX 791
+#define QU_HGN_MORG 814
+#define ST_MAN8_ONLADDER 786
+#define MV_MAN8_GOODLUCK 785
+#define MSG_STARTARCADE 781
+#define PIC_SCD_4 730
+#define QU_MOM_SHAKE 672
+#define MV_HND_TAKE0 604
+#define MV_KZW_RAISEHEAD 577
+#define ST_MAN_ONPLANK 552
+#define PIC_TEST 508
+#define ST_MAN_GOLADDER 450
+#define MV_EGBR_LOWERHEAD 382
+#define ST_EGTR_SLIM 336
+#define MV_OTM_GLS_DECLINES 426
+#define MV_OTM_BOX_TURNR 428
+#define ST_OTM_BOX_LEFT 429
+#define MV_OTM_MORGLEFT 420
+#define MSG_EGGEATEN 535
+#define ANI_MAMASHA 656
+#define TrubaDown 697
+#define ST_VMT_MIN 766
+#define MV_SCT_MORG 799
+#define ANI_INV_HAMMER 884
+#define ST_NDV_SIT 946
+#define MV_MAN6_INSTHANDLE 1007
+#define MSG_SHOWCOIN 1033
+#define PIC_SC8_ARCADENOW 1043
+#define MV_LFT_CLOSE 1053
+#define MV_KCH_MAIN 1095
+#define ST_MAN11_EMPTY 1110
+#define MV_MAN11_JUMPTOSWING 1126
+#define ANI_INV_VANTUZ 1157
+#define MV_INV_VANTUZ_default 1158
+#define PIC_SC13_LTRUBA 1171
+#define ST_STR_RIGHT 1174
+#define QU_STR_NOSE 1188
+#define ANI_HANDLE_L 1209
+#define MV_GMA_BLINK 1228
+#define MV_MAN14_KICK 1237
+#define QU_SC15_ENTER_UP 1275
+#define MV_BOY_KICK 1355
+#define ANI_INV_BOTTLE 1418
+#define QU_HND17_FROMCYCLE 1457
+#define PIC_SC18_LADDER1 1471
+#define MSG_SC18_SHOWBOYJUMP 1495
+#define MV_MAN_FROMLADDERUP 1522
+#define PIC_INV_EGGCOIN 1577
+#define MV_GFA_TOSWINGSOCK 1600
+#define QU_GFA_STARTSOCK 1613
+#define MV_GRFG_SHOWHAIR 1676
+#define MV_GRFG_BLINKHAIR 1679
+#define QU_GRFU_TURN_DU 1665
+#define ST_CND_5 1713
+#define QU_SC23_FROMCALENDAR 1734
+#define QU_SC24_ENTER_DOWN 1831
+#define QU_SC24_ENTER_DOWNLADDER 1832
+#define PIC_SCD_27 1916
+#define MV_LUK23_1_2 1974
+#define ST_HDL23_DEF 1980
+#define MV_BTA_FALL 2049
+#define QU_MID_SWITCH 2042
+#define PIC_SC29_RFLOOR 2153
+#define MV_GLV_HMRKICK 2155
+#define MV_GLV_TOSMALL_NOHMR 2161
+#define MV_DLD_PUT 2174
+#define MV_MLS_TURNRL 2178
+#define MSG_SC38_DRINK 2225
+#define PIC_SCD_38 2228
+#define QU_FFT_PIPE_OPENEYE 2299
+#define QU_FFT_PIPE_BLINK 2301
+#define QU_FFT_TUBE_STOP 2308
+#define MV_INV_PIPE_default 2318
+#define QU_LEG_HIDE0 2375
+#define MV_CTS34_BLINK 2479
+#define ANI_STOOL_34 2486
+#define ANI_BOX_34 2498
+#define PIC_INV_SCISSORS 2530
+#define QU_GRD37_BLINK1 2596
+#define MV_JTI33_POUR 2630
+#define MSG_SC33_HANDLEDOWN 2643
+#define QU_SC6_SHOWNEXTBALL 2689
+#define MV_MAN33_TAKETUBE 2718
+#define ANI_MUG_17 2737
+#define QU_SC3_EXITLIFT 2808
+#define MV_EGTR_MD2_JOY 2872
+#define QU_DRP3_DROP 2876
+#define QU_EGTR_MD2_BOLTLEGS 2879
+#define MV_MOM_TAKE5 2889
+#define PIC_SC4_BOTTLE2 2936
+#define ST_GRT1_GRIT 2964
+#define ST_HDLR_DOWN_GUM 3044
+#define SND_5_020 3161
+#define ST_RPE15_NORM 3257
+#define MV_DMS_FOUR 3322
+#define MSG_SC27_HANDLERTOBACK 3372
+#define QU_MAN_DEF_SHOES1_R 3392
+#define MV_GRFM_AFTER 3473
+#define MV_GRFU_OPENEYES 3474
+#define SND_11_008 3692
+#define SND_11_019 3703
+#define QU_SC13_SND1 3746
+#define SND_13_006 3751
+#define SND_14_005 3782
+#define QU_SC14_SND2 3784
+#define SND_16_003 3818
+#define QU_SC16_SND4 3824
+#define SND_16_014 3834
+#define SND_16_025 3845
+#define SND_16_036 3856
+#define SND_17_002 3861
+#define QU_SC17_SND5 3869
+#define SND_17_013 3877
+#define SND_17_024 3888
+#define SND_22_008 3991
+#define SND_CMN_038 4031
+#define QU_SC24_SND1 4036
+#define SND_24_006 4041
+#define SND_26_004 4080
+#define QU_SC26_SND3 4084
+#define SND_26_015 4096
+#define SND_28_002 4144
+#define QU_SC28_SND5 4152
+#define SND_28_013 4160
+#define MSG_SC28_TURNON_1 4278
+#define QU_SC32_TEST1 4297
+#define QU_CTS_DEFAULT 4302
+#define SND_29_001 4330
+#define SND_29_012 4346
+#define SND_32_009 4405
+#define QU_SC35_SND1 4499
+#define SND_35_006 4504
+#define SND_35_017 4515
+#define SND_3_011 3110
+#define MV_RHT_OPEN 2365
+#define MV_RNG_OPEN 4612
+#define PIC_MNU_LOAD_L 4628
+#define PIC_MSV_3_L 4662
+#define MV_BRD28_TALK 4680
+#define MV_BRDCMN_FLYAWAY 4736
+#define ST_SHD_CMN0 4861
+#define SC_2 302
+#define QU_EGTR_SLIMSHOW 4883
+#define PIC_CSR_GOFAR_R 4896
+#define PIC_CSR_GOU 4899
+#define PIC_CSR_GOD 4900
+#define MV_KBK_GOR 4964
+#define rMV_KBK_GOR 4972
+#define SND_4_032 4989
+#define SND_3_022 4991
+#define SC_INTRO1 3896
+#define ST_FNHND1_NORM 5030
+#define SND_FIN_032 5107
+#define QU_IN2_DO 5144
+#define PIC_SCD_INTR 5163
+#define SC_20 1144
+#define MSG_SC11_SITSWINGER 5198
+#define MSG_SC20_UPDATELOCKABLE 5217
+#define ST_HZE_CUT2 5318
+#define PIC_MAP_A06 5268
+#define PIC_MAP_P08 5284
+#define ST_BTN32_ON 5350
+#define PIC_MLD_BGR 4645
+#define PIC_MAP_S05 5227
+#define PIC_MAP_S16 5238
+#define PIC_MAP_S27 5249
+#define PIC_MAP_S38 5262
+#define PIC_MAP_H33 5387
+#define PIC_MAP_H22 5376
+#define PIC_MAP_H11 5367
+#define PIC_SC4_LADDER 1438
+#define PIC_SC8_RTRUBA2 2978
+#define SC_32 2066
+#define SND_INTR_016 5161
+#define SND_INTR_005 5150
+#define SND_FIN_022 5094
+#define SND_FIN_011 5083
+#define QU_FN2_CYCLE 5067
+#define ST_FHND3_SHOT 5061
+#define ST_FNHND6_AFTER 5059
+#define ST_BHD_GOR 4940
+#define ANI_BIGHEAD 4938
+#define PIC_CSR_ARCADE2_D 4903
+#define SND_26_016 4878
+#define PIC_INV_APPLE_H 4599
+#define QU_SC29_BRDOUT2 4744
+#define MV_GLV_LOOKBOTTLE 4688
+#define MSG_SC11_MANCRY 4691
+#define ST_SCK26_NORM 4555
+#define QU_SC37_SND4 4544
+#define SND_37_005 4540
+#define SND_36_006 4530
+#define QU_SC36_SND3 4527
+#define SND_34_019 4479
+#define SND_34_008 4468
+#define QU_SC34_SND1 4461
+#define SND_33_009 4446
+#define SND_29_024 4358
+#define SND_28_014 4323
+#define MSG_SC34_FROMCACTUS 4313
+#define ST_VNT34_NORM 4309
+#define ST_TTA_GOD 4289
+#define MV_MAN25_TOTRUBA_R 4216
+#define SND_38_026 4193
+#define SND_38_015 4182
+#define QU_SC38_SND5 4170
+#define SND_38_004 4164
+#define SND_27_037 4138
+#define SND_27_026 4127
+#define SND_27_015 4116
+#define QU_SC27_SND5 4106
+#define SND_27_004 4100
+#define SND_25_017 4070
+#define SND_25_006 4059
+#define SND_23_008 4026
+#define QU_SC23_SND1 4019
+#define SND_19_012 3925
+#define SND_18_002 3897
+#define SND_14_017 3814
+#define QU_SC15_SND4 3806
+#define SND_15_005 3802
+#define SND_13_029 3774
+#define SND_13_018 3763
+#define SND_12_019 3739
+#define SND_12_008 3728
+#define QU_SC12_SND1 3721
+#define SND_6_031 3570
+#define SND_6_020 3559
+#define SND_5_021 3162
+#define SND_1_014 3527
+#define QU_GRFM_AFTER 3481
+#define MV_WMN28_GREET 3440
+#define SND_CMN_028 3410
+#define MV_MAN_SITDOWN 3378
+#define MV_VNT26_TURNR 1928
+#define SND_3_001 3100
+#define MV_GRL_FALL 3115
+#define QU_KZW14_JUMP 3271
+#define QU_KZW14_SHOW 3270
+#define QU_SC14_WINARCADE 3247
+#define MV_MAN14_KICKLAST 3218
+#define SND_4_022 3137
+#define SND_4_011 3126
+#define SND_2_013 3095
+#define SND_2_002 3084
+#define SND_CMN_006 3076
+#define SND_1_003 3067
+#define QU_STR_SHOW_L 3056
+#define MV_NTL_MOVE 3028
+#define MSG_SC10_LADDERTOBACK 3002
+#define QU_MOM4_OPENEYE 2959
+#define ST_MOM_LIFT2 2950
+#define MV_MOM_OPENEYE 2947
+#define ST_PMS_PLUS 2941
+#define MSG_SC6_STARTDROPS 2897
+#define MV_MAN_GOLADDER2 2844
+#define QU_SC30_EXITLIFT 2824
+#define ST_LBN_7H 2803
+#define MV_LBN_6H 2800
+#define LIFTBTN_2 2782
+#define ST_PTI25_NORM 2675
+#define ANI_POTTIE_25 2673
+#define QU_SC35_EATHOZE 2540
+#define MSG_SC22_HIDESTOOL 2503
+#define MSG_SPINHANDLE 2398
+#define MV_MAN34_STANDBOX 2386
+#define MSG_SC30_UPDATEPATH 2358
+#define QU_LEG_MOVE1 2349
+#define ST_LEG_DOWN3 2337
+#define MV_LEG_POTS_HIDE 2336
+#define MV_MAN32_STANDUP 2313
+#define MV_DLD_TAKE 2249
+#define PIC_SC28_DTRUBA 2074
+#define MV_BTA_NORM 2027
+#define MV_MID_0_1 2025
+#define QU_SC26_CLOSE4 1942
+#define rMV_MAN25_STOPROW 1890
+#define ST_MAN25_ONBOARD 1879
+#define MV_LUK26_0_1 1868
+#define MSG_SC25_ENTERMAN 1861
+#define LadderUp 1850
+#define ST_WTR24_FLOWLOWER 1843
+#define QU_WTR24_FLOW 1840
+#define ANI_WATER24 1834
+#define ST_HDL22_LIES 1762
+#define MV_MAN22_TAKETABUR 1749
+#define PIC_SC21_LTRUBA 1553
+#define MV_KSL_SWINGMAN 1502
+#define MV_KSL_INGIRL 1493
+#define ST_GRL18_WALKTO 1489
+#define ST_KSL_GIRL 1465
+#define ST_KSL_NORM 1461
+#define ST_BOY_EMPTY 1330
+#define ANI_GIRL 1328
+#define QU_SC19_ENTER_DOWN 1303
+#define MV_INV_FIRECAN_default 1313
+#define ANI_INV_FIRECAN 1312
+#define QU_SC18_ENTER_LEFT 1304
+#define QU_GRD2_LOOKRIGHT 1290
+#define MV_MAN15_TAKEBOOT 1272
+#define QU_SWR_SIT 1149
+#define ST_KCH_0 1096
+#define QU_SLN_POT_PLAY 1045
+#define MV_OTM_0_2 437
+#define ST_INV_POT_default 988
+#define MSG_SC9_SETSCROLL 964
+#define ANI_BALL9 933
+#define ANI_GLOTATEL 924
+#define QU_SC9_ENTER_DOWN 908
+#define MV_INV_OLDBOOT_default 397
+#define ST_INV_OLDCOIN_default 391
+#define MV_INV_BOX_default 633
+#define MV_SLN_BOOT_MORG 831
+#define MV_VMT_DEF 765
+#define MV_BTT_DRINK 749
+#define PIC_SCD_5 731
+#define MV_CST_TURNUP 718
+#define ANI_BEARDED 691
+#define MV_HND_TAKE1 605
+#define ST_KZW_JUMPOUT 587
+#define QU_SC4_MANLOOKDOWN 548
+#define QU_EGTR_SORROWTOFAT 531
+#define QU_SC1_EGBRKACH 512
+#define PIC_dsf 410
+#define ST_EGTR_FAT 344
+#define ANI_EGGEATER 334
+#define MV_DYAS_OPENBOX 307
+#define MV_MANDYAS_GIVESAPPL 360
+#define MV_OTM_VNT_TRIESOFF 435
+#define MV_MANEGBR_EGG2COIN 441
+#define ST_KZW_EMPTY 498
+#define QU_PNK_CLICK 550
+#define MV_KZW_TOEDGE 572
+#define QU_OTM_BOX_TURNL 645
+#define QU_OTM_VNT_BOLTHEAD 647
+#define ST_MAN_BALL 675
+#define rMV_MAN_FROMHORTRUBA 703
+#define QU_BTT_MORG 762
+#define ST_VMT_MAX 767
+#define MV_CST_0_2 800
+#define ST_INV_OLDHAMMER_default 401
+#define ANI_GUM 978
+#define MSG_SC6_SPINHANDLE 1013
+#define rMV_MAN_STARTR 330
+#define ANI_INV_GUM 1154
+#define QU_SC5_MANFLY 1168
+#define ST_HDLL_UP 1211
+#define ANI_GRANDMA 1227
+#define MV_GMA_BACKOFF 1233
+#define PIC_SC16_LTRUBA 1292
+#define ANI_MUG 1296
+#define PIC_SCD_17 1305
+#define PIC_SC17_RTRUBA 1323
+#define ANI_INV_MUG 1370
+#define PIC_SC17_TUMBA 1426
+#define MV_MAN17_PUTBOTTLE 1428
+#define MSG_SC17_SHOWBOTTLE 1432
+#define PIC_SC18_LADDER2 1472
+#define MV_KSL_2_3 1506
+#define QU_DYS_CLOSEBOX 1003
+#define QU_CDI_HIDE 1537
+#define QU_CDI_HIDEEMPTY 1545
+#define PIC_INV_EGGBOOT 1579
+#define MV_GFA_CHESH 1603
+#define QU_GFA_SWING 1614
+#define QU_GFA_STOP 1616
+#define MV_GRFU_TURN_DU 1649
+#define MV_GRFU_TURN_UD 1654
+#define MV_DYAS_0_1 1692
+#define MV_MAN22_TAKESOCK 1697
+#define ST_CND_6 1715
+#define MV_CND_6_7 1716
+#define MV_CLN_0_1 1770
+#define MV_MAN_TOTRUBAVER2_R 1848
+#define MV_MAN25_TRY 1877
+#define ST_LUK23_WHANDLE 1975
+#define MV_GRFM_NECK 1985
+#define MV_MAN27_SWABTOBROOM 1991
+#define PIC_SCD_28 2098
+#define MV_STR1_LEAVE 2114
+#define ST_ASS_NORM 2122
+#define ST_DMN38_NORM2 2205
+#define QU_MLS_TURNR 2221
+#define MV_GLV_PROPOSE_NOHMR 2279
+#define QU_FFT_TUBE_START 2303
+#define QU_LEG_HIDE1 2371
+#define PIC_SC35_MONETOPR 2408
+#define MV_PDV_BLINKLARGE 2422
+#define MV_PDV_PUZO 2423
+#define ST_GMA20_STAND 2436
+#define QU_GMA20_STD_LOOK 2451
+#define ST_CTS_GROWDOWN 2468
+#define PIC_INV_STOPPER 2531
+#define PIC_SC35_DTRUBA_R 2559
+#define QU_SC34_ENTER_UP 2569
+#define MV_GRD37_PULL 2589
+#define ST_MUG33_EMPTY 2625
+#define MV_JTI33_FLOW 2628
+#define ANI_TESTO_GREEN 2662
+#define MV_MAN9_TAKEPOT 2697
+#define MV_MUG17_FILL 2745
+#define QU_SC34_TOTRUBAVER 2853
+#define MSG_SC4_STARTCLOCK 2856
+#define MV_EGTR_MD1_BOLTLEGS 2864
+#define ANI_DROP_3 2873
+#define ST_MOM_STANDCLOSED 2890
+#define ST_PL3_NORM 2926
+#define MV_MAN13_THROWAPPLE 1444
+#define MV_VSN_FROMRIGHT 2996
+#define MV_MAN11_HITBY 3016
+#define QU_SC10_TAKEGUM 3026
+#define MV_HDLR_RISE_GUM 3045
+#define SND_5_010 3151
+#define SND_CMN_017 3164
+#define MV_STR_DENY 3208
+#define MV_DRP26_DROP 3346
+#define QU_MAN_DEF_SHOES2_R 3401
+#define ANI_DROP_24 3505
+#define SND_11_009 3693
+#define QU_SC13_SND2 3747
+#define SND_13_007 3752
+#define QU_SC14_SND3 3785
+#define SND_14_006 3788
+#define SND_16_004 3819
+#define QU_SC16_SND5 3825
+#define SND_16_015 3835
+#define SND_16_026 3846
+#define SND_16_037 3857
+#define SND_17_003 3862
+#define SND_17_014 3878
+#define SND_17_025 3889
+#define SND_22_009 3992
+#define SND_CMN_039 4032
+#define QU_SC24_SND2 4037
+#define SND_24_007 4042
+#define SND_26_005 4081
+#define QU_SC26_SND4 4085
+#define SND_28_003 4145
+#define MV_SHD01_SHD 4203
+#define MV_BOT1_NORM 4232
+#define MSG_SC28_TURNON_2 4276
+#define MSG_SC28_TURNON4 4280
+#define QU_CTS34_FALLEFT 4316
+#define SND_29_002 4331
+#define SND_29_013 4347
+#define QU_SC35_SND2 4500
+#define SND_35_007 4505
+#define SND_35_018 4516
+#define SND_3_012 3111
+#define PIC_MSV_EMPTY_D 4639
+#define PIC_MSV_4_L 4663
+#define PIC_MSV_DOTS_D 4670
+#define QU_BRD28_TALK 4682
+#define MSG_SC14_SCROLLLEFT 4768
+#define ANI_BOOT_15 4779
+#define ANI_SHD_CMN 4859
+#define ST_SHD_CMN1 4862
+#define SC_3 303
+#define ANI_KUBIK 4963
+#define QU_KBK33_GO 4978
+#define SND_4_033 4990
+#define SC_INTRO2 3907
+#define PIC_FN1_RTRUBA 5003
+#define MSG_INTR_SWITCHTO1 5145
+#define SC_10 653
+#define SC_21 1546
+#define SND_25_028 5173
+#define SND_3_023 5195
+#define MSG_SC19_UPDATENUMRIDES 5203
+#define PIC_MAP_A07 5269
+#define PIC_MAP_P09 5285
+#define PIC_MAP_S06 5228
+#define PIC_MAP_S17 5239
+#define PIC_MAP_S28 5250
+#define PIC_MAP_H34 5388
+#define PIC_MAP_H23 5377
+#define PIC_MAP_H12 5368
+#define PIC_MAP_H01 5357
+#define QU_SC28_LIFT6_END 3563
+#define SND_26_017 5337
+#define SND_3_024 5333
+#define MV_MOM_TOLIFT 2893
+#define MV_MOM_JUMPBK 662
+#define MSG_LIFT_EXITLIFT 5187
+#define SC_4 304
+#define SC_33 2067
+#define SND_INTR_017 5162
+#define SND_INTR_006 5151
+#define MSG_INTR_ENDINTRO 5139
+#define QU_INTR_FINISH 5138
+#define MSG_INTR_SWITCHTO2 5134
+#define MV_IN1CLK_CYCLE 5130
+#define MV_IN1MAN_SLEEP 5111
+#define SND_FIN_012 5084
+#define ST_FNHND4_BEFORE 5050
+#define MV_FNHND3_SHOWHMR 5040
+#define PIC_MNU_SLIDER_L 4912
+#define PIC_INV_SUGAR_C 4853
+#define PIC_INV_POTTIE_C 4849
+#define PIC_INV_MUG_C 4845
+#define PIC_INV_GUM_C 4840
+#define PIC_INV_BOTTLEFULL_C 4827
+#define PIC_INV_LOPAT_H 4808
+#define PIC_INV_BOX_H 4791
+#define MSG_CMN_WINARCADE 4778
+#define SND_15_006 3808
+#define SND_29_025 4689
+#define MV_RNG_CLOSE 2605
+#define MV_INV_CARPET_default 4597
+#define MV_DRV_PUSHBUTTON_NOVENT 4577
+#define SND_37_006 4546
+#define QU_SC37_SND5 4545
+#define SND_36_007 4531
+#define QU_SC36_SND4 4528
+#define SND_34_009 4469
+#define QU_SC34_SND2 4462
+#define SND_28_015 4324
+#define MV_LEG_DENY_POT1 4284
+#define MV_MAN28_STARTWASH 4248
+#define SND_38_027 4194
+#define SND_38_016 4183
+#define SND_38_005 4165
+#define SND_27_038 4139
+#define SND_27_027 4128
+#define SND_27_016 4117
+#define SND_27_005 4101
+#define SND_25_018 4071
+#define SND_25_007 4060
+#define QU_SC25_SND4 4057
+#define SND_23_009 4027
+#define QU_SC23_SND2 4020
+#define SND_19_013 3926
+#define SND_19_002 3910
+#define SND_18_003 3898
+#define SND_14_018 3815
+#define QU_SC15_SND5 3807
+#define SND_13_019 3764
+#define SND_12_009 3729
+#define QU_SC12_SND2 3722
+#define SND_7_020 3600
+#define SND_6_032 3571
+#define SND_6_010 3547
+#define SND_1_015 3528
+#define SND_3_013 3519
+#define QU_DRP25_TOWATER 3504
+#define ANI_DROP_25 3499
+#define MV_MID_0_2 3491
+#define SND_CMN_029 3469
+#define MV_WMN_AFTER 3454
+#define ST_WMN28_NORM 3441
+#define PIC_SC27_FLOOR2 3353
+#define ST_BTH_EMPTY 3351
+#define MV_MAN22_HANDLEDOWN2 3328
+#define SND_4_001 3116
+#define SND_1_004 3068
+#define QU_TEST1 3303
+#define ANI_BOOT_16 3285
+#define MV_GRL_DRYG 3279
+#define ST_KZW14_SIDE 3266
+#define PIC_SC14_GRID 3260
+#define MV_BAL14_NORM2 3213
+#define SND_4_023 3141
+#define SND_4_012 3127
+#define SND_3_002 3101
+#define SND_2_014 3096
+#define SND_2_003 3085
+#define SND_CMN_007 3077
+#define MV_MOM_STARTBK 3010
+#define MV_CLK8_GO 2990
+#define QU_MOM4_LOOKBAG 2958
+#define MV_MOM4_OPENEYE 2957
+#define MV_MOM_LIFTUP 2951
+#define MV_MAN4_FALLBOTTLE 2848
+#define MV_MAN_STARTLADDER2 2842
+#define QU_SC30_ENTERLIFT 2823
+#define QU_SC15_EXITLIFT 2812
+#define ST_LBN_6H 2801
+#define MV_LBN_5H 2798
+#define LIFTBTN_3 2783
+#define QU_SC14_BREAKGRIT 2728
+#define QU_SC32_FLOWO 2666
+#define QU_SC21_ENTER_DOWN 2646
+#define ST_HDL_PLUGGED 2397
+#define MV_FLG_STARTR 2263
+#define QU_LEG_MOVE2 2350
+#define QU_LEG_SHOW 2346
+#define MSG_SC32_TRYSIT 2294
+#define ST_DMN38_NORM3 2251
+#define ST_MAN29_SITR 2141
+#define ST_SHR_NORM 2132
+#define MSG_SC29_DISABLEPORTER 2097
+#define MSG_SC27_STARTBET 2047
+#define QU_SC26_CLOSE5 1944
+#define QU_SC27_ENTER_LEFT 1915
+#define QU_SC25_ROWTOTRUBA 1897
+#define rMV_MAN25_ROW 1891
+#define MV_MAN25_TRYBROOM 1887
+#define ST_INV_BOARD_default 1874
+#define MV_INV_BOARD_default 1873
+#define ANI_WATER25 1856
+#define PIC_SC25_RTRUBA 1853
+#define MSG_SC21_HANDLEDOWN 1807
+#define ANI_HANDLE22 1759
+#define ST_BOX2_LEFT 1694
+#define ST_GRFU_DOWN 1650
+#define QU_GRFB_TRYSTAND 1641
+#define MV_MAN18_FROMRTRUBA 1519
+#define ST_KSL_JUMPGIRL 1494
+#define ST_KSL_JUMPBOY 1492
+#define MV_GRL18_JUMPFROM 1485
+#define ST_BOY_FLYTO 1483
+#define QU_SMG_TAKESUGAR 1434
+#define PIC_INV_SUGAR 1413
+#define QU_SC16_GIRLLAUGH 1375
+#define MV_GRL_GOIN 1335
+#define MSG_SC11_SHOWSWING 1124
+#define ST_KCH_STATIC 1122
+#define QU_SC11_ENTER_LEFT 1093
+#define QU_SC10_ENTER_RIGHT 990
+#define QU_NDV_BLOW 969
+#define ST_GLT_SIT 926
+#define PIC_SC9_WALL1 923
+#define MSG_SC5_HANDLEDOWN 916
+#define ANI_INV_DOMINO 872
+#define ST_INV_BOOT_default 883
+#define ST_INV_GLASSES_default 889
+#define ANI_INV_GLASSES 887
+#define MV_SLN_POT_MOVE 842
+#define ST_SLN_POT_TURNED 838
+#define MSG_SC7_OPENLUKE 823
+#define MV_SC7_BOX_default 792
+#define MSG_SC6_SHOWNEXTBALL 790
+#define PIC_SCD_6 732
+#define PIC_SC1_RTRUBA 698
+#define MV_MAN_PUTCOIN 688
+#define MV_HND_TAKE2 606
+#define QU_EGTR_FATOBL 532
+#define ST_MAN_LADDERDOWN 521
+#define MV_MAN_TURN_DU 484
+#define MV_MAN_TURN_UD 483
+#define MV_MAN_GOLADDER 451
+#define MV_MANEGBR_EGG2BOOT 440
+#define ANI_OTMOROZ 419
+#define ST_EGTR_SLIMSORROW 340
+#define MV_MANDYAS_GIVESHMR 359
+#define MV_OTM_GLS_MORGRIGHT 425
+#define MV_OTM_BOX_DECLINES 432
+#define MV_MAN_LOOKPLANKRV 522
+#define ST_HND_TAKEN 608
+#define QU_OTM_GLS_TURNR 639
+#define ST_MOM_SITS 659
+#define MV_MAN_SHOOTBALL 676
+#define QU_CST_TURNUP 723
+#define MV_MAN8_FIRSTJUMP 778
+#define QU_SC8_ENTER_RIGHT 780
+#define ST_CST_HANDLELESS 794
+#define QU_CST_CLOSELUKE 820
+#define ST_INV_OLDDOMINO_default 369
+#define MV_BALL9_EXPLODE 939
+#define MV_NDV_DENIES 952
+#define MV_GRD_PULL 999
+#define QU_SC2_ENTER_DOWN 1025
+#define MV_SC4_BOOT_default 1036
+#define MV_MAN_TURN_SRD 1082
+#define MV_MAN_TURN_SRU 1083
+#define rMV_MAN_TURN_SRL 1090
+#define MSG_STANDLADDER 1092
+#define MV_MAN_STARTD 478
+#define MV_MAN_STARTU 333
+#define ST_MAN11_SWING 1127
+#define MV_MAN5_FALLBUMP 1163
+#define MV_STR_PLUU 1178
+#define ST_STR_EMPTY 1180
+#define QU_STR_CHEW 1190
+#define MV_MAN_FALLPOPA 1193
+#define MV_GRD2_MORG 1282
+#define PIC_SCD_18 1306
+#define ST_HDLL_FIRECAN 1310
+#define QU_SC14_ENDARCADE 1391
+#define MV_INV_BOTTLE_default 1419
+#define MV_INV_BOTTLEFULL_default 1422
+#define ANI_HAND17 1446
+#define MV_MANEGTR_GIVESCOIN 1581
+#define ANI_GIRAFFEE 1672
+#define ST_CND_7 1717
+#define ANI_CLEANERS 1767
+#define ANI_INV_BROOM 1774
+#define MV_INV_STOOL_default 1781
+#define MV_MAN25_BOARDTOLADDER 1893
+#define QU_SC25_SHOWBOARD_R 1901
+#define QU_SC25_SHOWBOARD_LCLOSE 1908
+#define QU_SC25_BOARDTOLADDER 1911
+#define QU_SC26_AUTOCLOSE1 1949
+#define MSG_SC26_TESTVENT 1952
+#define PIC_SCD_29 2099
+#define rMV_ASS_TAIL 2128
+#define ST_GLV_SLEEP2 2166
+#define MV_DLD_ICK 2172
+#define MV_DLD_GLOT 2177
+#define MV_MLS_BLINK 2182
+#define MV_MAN38_TAKEMUG 2185
+#define ST_MUG38_NORM 2193
+#define MV_FFT_TUBE_DENY 2233
+#define PIC_SC32_KADKA 2273
+#define QU_FFT_PIPE_STOP 2298
+#define QU_FFT_TUBE_OPENEYE 2305
+#define MV_INV_TUBE_default 2315
+#define QU_LEG_HIDE2 2372
+#define QU_CTS_GROW 2416
+#define MV_GMA20_STL_LOOK 2434
+#define QU_GMA20_STD_LOOKTRUBA 2452
+#define MV_CTS_STOPDOWN 2471
+#define ST_STL34_NORM 2488
+#define ST_INV_SCISSORS_default 2534
+#define QU_PDV_SML_TRY 2554
+#define MV_GRD37_BLINK1 2592
+#define MV_MAN33_TAKEMUG 2622
+#define MV_SCR36_NORM 2648
+#define MV_TSTO_FLOW 2657
+#define MV_MAN6_THROWBALL 2692
+#define MV_MAN32_BUMP 2713
+#define MSG_LIFT_CLICKBUTTON 2780
+#define QU_SC34_ENTER_LIFTDOWN 2822
+#define QU_EGTR_MD1_OBL 2878
+#define MV_MAN3_GIVEEGG_1 2907
+#define PIC_SC6_PIPEY 2954
+#define ST_BALL9_EMPTY2 2974
+#define SND_5_011 3152
+#define SND_5_022 3163
+#define SND_CMN_018 3165
+#define QU_SC38_SHOWDOMINO2 3181
+#define MV_BTT_LOOK 3193
+#define MSG_SC14_ENDARCADE 3250
+#define PIC_SC18_LADDER3 3299
+#define MSG_SC13_OPENFAST 1266
+#define MV_MAN26_TRY 3344
+#define QU_DRP26_DROP 3352
+#define ST_VNT26_RIGHT 1930
+#define rMV_MAN_SITDOWN 3391
+#define QU_SC25_MANLOOKDOWN 3417
+#define QU_SC9_SND1 3645
+#define QU_SC11_SND1 3685
+#define QU_SC13_SND3 3748
+#define SND_13_008 3753
+#define QU_SC14_SND4 3786
+#define SND_14_007 3789
+#define SND_16_005 3820
+#define SND_16_016 3836
+#define SND_16_027 3847
+#define SND_16_038 3858
+#define SND_17_004 3863
+#define SND_17_015 3879
+#define SND_17_026 3890
+#define QU_SC22_SND1 3984
+#define QU_SC24_SND3 4038
+#define SND_24_008 4043
+#define QU_SC26_SND5 4086
+#define SND_26_006 4087
+#define SND_28_004 4146
+#define ANI_BOOT_1 4231
+#define QU_SC28_FALLGRIT 4265
+#define MSG_SC28_TURNON_3 4274
+#define SND_29_003 4332
+#define QU_SC33_SND1 4438
+#define QU_SC35_SND3 4501
+#define SND_35_008 4506
+#define SND_35_019 4517
+#define MV_RHT_DENY 2561
+#define PIC_MNU_SAVE_D 4629
+#define PIC_MSV_5_L 4664
+#define ST_BRD28_RIGHT 4681
+#define SND_29_014 4348
+#define MSG_SC29_LAUGH 4760
+#define MSG_SC14_RESTORESCROLL 4769
+#define ST_RNG_CLOSED2 4865
+#define MV_LFT_FROMU 4881
+#define MV_LFT_FROMD 4882
+#define QU_GLV28_GOR 4957
+#define QU_KBK32_GO 4977
+#define SC_11 654
+#define SC_22 1547
+#define SND_25_029 5174
+#define PIC_MNU_MUSICSLIDER_D 4914
+#define rMV_MAN_LOOKUP_EYES 5207
+#define PIC_SC1_PRIMUS 837
+#define PIC_MAP_A08 5270
+#define PIC_INV_MAP_H 5325
+#define PIC_IN1_GAMETITLE 5169
+#define PIC_MAP_S07 5229
+#define PIC_MAP_S1819 5240
+#define PIC_MAP_S29 5251
+#define PIC_MAP_H35 5389
+#define PIC_MAP_H24 5378
+#define PIC_MAP_H13 5369
+#define PIC_MAP_H02 5358
+#define SND_26_018 5340
+#define SND_16_039 5336
+#define PIC_SC20_DTRUBA 3741
+#define SC_5 305
+#define SC_34 2068
+#define SND_INTR_007 5152
+#define SND_FIN_013 5085
+#define MV_FNHND5_SHOW 5053
+#define PIC_SC35_UTRUBA_R 4987
+#define MSG_SC30_TESTFLIES 4962
+#define QU_BRD16_GOL 4952
+#define QU_BRD17_TURNL 4950
+#define rMV_BRDCMN_TURN_RL 4947
+#define PIC_CSR_ARCADE1 4901
+#define PIC_INV_MUGFULL_H 4811
+#define PIC_INV_HANDLE_H 4806
+#define PIC_INV_DOMINO_H 4795
+#define PIC_INV_CARPET_H 4793
+#define MV_DRP25_TOFLOOR 3500
+#define MV_TBL_WALKL 4700
+#define SND_29_026 4690
+#define MV_MAN35_TAKECARPET 4595
+#define MV_BTN27_NORM 4580
+#define SND_37_007 4547
+#define SND_36_008 4532
+#define QU_SC36_SND5 4529
+#define QU_SC34_SND3 4463
+#define SND_28_016 4325
+#define MSG_SC34_ONCACTUS 2482
+#define MV_CTS_DEFAULT 4299
+#define QU_SC28_TIOTIA 4294
+#define MV_LEG_DENY_POT2 4285
+#define SND_38_028 4195
+#define SND_38_017 4184
+#define QU_SC38_DOMINOKICK 4181
+#define SND_38_006 4171
+#define SND_27_039 4140
+#define SND_27_028 4129
+#define SND_27_017 4118
+#define SND_27_006 4107
+#define SND_25_019 4072
+#define SND_25_008 4061
+#define QU_SC25_SND5 4058
+#define QU_SC23_SND3 4021
+#define QU_SC21_SND1 3955
+#define SND_19_014 3927
+#define SND_19_003 3911
+#define SND_18_004 3899
+#define SND_15_007 3809
+#define SND_13_009 3754
+#define QU_SC12_SND3 3723
+#define QU_SC10_SND1 3667
+#define QU_SC8_SND1 3635
+#define SND_7_021 3601
+#define SND_7_010 3590
+#define SND_6_033 3572
+#define SND_6_022 3561
+#define SND_6_011 3548
+#define SND_5_023 3532
+#define SND_3_014 3521
+#define ST_WMN28_READY 3442
+#define MV_MAN21_TAKEBROOM 3438
+#define MV_CLN_DENY_BROOM 3437
+#define MV_BRD_FALLTHREAD 3421
+#define MV_BTH_1_0 3366
+#define ST_VNT26_RIGHT2 3348
+#define ST_CDI_EYE 3310
+#define SND_5_001 3142
+#define QU_TEST2 3304
+#define MV_GRL_LAUGH_POPA 3278
+#define QU_STR_THROWGLASSES 3201
+#define SND_4_013 3128
+#define SND_3_003 3102
+#define SND_2_015 3097
+#define SND_2_004 3086
+#define SND_CMN_008 3078
+#define SND_1_005 3069
+#define MSG_SC13_TESTCLOSE 3065
+#define ST_NTL_NORM 3029
+#define ANI_STEP_8 2971
+#define MV_CST_DENY 2967
+#define ST_MOM4_SIT 2956
+#define MV_MOM4_LOOKBAG 686
+#define MV_PMS_CHANGE 2939
+#define ST_FCN17_NORM 2862
+#define QU_SC30_ENTER_LIFTDOWN 2826
+#define ST_LBN_5H 2799
+#define MV_LBN_4H 2796
+#define LIFTBTN_4 2784
+#define QU_SC34_ENTER_DEBUG 2380
+#define QU_LEG_MOVE3 2351
+#define MV_MAN30_PUT1 2340
+#define MV_MAN30_PUT1_EMPTY 2339
+#define ST_DMN38_NORM4 2253
+#define QU_GLV_TAKEDOMINO 2170
+#define ANI_SHELL_GREEN 2116
+#define MV_MAN29_JUMP 2090
+#define QU_DRV_LOOKLEFT 2032
+#define MV_DRV_FROMRIGHT 2014
+#define MV_DRV_FROMLEFT_V 2011
+#define MV_DRV_DRIVE 2004
+#define MV_DRV_TOCYCLE 1995
+#define ST_LUK26_OPEN 1973
+#define MV_LUK26_1_2 1972
+#define QU_SC25_BACKTOLADDER 1955
+#define ST_BRD25_RIGHT2 1902
+#define PIC_SC21_MONETOPR 1808
+#define MV_BOX2_FLIP 1693
+#define rMV_MANEGBR_EGG2COIN 467
+#define ST_KSL_MAN 1503
+#define MSG_SC18_SHOWGIRLJUMPTO 1499
+#define ST_BOY18_FLYFROM 1479
+#define MV_KSL_CALMDOWN 1476
+#define ST_KSL_REACT 1474
+#define ANI_KRESLO 1459
+#define MV_MAN_HMRKICK_COINLESS 1445
+#define MV_SMG_HANDSUP 1402
+#define ST_WHR13_SPIN 1385
+#define PIC_SCD_19 1319
+#define MV_GRD2_MORG1 1283
+#define QU_SC13_SHOWGUM 1216
+#define MV_MAN13_GIVEGUM 1192
+#define MV_MAN_STARTLADDERD 457
+#define QU_SC3_ENTER_LIFTDOWN 1059
+#define MV_SLN_POT_PLAY 1046
+#define ST_SC2_BOX_default 1022
+#define MV_MAN10_TAKEGUM 967
+#define MV_GLT_FLYAWAY 931
+#define MV_GLT_CLOSE 929
+#define MV_INV_APPLE_default 879
+#define MV_INV_HANDLE_default 894
+#define ANI_INV_OLDAPPLE 392
+#define MV_SLN_POT_MORG2 840
+#define QU_MOM_MORG 826
+#define MV_MAN8_BADLUCK 783
+#define PIC_SCD_7 733
+#define QU_MOM_JUMPBK 671
+#define MV_MANHDL_HANDLEDOWN 630
+#define QU_SC4_MANTOLADDER 617
+#define MSG_TAKEKOZAW 611
+#define MV_MAN_LOOKLADDER 520
+#define QU_SC1_EGBRHEADUP 511
+#define MV_PNK_WEIGHTRIGHT 502
+#define rMV_EGBR_RAISEHEAD 463
+#define ST_MAN_STANDLADDER 453
+#define MV_MANEGTR_GIVESEGGF 416
+#define PIC_SC3_LTRUBA 413
+#define ST_EGTR_FATSORROW 355
+#define ANI_DADAYASHIK 306
+#define MV_MANEGTR_TAKESCOIN 394
+#define PIC_SC4_RTRUBA 507
+#define QU_KZW_GOEDGE1 571
+#define QU_SC4_HANDPUSH 596
+#define MSG_SC6_BEARDEDTAKEBALL 683
+#define QU_CST_SPINHANDLE 722
+#define QU_SCD_ENTER 735
+#define MV_MAN8_JUMP 775
+#define MV_MAN_HANDSUP 776
+#define ANI_HOOLIGAN 808
+#define QU_HGN_OPENLUKE 824
+#define MV_INV_OLDEGG_default 365
+#define ST_PBAR_START 898
+#define QU_SC9_BALLEXPLODE 938
+#define MV_NDV_MORG 947
+#define PIC_SC07_PANEL 1002
+#define MV_MAN_TAKEHANDLE 1040
+#define ST_POT_NORM 1047
+#define MV_MAN_STOPR 328
+#define MV_KCH_MOVE2 1099
+#define QU_SC11_RESTARTMAN 1134
+#define MV_MAN11_GUM2VANTUZ 1145
+#define ST_INV_GUM_default 1156
+#define ST_INV_VANTUZ_default 1159
+#define MV_STR_SHOW 1179
+#define MSG_SC14_SHOWBALLGMAHIT 1259
+#define PIC_SC15_DTRUBA 1263
+#define PIC_SC15_UTRUBA 1264
+#define MV_MAN13_HANDLEUP 1377
+#define ST_BDG_OPEN2 1381
+#define PIC_SC1_KUCHKA 1321
+#define ANI_INV_EGGAPL 1564
+#define ST_INV_EGGBOOT_default 1572
+#define ANI_INV_EGGGLS 1573
+#define MSG_SC3_TAKEEGG 1583
+#define MV_CND_7_8 1718
+#define ST_CND_8 1719
+#define PIC_SC23_BOXCLOSED 1728
+#define PIC_SC23_BTN1 1729
+#define MV_MAN21_INSERTHANDLE 1744
+#define ST_INV_STOOL_default 1782
+#define QU_SC25_ENTERUP_FLOOR 1904
+#define ANI_INV_LOPAT 1920
+#define QU_SC26_AUTOCLOSE2 1950
+#define ANI_HANDLE23 1978
+#define MV_GRFM_PODMYSHA 1984
+#define ANI_ASS 2120
+#define MSG_SC29_SHOOTRED 2137
+#define MV_SHR_HITMAN 2149
+#define ANI_MALYSH 2165
+#define ANI_HAMMER38 2194
+#define ST_HMR38_NORM 2196
+#define MV_DMN38_NORM 2201
+#define MSG_SC38_HMRKICK 2224
+#define ST_FFT_PIPEFLOW 2241
+#define QU_FFT_PIPE_FLOWOPEN 2307
+#define PIC_SC30_RTRUBA 2355
+#define ANI_GRANDMA_20 2427
+#define MV_GMA20_FLR_BLINK 2428
+#define MV_GMA20_STL_BLINK 2431
+#define QU_SC20_ENTER_RIGHT 2453
+#define MV_CTS31_GROWMAN 2457
+#define MV_PDV_CUT_BLINK 2527
+#define MV_INV_STOPPER_default 2536
+#define QU_PDV_SML_BLINK 2553
+#define QU_PDV_LRG_BLINK 2555
+#define QU_SC36_ENTER_LEFT 2564
+#define QU_GRD37_BLINK 2595
+#define QU_GRD37_LOOKL 2597
+#define QU_RHT_BLINK 2599
+#define MV_DMN01_default 2616
+#define ANI_VENT_33 2637
+#define MV_MAN33_HANDLEDOWN 2642
+#define MSG_SC33_POUR 2645
+#define ST_TSTB_NORM 2661
+#define ST_GRT6_NORM 679
+#define ST_BTS11_ONE 2706
+#define MV_TBE33_NORM 2716
+#define ST_JET17_EMPTY 2748
+#define QU_SC34_EXITLIFT 2820
+#define QU_EGTR_MD2_OBL 2880
+#define QU_MOM_TOLIFT 2902
+#define QU_MOM_PUTBALL 2903
+#define MV_MAN3_GIVEEGG_2 2908
+#define MV_INV_EGGBLACK_default 2919
+#define QU_VSN_TURNL 2997
+#define MV_MAN6_TRYHANDLE 3009
+#define MV_GUM_NORM 976
+#define ANI_PACHKA2 3008
+#define SND_4_002 3117
+#define SND_5_012 3153
+#define SND_CMN_019 3166
+#define MSG_SC3_HIDEDOMINO 3177
+#define MV_HDL_BREAK 3341
+#define ANI_DROP_26 3345
+#define QU_MAN_DEF_STARTSHOES1_R 3389
+#define MV_SWR_DENY 3428
+#define MV_MAN_CLEANNOSE 3374
+#define SND_4_024 3466
+#define MV_GRFM_0_1 3471
+#define QU_GRFU_CLOSEEYES 3479
+#define SND_8_020 3630
+#define QU_SC9_SND2 3646
+#define QU_SC11_SND2 3686
+#define QU_SC13_SND4 3749
+#define QU_SC14_SND5 3787
+#define SND_14_008 3790
+#define SND_16_006 3826
+#define SND_16_017 3837
+#define SND_16_028 3848
+#define SND_17_005 3864
+#define SND_17_016 3880
+#define SND_17_027 3891
+#define QU_SC22_SND2 3985
+#define QU_SC24_SND4 4039
+#define SND_24_009 4044
+#define SND_26_007 4088
+#define SND_28_005 4147
+#define MV_CLN_BLINK1 4208
+#define ANI_BOOT_17 4220
+#define SND_1_016 4234
+#define MSG_SC28_CLICKLIFT 4258
+#define MSG_SC28_TURNON_4 4281
+#define QU_MAN32_LOOKBACK 4304
+#define SND_29_004 4333
+#define SND_29_015 4349
+#define QU_SC32_SND1 4397
+#define QU_SC33_SND2 4439
+#define QU_SC35_SND4 4502
+#define SND_35_009 4507
+#define MV_GRT38_NORM 4574
+#define QU_SC38_SHOWGRIT 4576
+#define PIC_MNU_AUTHORS_D 4623
+#define PIC_MSV_6_L 4665
+#define MSG_SC28_MAKEFACES 4684
+#define ST_EYE_EMPTY 4714
+#define ST_KBK_GOR 4965
+#define MSG_SC37_EXITLEFT 5006
+#define SND_FIN_002 5008
+#define ST_FN4MAN_BEFORE 5099
+#define SC_12 655
+#define SC_23 1548
+#define PIC_IN1_NAKL 5132
+#define SND_INTR_018 5177
+#define MSG_SC5_BGRSOUNDON 5314
+#define QU_SC19_ENTER_RIGHT 5319
+#define PIC_MAP_A09 5271
+#define PIC_MAP_I01 5295
+#define MSG_SC33_UPDATEKUBIK 5346
+#define PIC_MAP_S08 5231
+#define PIC_MAP_H36 5390
+#define PIC_MAP_H25 5379
+#define PIC_MAP_H14 5370
+#define PIC_MAP_H03 5359
+#define MSG_SC28_LIFT6INSIDE 5354
+#define SND_26_019 5341
+#define QU_EGTR_FATASK 5334
+#define PIC_CSR_ITN_RED 5329
+#define PIC_SC33_ZONES 5298
+#define SND_INTR_019 5220
+#define QU_HND17_BACK 5216
+#define PIC_IN1_PIPETITLE 5167
+#define SC_6 649
+#define SC_35 2069
+#define SND_INTR_008 5153
+#define SND_FIN_014 5086
+#define MV_FNFNG_MOVE 5063
+#define ANI_FN3_FINGERS 5062
+#define MV_FNHND3_SHOOT 5060
+#define SND_37_008 5013
+#define PIC_SC17_LADDER2 2749
+#define QU_SC35_TRYFLY 4984
+#define MSG_SC33_TRYKUBIK 4980
+#define QU_BRD16_FLYR 4953
+#define QU_EGG6_GOR 4935
+#define ANI_FLY 4916
+#define PIC_CSR_ARCADE2 4902
+#define SC_COMMON 321
+#define PIC_INV_PIPE_C 4847
+#define PIC_INV_LEVERHANDLE_H 4807
+#define PIC_INV_BROOM_H 4792
+#define PIC_INV_BOTTLE_H 4789
+#define MSG_MNU_EXITMENU 4633
+#define ST_SCR36_LEFT 4609
+#define ST_INV_CARPET_default 4598
+#define MV_PDV_SML_DENY 4585
+#define MV_MAN26_KNOCKMUG 4559
+#define MV_MAN26_TAKESOCK 4558
+#define SND_36_009 4533
+#define QU_SC34_SND4 4464
+#define QU_SC31_SND1 4384
+#define SND_28_017 4326
+#define QU_SC34_FROMCACTUS 4312
+#define ST_VNT34_UP2 4310
+#define MV_MAN34_TURNVENT_L 4307
+#define QU_SC17_FILLBOOT 4237
+#define SND_38_029 4196
+#define SND_38_018 4185
+#define SND_38_007 4172
+#define SND_27_029 4130
+#define SND_27_018 4119
+#define SND_27_007 4108
+#define SND_25_009 4062
+#define QU_SC23_SND4 4022
+#define QU_SC21_SND2 3956
+#define SND_19_015 3928
+#define SND_19_004 3912
+#define SND_18_005 3900
+#define SND_15_008 3810
+#define QU_SC12_SND4 3724
+#define QU_SC10_SND2 3668
+#define QU_SC8_SND2 3636
+#define QU_SC7_SND1 3606
+#define SND_7_022 3602
+#define SND_7_011 3591
+#define SND_6_034 3573
+#define SND_6_012 3549
+#define SND_6_001 3538
+#define SND_5_024 3536
+#define SND_4_025 3529
+#define SND_3_015 3522
+#define rMV_MAN25_ROWHAND 3492
+#define QU_SC25_BEARDED 3425
+#define ST_MUG17_DROP 3413
+#define ST_MAN_RIGHT 325
+#define MV_VNT26_TURNU 1931
+#define MV_CLN_DENY 2290
+#define ST_KZW14_EMPTY 3263
+#define SND_4_014 3129
+#define SND_3_004 3103
+#define SND_2_016 3098
+#define SND_2_005 3087
+#define SND_CMN_009 3079
+#define SND_1_006 3070
+#define MSG_SC4_MANTOBOTTLE 2852
+#define ST_LBN_4H 2797
+#define MV_LBN_3H 2794
+#define LIFTBTN_5 2785
+#define QU_SC17_FILLMUG 2750
+#define QU_SC9_BREAKGRIT 2723
+#define PIC_SC32_KADKABACK 2669
+#define QU_SC15_ENTER_LEFT 2651
+#define MSG_SC34_LEAVEBOARD 2576
+#define MV_MAN34_BOARD_FROM 2549
+#define MV_MAN35_TAKESTOPPER 2512
+#define QU_LEG_MOVE4 2352
+#define MV_MAN30_PUT2 2342
+#define MV_MAN30_PUT2_EMPTY 2341
+#define MV_FLG_STOPR 2265
+#define QU_SC38_ENTER_UP 2227
+#define ST_MAN29_RUNR 2140
+#define PIC_SC28_RTRUBA 2073
+#define QU_DRV_FROMLEFT 2036
+#define PIC_SC27_LTRUBA 1914
+#define MV_BRM_FALL 1764
+#define ANI_BROOM 1763
+#define ST_MSH_SIT 1756
+#define ANI_TABURETTE 1745
+#define ST_INV_SOCK_default 1700
+#define QU_SC6_SHOWHANDLE 1689
+#define QU_GRFU_CHMOKUP 1670
+#define QU_GRFU_BLINKLEFT 1666
+#define rMV_MANEGBR_EGG2BOOT 466
+#define MV_CDI_0_1 1544
+#define ST_CDI_NOSUGAR 1542
+#define ST_CDI_EMPTY 1531
+#define MSG_SC18_MANREADY 1507
+#define MV_KSL_INMAN 1504
+#define MV_KSL_JUMPGIRL 1475
+#define MV_KSL_SWINGBOY 1462
+#define MV_SMG_HANDSDOWN 1405
+#define MV_SMG_THROW 1398
+#define ANI_JETTIE 1392
+#define ST_GRL_STAND 1337
+#define ANI_WHIRLIGIG_18 829
+#define PIC_INV_FIRECAN 1315
+#define PIC_SC14_DFLOOR 1241
+#define MSG_SC13_EATGUM 1219
+#define MV_MAN5_FALL 1165
+#define MV_KCH_START 1121
+#define MSG_SC1_UTRUBACLICK 1100
+#define ST_LFT_OPEN_NEW 1071
+#define PIC_INV_POT 985
+#define MSG_SC9_FLOWN 943
+#define GRID_TEST 937
+#define MV_GLT_OPEN 927
+#define ST_INV_APPLE_default 880
+#define MV_INV_OLDHANDLE_default 796
+#define ANI_INV_HANDLE 893
+#define PIC_SCD_8 756
+#define ST_BTT_SLEEPS 748
+#define ST_BTT_CHESHET 746
+#define PIC_SC7_RTRUBA 710
+#define ST_BRD_EMPTY 693
+#define PIC_SC6_LTRUBA 667
+#define MV_MANOTM_GLASSES2BOX 629
+#define MSG_GOTOLADDER 618
+#define ST_CLK_BUTTON 593
+#define ANI_CLOCK 588
+#define ST_MAN_DOWN 479
+#define MV_EGTR_FATEAT 350
+#define MV_EGTR_SLIM2SORROW 339
+#define MV_DYAS_TOUS 311
+#define MV_EGTR_FROMSLAPPING 349
+#define MSG_RAISEPLANK 547
+#define ST_KZW_BOTTLERIGHT 574
+#define QU_KZW_GOEDGE2 576
+#define MV_KZW_JUMPUS 582
+#define MV_HND_TAKEBOTTLE 607
+#define QU_OTM_BOX_SDVIG 646
+#define QU_MOM_SITDOWN 685
+#define MV_HGN_OPENLUKE 809
+#define PIC_INV_OLDHAMMER 405
+#define MV_INV_EGG_default 870
+#define QU_PLV_BREATHE 959
+#define QU_GRD_MORG1 1005
+#define ST_HDL_UP 624
+#define ST_SC4_COIN_default 1030
+#define MV_HDL6_FALL 1041
+#define ST_LFT_OPEN 1050
+#define QU_SC3_ENTER_LIFTUP 1062
+#define QU_SWR_JUMPDOWN 1123
+#define MSG_SC11_MANTOSWING 1128
+#define ST_KCH_EMPTY 1132
+#define MV_MAN5_VNT2BOX 1162
+#define ST_STR_LEFT 1175
+#define MV_STR_TURNR 1176
+#define ST_GMS_BOOT 1270
+#define QU_SC16_ENTER_DOWN 1295
+#define QU_KAR_SPIN 1307
+#define ST_MUG_EMPTY 1298
+#define ST_MUG_FULL 1360
+#define ST_INV_BOTTLE_default 1420
+#define QU_SC17_SHOWBOTTLE 1429
+#define MSG_SC4_CLICKLADDER 1439
+#define MSG_SC18_SHOWGIRLJUMP 1496
+#define MV_HND17_1_0 1558
+#define MV_INV_EGGGLS_default 1574
+#define MV_GFA_GREET 1593
+#define MV_GFA_GREETSOCK 1594
+#define QU_GFA_CHESHETSOCK 1609
+#define PIC_SC22_FLOOR 1621
+#define PIC_SC23_DTRUBA 1626
+#define MV_GRFU_CHMOKCYCLE 1658
+#define MV_GRFU_CHMOKLEFT 1660
+#define MV_GRFU_LOOKDOWN 1688
+#define QU_DYAS_OPENBOX_LIES 1691
+#define ST_CND_9 1721
+#define PIC_SC23_BTN2 1730
+#define MV_MAN21_HANDLEDOWN 1805
+#define rMV_MAN_TOTRUBAVER2 1833
+#define QU_SC26_AUTOCLOSE3 1951
+#define MV_CHI_MOTION 1962
+#define QU_CHI_MOVE 1963
+#define QU_CHI_HIDE 1965
+#define MV_LUK23_1_2i 1976
+#define ST_GRFM_NORM 1983
+#define MSG_SC27_CLICKBET 2048
+#define MV_BTA_HILITE 2051
+#define MV_ASS_SIT 2125
+#define rMV_ASS_SIT 2127
+#define MV_SHG_HITMAN 2147
+#define MV_GLV_DRINK 2162
+#define MV_DLD_DENY 2176
+#define MV_MAN38_PUTDOMIN 2187
+#define QU_SC38_SHOWBOTTLE 2199
+#define QU_GLV_TOSMALL 2208
+#define QU_MLS_HAND 2223
+#define MV_FFT_TUBE_FLOW 2234
+#define MV_FFT_PIPE_DENY 2245
+#define ST_DMN38_NORM5 2283
+#define MSG_SC32_STOPFLAG 2311
+#define QU_SC30_ENTER_RIGHT 2357
+#define QU_GMA20_STL_BLINK 2445
+#define QU_GMA20_FLR_BLINK 2448
+#define QU_GMA20_FLR_LOOK 2449
+#define ST_CTS_GROWUP 2467
+#define ANI_VENT_34 2473
+#define QU_SC34_SHOWBOX 2501
+#define ANI_BOARD_34 2506
+#define ANI_INV_SCISSORS 2532
+#define QU_PDV_LRG_TRY 2556
+#define MSG_SC34_TESTVENT 2557
+#define QU_SC36_ENTER_RIGHT 2563
+#define QU_GRD3_BLINK1 2585
+#define ANI_INV_MUGFULL 2633
+#define MV_TST31_FLOW 2653
+#define MV_STR_PLUUAPLE 2682
+#define rMV_MAN_TAKECOIN 2695
+#define ST_MUG17_FULL 2740
+#define QU_SC14_ENTERLIFT 1225
+#define MV_MAN_TOTRUBAHOR2 2839
+#define MSG_SC4_KOZAWFALL 2858
+#define MV_EGTR_MD1_OBL 2865
+#define MV_MAN3_GIVEEGG_3 2909
+#define MV_MAN3_TAKEEGG_2 2912
+#define PIC_INV_EGGBLACK 2921
+#define MV_DRP3_DROP2 2922
+#define MV_EGTR_FATDENY 2934
+#define ANI_GRIT1 2961
+#define QU_SC8_STANDUP 2975
+#define SND_4_003 3118
+#define SND_5_002 3143
+#define SND_5_013 3154
+#define PIC_SC15_LADDER 3253
+#define MV_CLN_BLINK2 3325
+#define QU_MAN_DEF_STARTSHOES2_R 3397
+#define MV_MAN17_GIVEHMR 3431
+#define MV_GFA_DENY 3435
+#define SND_8_010 3620
+#define SND_8_021 3631
+#define QU_SC9_SND3 3647
+#define QU_SC11_SND3 3687
+#define QU_SC13_SND5 3750
+#define SND_14_009 3791
+#define SND_16_007 3827
+#define SND_16_018 3838
+#define SND_16_029 3849
+#define SND_17_006 3870
+#define SND_17_017 3881
+#define SND_17_028 3892
+#define QU_SC20_SND1 3934
+#define QU_SC22_SND3 3986
+#define QU_SC24_SND5 4040
+#define SND_26_008 4089
+#define SND_28_006 4153
+#define QU_CLN_BLINK1 4209
+#define PIC_SC28_FRAME1 4262
+#define SND_29_005 4334
+#define SND_29_016 4350
+#define QU_SC32_SND2 4398
+#define QU_SC33_SND3 4440
+#define QU_SC35_SND5 4503
+#define SND_1_017 4548
+#define QU_SC34_SHOWBOX_FLOOR 4566
+#define QU_MID_CLEANVENT 4583
+#define PIC_MLD_OK_D 4646
+#define PIC_MSV_7_L 4666
+#define SND_29_027 4757
+#define MV_SHD_CMN 4860
+#define MSG_SC35_STOPFLOW 4864
+#define PIC_CSR_ITN_INV 4894
+#define QU_BRD28_GOL 4960
+#define MSG_SC28_TRYVTORPERS 4961
+#define MV_KBK_FROMTRUBA 4970
+#define SND_32_040 4998
+#define SND_FIN_003 5009
+#define MV_FNHND1_SCRUB 5029
+#define MV_FN4MAN_ENTER 5098
+#define SC_13 1137
+#define SC_24 1549
+#define PIC_MSV_DOT_L 5189
+#define PIC_SC23_UTRUBA 1627
+#define PIC_SC24_LADDERD 1826
+#define MV_HND17_0_1 5215
+#define MV_MAN23_TRYHANDLE 5308
+#define PIC_MAP_I02 5296
+#define PIC_MAP_S09 5230
+#define PIC_MAP_I03 5395
+#define PIC_MAP_H37 5391
+#define PIC_MAP_H26 5380
+#define PIC_MAP_H15 5371
+#define PIC_MAP_H04 5360
+#define QU_SC22_ENTER_DOWNTOUP 5327
+#define MV_MAP_NORM 5322
+#define PIC_MEX_CANCEL 5302
+#define MSG_SC22_CRANEOUT_GMA 5218
+#define MSG_SC34_RETRYVENT 5210
+#define SND_CMN_070 5199
+#define SC_7 650
+#define SC_36 2070
+#define SND_INTR_009 5154
+#define MV_IN1CLK_HIDE 5131
+#define SND_FIN_015 5087
+#define MV_FNHND3_SHOW 5037
+#define MSG_FIN_STARTFINAL 5025
+#define MV_MANFIN_TAKECOIN 5020
+#define QU_TTA9_GOL 4937
+#define PIC_CSR_ARCADE6_D 4908
+#define PIC_CSR_ARCADE3 4904
+#define MSG_BRD_TURN 4877
+#define PIC_INV_COIN_C 4831
+#define PIC_INV_BOTTLE 1424
+#define PIC_INV_BOARD 1245
+#define ANI_INV_CARPET 4596
+#define QU_SC34_SND5 4465
+#define QU_SC31_SND2 4385
+#define SND_28_018 4327
+#define ST_BOX34_MAIN2 4306
+#define ST_TTA_DOWN 4288
+#define QU_SC25_MANTOTRUBA_R 4218
+#define ST_BAL14_TOGMA 3199
+#define SND_38_019 4186
+#define SND_38_008 4173
+#define SND_27_019 4120
+#define SND_27_008 4109
+#define QU_SC21_SND3 3957
+#define SND_19_005 3913
+#define SND_18_006 3906
+#define SND_15_009 3811
+#define QU_SC12_SND5 3725
+#define QU_SC10_SND3 3669
+#define QU_SC8_SND3 3637
+#define QU_SC7_SND2 3607
+#define SND_7_023 3603
+#define SND_7_012 3592
+#define SND_7_001 3581
+#define SND_6_035 3574
+#define QU_SC6_FALLHANDLE 2995
+#define SND_6_013 3550
+#define SND_6_002 3539
+#define SND_5_025 3537
+#define SND_3_016 3523
+#define MV_MAN_STANDUP 1166
+#define QU_MAN_DEF_STOPSHOES1 3381
+#define QU_MAN_DEF_SITDOWN 3377
+#define MV_BTH_2_1 3364
+#define QU_SC27_SHOWVENT 2060
+#define MV_HDLL_RAISE 3329
+#define MV_KZW14_HIDE 3269
+#define rMV_STR_DENY 3209
+#define MV_MAN38_PUTBOTTLE_FULL 3170
+#define SND_4_015 3130
+#define SND_3_005 3104
+#define SND_2_017 3099
+#define SND_2_006 3088
+#define SND_1_007 3071
+#define QU_SC8_FALLSTEP 2977
+#define ST_MOM_EMPTY 2952
+#define MSG_SC4_COINOUT 2895
+#define rMV_MAN_TAKEBOOT 2883
+#define QU_SC6_ENTERLIFT 1054
+#define ST_LBN_3H 2795
+#define MV_LBN_2H 2792
+#define LIFTBTN_6 2786
+#define MSG_LIFT_TESTDOOR 1064
+#define QU_SC3_ENTERLIFT 2779
+#define ST_LBN_9N 2777
+#define ST_GRT14_GRIT 2727
+#define MV_GRT14_FALL 2725
+#define QU_SC6_FALLGRIT 2696
+#define MSG_SC34_ONBOARD 2550
+#define QU_SC34_FROMSTOOL 2491
+#define MV_MAN20_TAKESTOOL 2462
+#define ANI_INV_POTTIE 2390
+#define PIC_SC34_UTRUBA1 2377
+#define ST_MAN32_SIT 2277
+#define ST_FLG_RIGHT 2264
+#define ST_FLG_NORM 2259
+#define rMV_MAN29_PUSHASS 2146
+#define MSG_SC29_SHOOTGREEN 2119
+#define MV_SHG_NORM 2117
+#define MSG_SC27_STARTWIPE 2057
+#define QU_MID_SWAB 2041
+#define QU_DRV_GIVEVENT 2040
+#define QU_DRV_FROMRIGHT2 2039
+#define MV_MID_SWITCHBACK 2018
+#define ANI_MAID 2015
+#define MSG_SC26_SHOWVENT 1946
+#define ST_MAN25_ROW 1881
+#define PIC_SC26_UTRUBA 1863
+#define QU_MSH_MOVE 1812
+#define QU_MSH_CRANEOUT 1811
+#define ST_HDL22_EMPTY 1761
+#define MSG_SC23_SPINWHEEL1 1740
+#define QU_GRFB_TAIL 1642
+#define ST_GRFB_HANG 1638
+#define PIC_SC23_FLOOR 1631
+#define MV_CDI_DRYG 1534
+#define QU_GRD_LOOKRIGHT 998
+#define ST_GRL18_WALKFROM 1487
+#define ANI_BRIDGE 1378
+#define MSG_SC16_MUGCLICK 1366
+#define MV_BOY_GOOUT 1334
+#define ST_INV_FIRECAN_default 1314
+#define ST_HDLR_DOWN 1199
+#define ST_SWR_SWING 1115
+#define ANI_KACHELI 1094
+#define PIC_SCD_9 907
+#define PIC_INV_EGG 859
+#define PIC_INV_HAMMER 864
+#define ST_INV_OLDEGG_default 366
+#define PIC_INV_GLASSES 865
+#define ANI_INV_OLDHAMMER 399
+#define ST_INV_OLDBOOT_default 398
+#define ST_INV_OLDAPPLE_default 395
+#define MV_SLN_POT_MOVEBACK 844
+#define QU_HGN_PLUU 815
+#define SC_DBGMENU 726
+#define ANI_HAND 601
+#define MV_MAN_LOOKPLANK 554
+#define MSG_LOWERPLANK 540
+#define MV_MAN_TURN_RD 489
+#define MV_MAN_TURN_RU 485
+#define rMV_MAN_GOR 329
+#define MV_INV_OLDHAMMER_default 400
+#define MV_EGTR_FATOBL 372
+#define MV_EGTR_GIVESMONEY 353
+#define MV_OTM_2_4 438
+#define TrubaLeft 474
+#define MV_KZW_JUMP 558
+#define MV_KZW_TURN 562
+#define MV_KZW_GOR 564
+#define rMV_KZW_GOR 566
+#define PIC_SC4_BOTTLE 568
+#define MV_KZW_JUMPEDGE 581
+#define MV_HDL_MOVEDOWN 623
+#define QU_SC1_ENTER_UP 704
+#define QU_CST_SPINHEADUP 725
+#define QU_BTT_EAT 759
+#define MV_MAN8_DRYGUP 768
+#define PIC_SC12_RTRUBA 855
+#define MV_INV_HAMMER_default 885
+#define PIC_SC2_DTRUBA 841
+#define PIC_SC9_LTRUBA 900
+#define MV_VSN_CYCLE 905
+#define ANI_NADUVATEL 944
+#define MV_GRD_MORG 997
+#define MSG_SC8_ARCADENOW 1044
+#define PIC_SC11_LTRUBA 1119
+#define MSG_SC5_MAKEOTMFEEDBACK 1169
+#define QU_STR_TURNL 1184
+#define MSG_SC16_HIDEMAN 1357
+#define ST_JTI_EMPTY2 1395
+#define QU_GFA_START 1612
+#define ST_GRFU_UP 1648
+#define MV_GRFU_CHMOKUP 1659
+#define MV_GRFG_SHOW 1673
+#define ST_GRFG_EMPTY 1674
+#define ST_GRFG_BALD 1675
+#define MV_CND_8_9 1720
+#define PIC_SC23_BTN3 1731
+#define QU_CLN_ZHMUR 1790
+#define MV_MAN22_FROMSTOOL 1794
+#define MV_MAN21_HANDLEUP 1806
+#define MV_MAN25_TRUBATOBOARD 1892
+#define QU_SC25_MANTOTRUBA 1905
+#define rMV_MAN25_ONBOARD 1966
+#define MSG_SC26_HIDECHI 1967
+#define ST_LUK23_WHANDLE2 1977
+#define QU_GRFM_ASS 1986
+#define MV_MAN27_FLOW 1990
+#define MV_VNT27_LIES 2059
+#define QU_SC25_BACKTOTRUBA 2061
+#define QU_ASS_TAIL 2133
+#define ANI_GLAVAR 2154
+#define MV_MLS_POINT 2183
+#define QU_GLV_LOOKMAN 2212
+#define ANI_FIREFIGHTER 2229
+#define MV_FFT_PIPE_STOPFLOW 2246
+#define MSG_SC32_STARTFLAGLEFT 2310
+#define ST_RHT_CLOSED 2364
+#define ST_POTTIE_default 2392
+#define ANI_HDL32 2394
+#define PIC_SC35_LTRUBA 2406
+#define MV_HZE_FLOW 2425
+#define ST_GMA20_STOOL 2432
+#define ST_STL20_NORM 2465
+#define ST_BRD34_LEFT 2508
+#define ST_BRD34_RIGHT 2509
+#define ST_LUK34_OPEN 2544
+#define MV_PDV_SML_TRY 2552
+#define PIC_SC36_RTRUBA 2560
+#define MV_GRD3_BLINK 2580
+#define MV_GRD3_LOOKL 2583
+#define MV_GRD37_BLINK 2591
+#define MV_GRD37_LOOKL 2593
+#define ANI_GRANDMA_22 2609
+#define MV_VNT33_TURNR 2641
+#define QU_SC35_SHOWHOZECUT 2679
+#define QU_SC9_TEST1 2701
+#define ANI_TUBE_33 2715
+#define MSG_SC29_SHOWLASTRED 2731
+#define PIC_SC3_BORDER 2729
+#define MV_EGTR_MD2_OBL 2870
+#define MV_MAN3_TAKEEGG_3 2911
+#define MV_MAN3_GIVEEGG_4 2913
+#define MV_MAN_TOTRUBAHOR3 2982
+#define MV_MAN_FALLPOPA2 2983
+#define PIC_SC9_URTRUBA 2984
+#define QU_SC9_MANFALL 2986
+#define MV_BTN6_HILITE 2992
+#define MV_NDV_DENY_NOGUM 3022
+#define PIC_CMN_LOAD 3035
+#define SND_4_004 3119
+#define SND_5_003 3144
+#define SND_5_014 3155
+#define ANI_DROP_7 3185
+#define MV_DRP7_DROP 3186
+#define ANI_GRIT2 3189
+#define ST_GRIT2_STUCCO 3191
+#define MSG_SC15_LADDERTOBACK 3259
+#define ST_BTL_EMPTY 3306
+#define MV_DMS_0_1 3318
+#define QU_CLN_BLINK2 3326
+#define MV_MAN11_GIVEGUM_2 3430
+#define MV_MAN22_TRYBOOT 3433
+#define QU_MAN_DEF_SNEEZE 3464
+#define MV_GRFU_KISSOPEN 3477
+#define QU_SC6_SND1 3576
+#define SND_8_011 3621
+#define SND_8_022 3632
+#define QU_SC9_SND4 3648
+#define SND_9_010 3654
+#define QU_SC11_SND4 3688
+#define SND_16_008 3828
+#define SND_16_019 3839
+#define SND_17_007 3871
+#define SND_17_018 3882
+#define SND_17_029 3893
+#define QU_SC20_SND2 3935
+#define QU_SC22_SND4 3987
+#define SND_26_009 4090
+#define SND_28_007 4154
+#define ST_SHD01_0 4204
+#define QU_SC17_SHOWBOOT 4225
+#define ST_BRM_STAND 4226
+#define ST_LFT28_OPEN 4241
+#define QU_SC28_LIFT1_SHOWAFTER 4260
+#define MSG_SC28_TURNON_6 4272
+#define SND_29_006 4340
+#define SND_29_017 4351
+#define QU_SC30_SND1 4364
+#define MV_MAN30_ITCHBROOM 4374
+#define SND_30_010 4375
+#define QU_SC32_SND3 4399
+#define SND_32_030 4426
+#define QU_SC33_SND4 4441
+#define MV_MAN33_PUTMUGFULL 4453
+#define MV_GLV_PUTDOMINO 2158
+#define MV_MAN36_PUTCARPET 4604
+#define PIC_MNU_DEBUG_D 4631
+#define PIC_MSV_8_L 4667
+#define MV_WTR24_FLOWLOWER 1844
+#define PIC_SC11_WND1 4704
+#define ANI_EYE_30 4712
+#define SND_29_028 4758
+#define MSG_SC22_CHECKGMABOOT 4782
+#define PIC_TEST1 4783
+#define QU_LUK26_HIT 4890
+#define MV_KBK_TOTRUBA 4971
+#define SND_19_016 4995
+#define SND_FIN_004 5010
+#define QU_FN4_DOFINAL 5108
+#define ST_IN1MAN_FROM 5123
+#define SC_14 1138
+#define SC_25 1550
+#define SC_TITLES 5166
+#define PIC_SC24_LADDERUP 1827
+#define PIC_SC23_LADDER 1628
+#define PIC_SC1_OSK 1018
+#define PIC_MAP_H38 5392
+#define PIC_MAP_H27 5381
+#define PIC_MAP_H16 5372
+#define PIC_MAP_H05 5361
+#define QU_SC22_ENTER_UPTODOWN 5326
+#define MV_MOM_SITDOWN 657
+#define SC_8 651
+#define SC_37 2071
+#define QU_INTR_GETUPMAN 5136
+#define SND_FIN_016 5088
+#define MV_FNHND4_SCRUB 5049
+#define rMV_EGI_GOR 4932
+#define MV_EGI_GOR 4930
+#define PIC_CSR_ARCADE7_D 4910
+#define PIC_CSR_ARCADE4 4905
+#define PIC_INV_EGGBLACK_C 4834
+#define PIC_INV_BOOT_C 4825
+#define SND_31_010 4752
+#define SND_30_011 4376
+#define PIC_MSV_0_D 4643
+#define PIC_MSV_FULL_D 4641
+#define QU_SC31_SND3 4386
+#define SND_28_019 4328
+#define MV_TTA_GOL 4293
+#define ST_STR_GLASSES 3114
+#define MSG_SC9_FROMLADDER 4207
+#define SND_38_009 4174
+#define SND_27_009 4110
+#define QU_SC21_SND4 3958
+#define SND_19_006 3919
+#define QU_SC10_SND4 3670
+#define QU_SC8_SND4 3638
+#define QU_SC7_SND3 3608
+#define SND_7_024 3604
+#define SND_7_013 3593
+#define SND_7_002 3582
+#define SND_6_036 3575
+#define SND_6_025 3564
+#define SND_6_014 3551
+#define SND_6_003 3540
+#define SND_3_017 3533
+#define SND_4_027 3530
+#define SND_2_018 3512
+#define ST_MID_SPADE 3489
+#define MV_MAN_STOPSHOES_1 3376
+#define MV_BTH_GODOWN 3350
+#define QU_CDI_EYE 3314
+#define MV_MAN16_TAKEBOOT 3289
+#define QU_KZW14_HIDE 3274
+#define QU_SC5_SND1 3240
+#define MV_MAN13_THROWGLASSES 3197
+#define SND_4_016 3131
+#define SND_3_006 3105
+#define SND_1_008 3072
+#define QU_STR_HIDE_L 3060
+#define rMV_STR_TURNR 3051
+#define ST_MID11_SWAB 3030
+#define ST_MOM_CYCLEBK 3011
+#define ST_CLK8_NORM 2991
+#define MV_MOM_OPENEMPTY 2946
+#define QU_SC4_MANFROMBOTTLE 2851
+#define QU_SC38_EXITLIFT 2837
+#define ST_LBN_2H 2793
+#define MV_LBN_1H 2790
+#define LIFTBTN_7 2787
+#define ST_LBN_8N 2774
+#define QU_SC11_PUTBOOT1 2709
+#define QU_SC32_FLOWB 2667
+#define QU_SC33_ENTER_LEFT 2620
+#define PIC_SC34_SHADOW 2538
+#define ANI_STOPPER 2515
+#define QU_SC34_ENTER_DOWN 2379
+#define PIC_SC34_UTRUBA2 2378
+#define MSG_SC30_LEAVESCENE 2373
+#define QU_LEG_SHOW1 2347
+#define ST_LEG_UP 2324
+#define MV_MAN38_PUTBOTTLE 2285
+#define MV_ASS_HITGREEN 2138
+#define QU_SC29_MANTO_L 2103
+#define MV_MAN29_RUN 2095
+#define MV_MAN29_FROMPORTER 2094
+#define MV_MAN29_STANDUP 2092
+#define QU_DRV_PUSHBUTTON 2056
+#define ST_MID_SWAB 2017
+#define MV_DRV_FROMLEFT 2012
+#define MV_DRV_GIVEVENT 2006
+#define MV_DRV_TORIGHT 2001
+#define MV_INV_VENT_default 1969
+#define MV_BRD25_RIGHT 1899
+#define QU_WTR24_FLOWLOWER 1953
+#define ST_WTR25_FLOW 1858
+#define ST_LUK23_OPEN 1816
+#define MSG_SC23_SPINWHEEL2 1741
+#define MV_CDI_SHOW 1530
+#define MV_KSL_JUMPMAN 1509
+#define MV_GRL18_JUMPTO 1488
+#define ST_BOY18_WALK 1480
+#define ST_KSL_BOY 1463
+#define MV_SMG_SPINHEAD 1400
+#define rMV_MAN_STANDUP 1291
+#define QU_GRD2_LOOKLEFT 1289
+#define QU_GRD2_BLINK 1287
+#define PIC_SC15_WALL 1286
+#define MV_MAN14_KICKAIR 1256
+#define MSG_SC14_SHOWBALLFLY 1253
+#define MV_MAN14_FALL 1236
+#define MV_SWR_JUMPDOWN 1116
+#define MV_MAN_GOR 327
+#define MSG_SC4_COINPUT 1032
+#define ST_HDL6_default 1011
+#define MV_INV_POT_default 987
+#define ANI_INV_POT 986
+#define MV_BALL9_default 934
+#define MSG_SC5_HANDLEUP 915
+#define SC_LDR 635
+#define MV_INV_DOMINO_default 873
+#define ST_INV_HANDLE_default 895
+#define QU_SLN_POT_MORG 849
+#define MSG_SC7_HIDEBOX 817
+#define MV_BTT_23 747
+#define MV_BTT_12 745
+#define MV_BTT_01 744
+#define PIC_SC5_UTRUBA 701
+#define QU_EGTR_FATOBLRV 534
+#define MV_MAN_TOTRUBAVER 517
+#define ST_MAN_EMPTY 476
+#define MV_OTM_GLS_TURNL 424
+#define ST_EGBR_HEADRAISED 379
+#define ST_DYAS_SITS 308
+#define MV_INV_OLDDOMINO_default 368
+#define PIC_SC2_LADDER 412
+#define MV_MANEGTR_GIVESEGGFAT 417
+#define ST_OTM_VNT_LEFT 434
+#define PIC_TEST2 509
+#define MSG_KOZAWRESTART 546
+#define ST_PNK_WEIGHTLEFT 503
+#define GRID_SC4_LADDER 565
+#define QU_SC4_CLICKBUTTON 610
+#define MSG_UPDATEBOTTLE 613
+#define ANI_HANDLE 622
+#define MV_MOM_PUTBALL 666
+#define QU_BTT_SLEEP 763
+#define MSG_SC8_RESUMEFLIGHT 784
+#define MV_MAN8_TOJUMP 782
+#define ST_LUK_OPEN 806
+#define QU_CST_MORG 818
+#define PIC_INV_OLDDOMINO 371
+#define MV_VSN_TURNRIGHT 955
+#define QU_SC9_ENTER_LEFT 962
+#define MSG_SC9_PLVCLICK 965
+#define MSG_SC6_INSTHANDLE 1012
+#define MV_MAN_LIFTUP 1051
+#define QU_SC6_ENTER_LIFTUP 1069
+#define MV_MAN_STOPD 482
+#define MV_MAN_STOPU 477
+#define rMV_MAN_STOPR 331
+#define PIC_INV_VANTUZ 1161
+#define ANI_STOROZH 1172
+#define ANI_HANDLE_R 1196
+#define ST_GMA_EMPTY 1235
+#define PIC_SC15_RTRUBA 1262
+#define ANI_GRANDMA_ASS 1265
+#define ST_GRD2_STAND 1281
+#define MV_MAN16_DRINK 1354
+#define MSG_HIDEMAN 1356
+#define MV_HND17_TOCYCLE 1450
+#define QU_SC19_ENTER_WHIRLIGIG 1470
+#define MV_INV_EGGDOM_default 1562
+#define ST_GFA_SIT 1590
+#define ST_GRFU_CHMOK 1656
+#define MV_GRFU_TOKISS 1661
+#define MV_GRFG_BLINKBALD 1678
+#define MV_CND_0_1 1703
+#define PIC_SC23_BTN4 1732
+#define ST_CLN_BROOM 1771
+#define QU_SC22_FALLLEVER 1787
+#define PIC_SC24_FLOOR 1825
+#define MV_INV_LOPAT_default 1921
+#define ST_INV_LOPAT_default 1922
+#define MV_MAN25_TAKESPADE 1926
+#define PIC_SC29_LFLOOR 2142
+#define ST_SHG_EMPTY 2148
+#define MV_GLV_DRINK_NOHMR 2163
+#define ST_DLD_SIT2 2173
+#define MV_DLD_BLINK 2175
+#define ST_MLS_RIGHT 2180
+#define QU_SC38_SHOWDOMINO 2203
+#define MV_FFT_PIPE_FLOW 2242
+#define MV_FFT_PIPE_OPENEYE 2243
+#define QU_FFT_PIPE_START 2296
+#define MSG_SC32_STARTFLAGRIGHT 2309
+#define ST_INV_PIPE_default 2319
+#define MV_MAN36_GOIN 2366
+#define ST_GMA20_FLOOR 2429
+#define MV_GMA20_STD_LOOKTRUBA 2438
+#define PIC_SC20_RTRUBA 2439
+#define PIC_SC31_DTRUBA 2441
+#define PIC_SC31_UTRUBA 2442
+#define MV_MAN20_BOOTTOSTOOL 2443
+#define MV_GMA_0_1 2444
+#define QU_SC35_MANRETIRE 2539
+#define MV_GRD3_BLINK1 2581
+#define QU_GRD3_BLINK 2584
+#define QU_GRD3_LOOKL 2586
+#define ANI_RING 2604
+#define QU_SC22_FROMSTOOL_GMA 2612
+#define MV_MUG33_FILL 2624
+#define ST_JTI33_EMPTY 2629
+#define ST_VNT33_RIGHT 2639
+#define ANI_SCISSORS_36 2647
+#define MV_MAN36_TAKESCISSORS 2650
+#define PIC_SC32_VESSELS 2665
+#define MV_HZE_UNCUT 2677
+#define QU_SC3_RELEASEEGG 2680
+#define MSG_SC3_RELEASEEGG 2681
+#define MV_GRT6_BREAK 678
+#define MV_MAN17_PUTMUG 2741
+#define QU_SC17_SHOWMUG 2742
+#define QU_SC35_ENTER_LIFTDOWN 2818
+#define MV_EGTR_MD2_BOLTLEGS 2868
+#define MSG_SC6_JUMPBK 2900
+#define MV_MAN3_TAKEEGG_4 2910
+#define ST_STP8_EMPTY 2981
+#define ANI_BUTTON_6 2988
+#define MV_PCH2_NORM 3020
+#define QU_SC8_ENTER_UP 3036
+#define SND_2_007 3089
+#define SND_4_005 3120
+#define SND_5_004 3145
+#define SND_5_015 3156
+#define ST_DRP7_EMPTY 3187
+#define QU_BTT_CLOCK_SPOON 3196
+#define MV_MAN13_PUTHAMMER 3206
+#define MSG_SC18_CLICKBOARD 3297
+#define MV_DMS_THREE 3321
+#define MV_MAN22_TRYTAKESOCK 3330
+#define MSG_SC23_ONSTOOL 3334
+#define QU_SC23_FROMSTOOL 3338
+#define MSG_SC23_FROMSTOOL 3339
+#define ST_DRP26_NORM 3347
+#define QU_MAN_DEF_STOPSHOES1_DEF 3393
+#define QU_MAN_DEF_STOPSHOES2 3396
+#define PIC_SC26_LADDER 3403
+#define ST_MAN_LADDERDOWN_R 3419
+#define QU_WMN_SHOWAFTER 3457
+#define MV_DRP24_TOFLOOR 3508
+#define QU_DRP24_TOWATER 3509
+#define QU_SC6_SND2 3577
+#define SND_8_001 3611
+#define SND_8_012 3622
+#define SND_8_023 3633
+#define QU_SC9_SND5 3649
+#define SND_9_011 3655
+#define QU_SC11_SND5 3689
+#define SND_16_009 3829
+#define SND_17_008 3872
+#define SND_17_019 3883
+#define QU_SC20_SND3 3936
+#define SND_20_010 3943
+#define QU_SC22_SND5 3988
+#define SND_22_030 4013
+#define SND_28_008 4155
+#define ST_SHD01_1 4205
+#define MV_MAN17_PUTBOOT 4223
+#define MV_LFT28_CLOSE 4242
+#define MV_CTS34_FALLRIGHT 4315
+#define ST_VNT34_RIGHT3 4318
+#define SND_29_007 4341
+#define SND_29_018 4352
+#define QU_SC30_SND2 4365
+#define QU_SC32_SND4 4400
+#define SND_32_020 4416
+#define SND_32_031 4427
+#define QU_SC33_SND5 4442
+#define PIC_MNU_CONTINUE_L 4626
+#define PIC_MSV_9_L 4668
+#define MV_LFT_TRY 4671
+#define ANI_BEARDED_28 4679
+#define PIC_SC11_WND2 4705
+#define MV_EYE30_SHOW 4713
+#define QU_EYE30_BLINK 4721
+#define MSG_SC15_STOPCHANTING 4753
+#define SND_29_029 4759
+#define SND_11_030 4885
+#define MV_GMA20_STD_DENY 4887
+#define SND_CMN_060 4921
+#define MV_BRDCMN_STOPR 4944
+#define rMV_KBK_TOTRUBA 4974
+#define MV_KBK_TURN_RL 4975
+#define SND_FIN_005 5011
+#define ST_FNFNG_BEFORE 5064
+#define MV_IN1MAN_0_1 5122
+#define SC_15 1139
+#define SC_26 1551
+#define PIC_SC8_LADDERD 1106
+#define MV_MAN22_TRYBOX 5303
+#define SND_5_026 5316
+#define SND_CMN_071 5317
+#define PIC_SC11_HINT 5170
+#define PIC_MAP_H17 5373
+#define PIC_MAP_H28 5382
+#define PIC_MAP_H06 5362
+#define SND_CMN_072 5352
+#define MV_EGTR_FATASK 5332
+#define PIC_CSR_ITN_GREEN 5330
+#define SND_11_031 5171
+#define SC_9 652
+#define SC_38 2072
+#define SND_FIN_017 5089
+#define PIC_CSR_ARCADE5 4906
+#define PIC_INV_POT_C 4848
+#define PIC_INV_SUGAR_H 4818
+#define PIC_INV_POTTIE_H 4814
+#define PIC_INV_MUG_H 4809
+#define PIC_INV_GUM_H 4803
+#define PIC_INV_BOTTLEFULL_H 4790
+#define PIC_TEST3 4784
+#define ST_TBE36_NORM 4751
+#define QU_SC28_LIFT0_START 4676
+#define MV_PDV_CUT_DENY 4586
+#define SND_34_030 4490
+#define QU_SC31_SND4 4387
+#define PIC_SC28_FRAME4 4264
+#define QU_SC28_LIFT1_START 4254
+#define ANI_MAN_28 4247
+#define SND_22_031 4002
+#define SND_21_021 3975
+#define SND_21_010 3964
+#define QU_SC21_SND5 3959
+#define SND_19_007 3920
+#define SND_18_008 3908
+#define SND_10_010 3676
+#define QU_SC10_SND5 3671
+#define QU_SC8_SND5 3639
+#define QU_SC7_SND4 3609
+#define SND_7_025 3605
+#define SND_7_014 3594
+#define SND_7_003 3583
+#define SND_6_026 3565
+#define SND_6_015 3552
+#define SND_6_004 3541
+#define SND_3_018 3534
+#define SND_4_028 3531
+#define SND_2_019 3513
+#define QU_SC25_TRYROWHAND_R 3494
+#define QU_MID_SPADE 3490
+#define MV_MAN27_SWAB2SPADE 3487
+#define ANI_BEARDED_CMN 3420
+#define MV_BTH_3_2 3362
+#define ST_VNT26_UP2 1948
+#define ST_GMS_BOOTLESS2 3316
+#define ST_BOY_TEMP 3283
+#define ANI_KOZAWKA_14 3261
+#define QU_SC5_SND2 3241
+#define QU_SC4_SND1 3235
+#define SND_4_017 3132
+#define SND_3_007 3106
+#define SND_2_008 3090
+#define SND_1_009 3073
+#define MSG_SC13_OPENBRIDGE 3064
+#define QU_STR_LTOR 3054
+#define rMV_STR_SHOW 3049
+#define MSG_SC11_HITMAN 3019
+#define MV_MOM_STOPBK 3013
+#define MSG_SC10_LADDERTOFORE 3004
+#define MV_MAN8_SITDOWN 2968
+#define ANI_MAMASHA_4 660
+#define ST_PMS_MINUS 2942
+#define MV_MAN_TOLADDER2 2841
+#define MV_LBN_0H 2834
+#define QU_SC30_ENTER_LIFTUP 2825
+#define ST_LBN_1H 2791
+#define LIFTBTN_8 2788
+#define ST_LBN_9P 2778
+#define ST_LBN_7N 2771
+#define ANI_LIFTBUTTON 2751
+#define QU_SC11_PUTBOOT2 2710
+#define ST_NBL_EMPTY 1078
+#define MV_NBL_OUT 1077
+#define ST_NBL_NORM 1076
+#define QU_SC34_LEAVEBOARD 2575
+#define ST_SPR_NORM 2517
+#define MSG_SC34_UNCLIMB 2492
+#define QU_CTS_BACK 2415
+#define MV_FLG_CYCLEL 2262
+#define QU_LEG_HIDE 2353
+#define QU_LEG_SHOW2 2348
+#define MV_LEG_POT0_MOVE1 2326
+#define MV_MAN29_STANDUP_NORM 2093
+#define MV_MAN29_TOPORTER_L 2087
+#define PIC_SC29_UTRUBA 2080
+#define QU_DRV_LOOKRIGHT 2033
+#define MV_DRV_FROMRIGHT_V 2013
+#define QU_SC26_OPEN1 1935
+#define PIC_SC25_STEP 1894
+#define rMV_MAN25_STARTROW 1889
+#define PIC_SC25_LADDERDOWN 1855
+#define ST_WTR24_FLOW 1836
+#define ST_JET24_FLOW 1839
+#define MV_MSH_CRANEOUT 1757
+#define ANI_MESHOK 1754
+#define MSG_SC23_SPINWHEEL3 1742
+#define ST_GRFB_SIT 1687
+#define PIC_SC22_LTRUBA 1584
+#define ANI_CORDIE 1529
+#define QU_SC19_MANJUMP1 1516
+#define MV_KSL_INBOY 1491
+#define ST_BOY18_WALKTO 1482
+#define MV_KSL_SWINGGIRL 1464
+#define QU_SMG_STARTFINGERS 1406
+#define MV_SMG_DENIES 1401
+#define MSG_SC16_HIDEWIRE 1349
+#define MV_GRL_LAUGH 1343
+#define MV_BOY_GOIN 1329
+#define MV_BAL14_FALL 1258
+#define ST_INV_BALL_default 1244
+#define MSG_SC13_UNEATGUM 1218
+#define QU_SC13_CLOSEBRIDGE 1214
+#define MV_SWR_1_2 1146
+#define ANI_SWINGER 1113
+#define MV_MAN_STOPLADDER 454
+#define MV_MAN9_SHOOT 922
+#define MV_PLV_BREATHE 920
+#define ST_BLK_OPEN 913
+#define PIC_INV_DOMINO 860
+#define ANI_INV_EGG 869
+#define ANI_INV_OLDDOMINO 367
+#define PIC_INV_OLDGLASSES 408
+#define QU_SLN_BOOT_KICK 846
+#define ANI_SLONIK 827
+#define MSG_SC7_SHOWBOX 816
+#define MV_MAN8_DRYGLADDER 787
+#define PIC_SC8_UTRUBA 753
+#define MV_HND_POINT 602
+#define ST_BTN_UP 600
+#define QU_EGTR_FATBOLTLEGS 533
+#define QU_EGTR_SLIMOBL 527
+#define QU_EGTR_SLIMTRAIN 525
+#define QU_EGTR_SLIMTOSORROW 524
+#define rMV_EGBR_KACHAET 461
+#define MV_MANEGTR_TAKESEGG 415
+#define MV_MANDYAS_GIVESCOIN 361
+#define MV_OTM_VNT_BOLTHEAD 433
+#define MV_MANEGBR_EGG2GLASSES 442
+#define QU_SC1_ENTER 320
+#define ST_KZW_PLANK 499
+#define MV_KZW_WALKPLANK 500
+#define MV_KZW_JUMPROTATE 561
+#define MV_KZW_STANDUP 563
+#define QU_OTM_GLS_MORGLEFT 638
+#define QU_OTM_BOX_MORGL 642
+#define QU_OTM_BOX_TURNR 644
+#define ST_MAN8_HANDSUP 773
+#define ST_MAN8_STAND 774
+#define MV_MAN7_BOX2HANDLE 801
+#define MV_VSN_DRYG 957
+#define PIC_SC10_DTRUBA 974
+#define PIC_SC10_LADDER 995
+#define MSG_SC1_SHOWOSK 1019
+#define MV_MAN_TURN_SDL 1084
+#define MV_MAN_TURN_SUL 1087
+#define QU_SWR_SWING 1118
+#define QU_SC13_ENTER_UP 1183
+#define MSG_SC13_SHOWGUM 1215
+#define ST_MAN14_KICK 1238
+#define QU_GMA_BLINK 1252
+#define MV_GMS_0_1 1271
+#define MSG_SC16_SHOWMAN 1358
+#define MSG_SC16_TESTMUG 1359
+#define MV_WHR19_SPIN 1317
+#define QU_SC14_STARTARCADE 1390
+#define ST_HND17_ATTRACT 1451
+#define QU_HND17_ATTRACT 1455
+#define PIC_SC18_RTRUBA 1520
+#define QU_SC21_ENTER_LEFT 1556
+#define ST_INV_EGGGLS_default 1575
+#define MV_GFA_BREATHESOCK 1591
+#define MV_GFA_SWINGSOCK 1597
+#define MV_GFA_TOSWING 1599
+#define QU_SC22_ENTER_DOWN 1620
+#define ST_GRFU_LEFT 1647
+#define QU_SC23_FROMCALENDAREXIT 1735
+#define MV_MAN21_BROOMTOCOIN 1772
+#define PIC_INV_LEVERHANDLE 1784
+#define MSG_SC22_HANDLEDOWN 1796
+#define QU_SC24_ENTER_UP 1830
+#define QU_SC25_TRYWATER 1906
+#define ANI_GIRAFFE_MIDDLE 1981
+#define MV_MAN27_THROWBET 1989
+#define ANI_VENT27 2058
+#define MV_PTR_MOVE 2083
+#define MSG_SC29_ENABLERIDEBACK 2105
+#define MV_STR1_SHOOT 2109
+#define ST_STR1_STAND 2110
+#define ST_ASS_EMPTY 2124
+#define QU_SC29_ESCAPE 2129
+#define ANI_SHELL_RED 2130
+#define MV_GLV_TOSMALL 2160
+#define MV_GLV_LOOKMAN 2167
+#define MV_BTL38_NORM 2189
+#define ANI_DOMINO38 2200
+#define QU_GLV_DRINK_NOHMR 2211
+#define QU_GLV_LOOKMAN_NOHMR 2213
+#define MSG_SC38_POINT 2226
+#define ST_FFT_PIPE 2240
+#define MV_FFT_LOOKFLAG 2247
+#define ST_CTS_EMPTY 2269
+#define MV_LEG_0_1 2343
+#define ANI_ROTOHRUST 2360
+#define MV_MAN32_STARTSPIN 2401
+#define ST_MAN32_SPIN 2402
+#define QU_CTS_GROWMAN 2417
+#define MV_GMA20_STL_NOSE 2433
+#define MV_CTS_CYCLEUP 2469
+#define MV_PDV_CUT_BREATHE 2526
+#define ST_INV_STOPPER_default 2537
+#define ST_GRD3_STAND 2579
+#define ANI_GUARD_37 2588
+#define PIC_INV_MUGFULL 2632
+#define MV_INV_MUGFULL_default 2634
+#define ST_TSTO_NORM 2658
+#define MSG_SC29_SHOWLASTGREEN 2730
+#define MV_MAN17_DRINK 2743
+#define QU_SC4_MANTOBOTTLE 2850
+#define MV_EGTR_MD2_DENY 2871
+#define ST_MOM_LIFT 2894
+#define QU_MOM_STANDUP 2899
+#define QU_VSN_FROML 2999
+#define MV_SWR_SPOLZING_NOVNT 3005
+#define ST_PCH_NORM 980
+#define SND_4_006 3121
+#define SND_5_005 3146
+#define SND_5_016 3157
+#define MV_MAN5_VNT2GLS 3184
+#define MV_MAN6_LOOK 3210
+#define rMV_MAN22_TAKETABUR 3337
+#define MSG_SC27_HANDLERTOFRONT 3371
+#define MV_MAN_STOPSHOES_2 3388
+#define MV_GFA_DENY_NOSOCK 3436
+#define QU_MAN_DEF_CLEAN_R 3463
+#define ST_GRFM_AFTER 3472
+#define QU_GRFU_OPENEYES 3478
+#define MSG_SC26_SHOWCHI 3495
+#define QU_SC6_SND3 3578
+#define SND_8_002 3612
+#define SND_8_013 3623
+#define SND_8_024 3634
+#define SND_9_001 3640
+#define SND_9_012 3656
+#define SND_11_020 3704
+#define SND_17_009 3873
+#define QU_SC20_SND4 3937
+#define SND_20_011 3944
+#define SND_28_009 4156
+#define ST_BRM_LIES2 4227
+#define ST_BOT1_NORM 4233
+#define ANI_LIFT_28 4238
+#define MSG_SC34_SHOWVENT 2481
+#define SND_29_008 4342
+#define SND_29_019 4353
+#define SND_30_001 4359
+#define QU_SC30_SND3 4366
+#define QU_SC32_SND5 4401
+#define SND_32_010 4406
+#define SND_32_021 4417
+#define SND_32_032 4428
+#define QU_SC33_SHOWMUGFULL 4454
+#define ST_BOX34_FLOOR 4565
+#define SC_MAINMENU 4620
+#define PIC_MNU_EXIT_L 4622
+#define PIC_MLD_CANCEL_D 4648
+#define PIC_MSV_1_D 4651
+#define PIC_SC28_DARK0 4675
+#define QU_EYE30_SHOW 4719
+#define MV_LEG31_HIDE 4724
+#define MV_BRDCMN_GOR 4735
+#define SND_CMN_050 4745
+#define MV_BOT15_NORM 4780
+#define PIC_CSR_ITN 4893
+#define SND_CMN_061 4922
+#define rMV_KBK_TURN_RL 4976
+#define SC_FINAL1 4999
+#define SND_FIN_006 5012
+#define ST_FNHND6_AFTER2 5070
+#define SND_FIN_028 5103
+#define MV_IN1MAN_GODOWN 5124
+#define SC_16 1140
+#define SC_27 1552
+#define PIC_MSV_SPACE_D 5190
+#define PIC_SC23_LADDERU 3411
+#define PIC_SC34_DTRUBA 2376
+#define QU_CTS34_FALLRIGHT 4317
+#define PIC_MAP_S31_1 5253
+#define PIC_MAP_H18 5394
+#define PIC_MAP_H29 5383
+#define PIC_MAP_H07 5363
+#define SND_CMN_073 5353
+#define PIC_MOV_OK 5344
+#define SC_MAP 5222
+#define QU_INTR_DUMMY 5168
+#define ST_IN1HAND_AFTER 5116
+#define ANI_IN1MAN 5110
+#define ANI_FN4MAN 5097
+#define SND_FIN_018 5090
+#define SND_FIN_007 5079
+#define ST_FNHND6_AFTER3 5076
+#define QU_FN3_DOFINAL 5072
+#define ST_FNHND5_BEFORE 5054
+#define ST_FCN_NORM 5017
+#define ST_FCN_EMTY 5016
+#define QU_BRD16_TURNR 4949
+#define MSG_SC9_STARTTIOTIA 4942
+#define ANI_EGGIE 4929
+#define SND_CMN_062 4927
+#define PIC_CSR_ARCADE6 4907
+#define SND_8_025 4870
+#define PIC_INV_STOOL_C 4852
+#define PIC_INV_EGGGLS_C 4838
+#define PIC_INV_EGGAPL_C 4833
+#define PIC_INV_APPLE 862
+#define QU_MAN_DEF_LOOKUP 4776
+#define ANI_TUBE_36 4749
+#define QU_LEG31_HIDE 4728
+#define MSG_SC28_TURNOFF_0 4678
+#define QU_DRV_PUSHBUTTON_NOVENT 4578
+#define SND_34_031 4491
+#define SND_34_020 4480
+#define SND_33_010 4447
+#define QU_SC31_SND5 4388
+#define SND_31_001 4377
+#define QU_SC28_LIFT6_START2 4295
+#define MV_MAN28_STOPWASH 4252
+#define MV_MAN28_WASH 4251
+#define QU_SC28_LIFT2_START 4246
+#define QU_SC25_TRYHAND 4219
+#define MSG_SC25_ENTERTRUBA 4214
+#define SND_21_022 3976
+#define SND_21_011 3965
+#define SND_19_008 3921
+#define SND_18_009 3909
+#define SND_13_030 3775
+#define SND_12_020 3740
+#define SND_10_011 3677
+#define QU_SC7_SND5 3610
+#define SND_7_015 3595
+#define SND_7_004 3584
+#define SND_6_027 3566
+#define SND_6_016 3553
+#define SND_6_005 3542
+#define SND_4_029 3535
+#define QU_SC25_TRYSPADE 3498
+#define MV_CHI_NORM 3484
+#define ST_WMN_AFTER 3455
+#define QU_SC28_ENTERWMN 3451
+#define MV_BTH_GOUP_5 3356
+#define ANI_BITAHANDLER 3349
+#define MV_CDI_LOOK 3312
+#define ST_BT16_NORM 3287
+#define ST_WR16_NORM 3284
+#define QU_GRL_FALL 3280
+#define QU_SC5_SND3 3242
+#define QU_SC4_SND2 3236
+#define QU_SC3_SND1 3230
+#define MV_MAN14_KICKGMA 3211
+#define QU_STR_THROWGLASSES_L 3203
+#define MV_STR_0_1 3198
+#define SND_4_018 3133
+#define SND_4_007 3122
+#define SND_3_008 3107
+#define SND_2_009 3091
+#define QU_STR_NOSE_L 3057
+#define SND_DBGMENU_001 2929
+#define QU_SC6_DROPS 2898
+#define ANI_FIRECAN_17 2860
+#define ST_MAN_GOLADDER2 2843
+#define ST_LBN_0H 2835
+#define MV_LBN_0 2831
+#define LIFTBTN_9 2789
+#define ST_LBN_8P 2775
+#define ST_LBN_6N 2768
+#define ST_KDK_NORM 2672
+#define PIC_SC37_MASK 2608
+#define MV_MAN34_BOARD_BUMP2 2571
+#define PIC_SC35_OUTLET 2518
+#define QU_SC34_SHOWSTOOL 2496
+#define MV_MAN20_PUTSTOOL 2461
+#define ANI_PUZODUV 2418
+#define MV_LEG_POT2_MOVE1 2335
+#define MV_LEG_POT1_MOVE2 2331
+#define MV_LEG_POT0_MOVE2 2327
+#define ST_LEG_DOWN 2325
+#define MV_ASS_HITRED 2139
+#define MSG_SC29_STOPRIDE 2107
+#define QU_SC29_MANFROM_L 2101
+#define PIC_SC28_FLOOR 2075
+#define ST_BTA_FALL 2054
+#define ST_DRV_SITNOVENT 1999
+#define ST_DRV_VENT 1996
+#define rMV_BRD25_RIGHT 1903
+#define QU_SC26_OPEN2 1937
+#define MV_MAN26_TURNVENT_L 1933
+#define ST_LUK23U_OPEN 1820
+#define ANI_LUK23_U 1817
+#define ANI_LUK23_D 1813
+#define PIC_SC22_MONETOPR 1809
+#define QU_SC22_FALLSACK 1791
+#define MV_MAN22_FALL 1751
+#define MV_MAN22_PUTTABUR 1748
+#define MSG_SC23_SPINWHEEL4 1743
+#define QU_GRFG_BLINKHAIR 1686
+#define QU_GRFG_SHOWHAIR 1685
+#define QU_GRFU_TURN_UL 1662
+#define rMV_MANEGBR_EGG2GLASSES 469
+#define QU_SC19_MANJUMP2 1517
+#define MSG_SC18_SHOWBOYJUMPTO 1497
+#define MV_MAN17_PUTSUGAR 1414
+#define PIC_SC17_BOX 1409
+#define ANI_WHIRLGIG_13 1383
+#define MV_BOY_DRINK 1333
+#define QU_WHR19_SPIN 1316
+#define MV_WHR18_SPIN 1300
+#define MV_MAN13_PUTFIRECAN 1311
+#define ANI_INV_BALL 1242
+#define MV_GMA_JUMPBK 1231
+#define QU_SC14_ENTER_RIGHT 1223
+#define MV_MAN13_HANDLEDOWN 1202
+#define MV_MAN13_THROWGUM 1194
+#define MV_SWR_SPOLZING 1148
+#define MSG_SC5_MAKEMANFLIGHT 1136
+#define QU_SC5_ENTER_UP 1135
+#define MV_MAN_HMRKICK 1028
+#define MV_SC2_BOX_default 1021
+#define MV_HDL6_default 1010
+#define MSG_SC10_CLICKGUM 992
+#define MSG_SC9_SHOWBALL 936
+#define ANI_PBAR 896
+#define ST_INV_HAMMER_default 886
+#define MV_INV_COIN_default 876
+#define ANI_INV_OLDGLASSES 402
+#define QU_SLN_POT_TURNBACK 852
+#define MV_SLN_POT_MORG 836
+#define MSG_TAKEBOTTLE 614
+#define MV_KZW_JUMPOUT 586
+#define MV_SPR_LOWER 543
+#define QU_SC3_ENTER 473
+#define QU_SC2_ENTER 472
+#define MV_DYAS_GIVESEGG 314
+#define ST_EGTR_SLAPPIN 346
+#define MV_EGTR_SLIMOBL 337
+#define MV_EGTR_TOSLAP 345
+#define MV_MANDYAS_GIVESBOOT 358
+#define MV_MANDYAS_GIVESDOM 375
+#define ST_MAN_INTRUBAHOR 446
+#define PIC_SC1_LTRUBA 470
+#define MV_MAN_FROMLADDERD 494
+#define QU_SC3_ENTER_RIGHT 705
+#define QU_BTT_CHESHET 757
+#define MV_BRD_DROPBALL 694
+#define ANI_LUKE 803
+#define PIC_INV_OLDHANDLE 798
+#define ST_INV_DOMINO_default 874
+#define MV_NDV_EAT 945
+#define QU_SC9_ENTER_RIGHT 963
+#define ANI_GUARD1 996
+#define ST_SC4_BOOT_default 1037
+#define ST_HDL6_LIES 1042
+#define MV_MAN_LIFTDOWN 1052
+#define MV_MAN_TURN_SLD 1079
+#define MV_MAN_TURN_SLU 1080
+#define PIC_SC8_LADDER 754
+#define MV_INV_GUM_default 1155
+#define PIC_SC13_UTRUBA 1170
+#define MV_STR_HIDE 1181
+#define MV_GMA_THROW 1232
+#define MV_GMS_DRYG 1269
+#define QU_SC17_ENTER_RIGHT 1325
+#define ANI_WIRE16 1344
+#define ST_INV_MUG_default 1372
+#define MSG_SC16_SHOWMUGFULL 1396
+#define QU_HND_TAKE0 1440
+#define MV_HND17_ASK 1447
+#define MV_MAN_TOLADDERD 1524
+#define ANI_INV_EGGDOM 1561
+#define ST_INV_EGGDOM_default 1563
+#define PIC_INV_EGGAPL 1578
+#define PIC_INV_EGGGLS 1580
+#define ANI_GRANDFA 1588
+#define QU_GFA_BREATHESOCK 1611
+#define MV_GRFU_BLINKDOWN 1652
+#define ANI_CALENDWHEEL 1702
+#define MV_CND_1_2 1706
+#define MSG_SC23_CLICKBTN1 1736
+#define MV_INV_LEVERHANDLE_default 1778
+#define PIC_INV_STOOL 1785
+#define QU_SC22_TOSTOOL 1801
+#define MV_INV_SWAB_default 1918
+#define MV_MAN26_OPENLUK 1934
+#define QU_GRFM_NECK 1988
+#define ST_DRV_RIGHT 2010
+#define PIC_SC27_FLOOR 2053
+#define MV_STR2_SHOOT 2112
+#define ST_STR2_STAND 2113
+#define MV_MAN38_PUTDOMINO 2186
+#define ANI_BOTTLE38 2188
+#define MV_DMN38_NORM2 2204
+#define QU_DLD_GLOT 2217
+#define MV_FFT_TUBE_OPENEYE 2235
+#define QU_GLV_PROPOSE 2280
+#define ST_MLS_LEFT2 2291
+#define MV_FFT_PIPE_FLOWOPEN 2300
+#define QU_FFT_TUBE_FLOWOPEN 2306
+#define ST_INV_TUBE_default 2316
+#define ANI_INV_PIPE 2317
+#define QU_SC30_ENTER_LEFT 2356
+#define ST_RHT_OPEN 2362
+#define MV_LEG_POT0_OUT 2374
+#define MV_MAN32_STOPSPIN 2404
+#define MV_MAN35_JUMPOUT 2411
+#define MV_GMA_1_2 2455
+#define ST_CTS31_EMPTY 2458
+#define QU_SC31_ENTER_DOWN 2459
+#define MSG_SC34_SHOWBOX 2497
+#define ST_PDV_CUT 2522
+#define QU_PDV_CUT_TRY 2529
+#define MV_INV_SCISSORS_default 2533
+#define ST_RNG_OPEN 2606
+#define ST_RNG_CLOSED 2607
+#define ST_GMA22_EMPTY 2611
+#define ST_VNT33_DOWN 2640
+#define MV_VNT33_TURND 2638
+#define ANI_TESTO_31 2652
+#define MV_TEST 2683
+#define MV_MAN11_PUTBOOT1 2702
+#define MV_BTS11_DOUBLE 2705
+#define QU_SC32_ENTER_UP 2714
+#define ANI_JET_17 2746
+#define QU_SC35_ENTERLIFT 2815
+#define QU_SC35_EXITLIFT 2816
+#define QU_SC32_ENTERLIFT 2827
+#define MV_EGTR_MD1_DENY 2866
+#define MV_EGTR_0_1 2918
+#define ANI_INV_EGGBLACK 357
+#define MV_EGTR_SLIMDENY 2933
+#define MSG_SC15_PULL 2940
+#define MSG_SC37_PULL 2945
+#define MV_MAN1_EGG2DOM 443
+#define ST_GRT1_NORM 2963
+#define MV_SWR_STAND 948
+#define QU_NTL_MOVE 3027
+#define MV_HDLR_RISE 3043
+#define SND_5_006 3147
+#define SND_5_017 3158
+#define MV_GLV_PUTDOMINO_NOHMR 3180
+#define PIC_SC17_PIPE 3292
+#define ST_MLS_RIGHT2 3323
+#define MV_MAN_SNEEZE 3386
+#define QU_SC6_SND4 3579
+#define SND_8_003 3613
+#define SND_8_014 3624
+#define SND_9_002 3641
+#define SND_9_013 3657
+#define SND_11_010 3694
+#define SND_11_021 3705
+#define SND_20_001 3929
+#define QU_SC20_SND5 3938
+#define SND_20_012 3945
+#define SND_22_010 3993
+#define SND_CMN_040 4033
+#define SND_22_032 1765
+#define MV_MAN25_STOPROW 1883
+#define PIC_SC28_DARK1 4266
+#define SND_29_009 4343
+#define SND_30_002 4360
+#define QU_SC30_SND4 4367
+#define SND_30_013 4378
+#define SND_32_011 4407
+#define SND_32_022 4418
+#define SND_32_033 4429
+#define SND_3_019 4549
+#define ANI_TEST 4552
+#define PIC_MSV_OK_D 4635
+#define PIC_MSV_CANCEL_D 4637
+#define PIC_MSV_2_D 4652
+#define QU_TBL_GOL 4708
+#define MV_EYE30_LOOK 4716
+#define ST_LEG31_NORM 4725
+#define SND_CMN_051 4746
+#define PIC_TEST4 4785
+#define PIC_CSR_GOL 4897
+#define SC_FINAL2 5000
+#define SND_FIN_029 5104
+#define ST_IN1GLS_NORM 5121
+#define ST_IN2BOOT_NORM 5142
+#define SC_17 1141
+#define SC_28 2062
+#define MSG_SC32_TRUBATOFRONT 5180
+#define PIC_SC2_LADDER2 5205
+#define QU_SC21_SND6 5214
+#define PIC_MAP_P10 5286
+#define ST_BTN32_OFF 5349
+#define PIC_HLP_BGR 3562
+#define PIC_MAP_S31_2 5254
+#define PIC_MAP_S32_1 5255
+#define PIC_MAP_H08 5364
+#define PIC_MOV_CANCEL 5345
+#define PIC_SC36_MASK 5221
+#define QU_MSH_CRANEOUT_GMA 5219
+#define SND_FIN_019 5091
+#define SND_FIN_008 5080
+#define QU_FN3_SHOWHMR 5073
+#define MSG_SC35_TRYFLY 4985
+#define QU_BRD16_GOR 4951
+#define ST_EGI_GOR 4931
+#define SND_CMN_063 4928
+#define PIC_CSR_ARCADE7 4909
+#define PIC_INV_GUM2_C 4858
+#define PIC_INV_VANTUZ_C 4856
+#define PIC_INV_TUBE_C 4855
+#define PIC_INV_SOCK_C 4851
+#define PIC_INV_PIPE_H 4812
+#define PIC_INV_MUG_H2 4810
+#define PIC_INV_BOTTLEFULL 1425
+#define PIC_SCD_RESTART 4766
+#define MSG_SC35_CHECKPIPESOUND 4761
+#define rMV_BRDCMN_GOR 4739
+#define ST_TBL_L 4701
+#define ANI_TENNBALL 4699
+#define MV_EGTR_MD2_SHOW 4695
+#define MV_BOT34_NORM 4561
+#define SND_34_032 4492
+#define SND_34_021 4481
+#define SND_34_010 4470
+#define SND_33_011 4448
+#define SND_31_002 4380
+#define ST_TTA_GOL 4292
+#define MV_TTA_TURN_DL 4291
+#define MSG_SC28_STARTWORK1 4255
+#define ST_MAN28_RIGHT 4249
+#define QU_SC28_LIFT3_START 4245
+#define SND_21_023 3977
+#define SND_21_012 3966
+#define SND_21_001 3950
+#define SND_19_009 3922
+#define SND_13_031 3776
+#define SND_13_020 3765
+#define SND_12_010 3730
+#define SND_10_012 3678
+#define SND_10_001 3662
+#define SND_7_016 3596
+#define SND_7_005 3585
+#define SND_6_028 3567
+#define SND_6_017 3556
+#define SND_6_006 3543
+#define SND_CMN_030 3470
+#define QU_SC28_WMN_END 3453
+#define MV_WMN28_IN_1 3443
+#define MV_BTH_4_3 3360
+#define MV_CDI_HIDEEYE 3313
+#define MV_MAN16_PUTBOOT 3288
+#define MV_BT16_FILL 3286
+#define QU_GRL_DRYG 3282
+#define MSG_SC14_STARTARCADE 3252
+#define QU_SC5_SND4 3243
+#define QU_SC4_SND3 3237
+#define QU_SC3_SND2 3231
+#define MV_STR_THROWGLASSES 3200
+#define MV_BTL38_FULL 3171
+#define SND_4_019 3134
+#define SND_4_008 3123
+#define SND_3_009 3108
+#define MV_HDLL_LOWER 3061
+#define MV_MID11_LOOK 3031
+#define QU_SC10_ENTER_DOWN 3003
+#define MV_BOT4_LEFT 2881
+#define MV_NDV_BLOW2 2855
+#define QU_SC38_ENTERLIFT 2836
+#define QU_SC10_ENTERLIFT 1067
+#define ST_LBN_5N 2765
+#define MSG_LIFT_GO 1065
+#define ST_LBN_7P 2772
+#define MV_LBN_1 2752
+#define ST_GRT9_GRIT 2722
+#define MV_PDV_GROW 2419
+#define PIC_SCD_30 2359
+#define ST_DMN38_6 2288
+#define MV_DMN38_NORM3 2250
+#define ST_PTR_NORM 2084
+#define QU_DRV_LOOKLEFT2 2034
+#define ST_BTA_NORM 2028
+#define MV_MID_LOOK 2023
+#define MV_MID_BROOM 2021
+#define MV_DRV_TORIGHT_V 2009
+#define ST_DRV_LEFT 2008
+#define ST_DRV_DRIVE 1997
+#define QU_SC26_OPEN3 1939
+#define ANI_GIRAFFE_TOP 1645
+#define ST_MSH_EMPTY 1758
+#define MV_MAN23_PUSH1 1724
+#define MV_GRFU_KISS 1682
+#define QU_GRFU_TURN_LU 1663
+#define MV_GRFB_0_1 1637
+#define PIC_SC21_UTRUBA 1554
+#define ST_CDI_EMPTY2 1543
+#define QU_SC19_MANJUMP3 1518
+#define ANI_BOY18 1477
+#define MV_KSL_JUMPBOY 1473
+#define MSG_SC17_FILLBOTTLE 1436
+#define QU_SC16_SHOWMUG 1361
+#define QU_SC13_SPIN 1386
+#define ANI_GUARD2 1279
+#define QU_GMA_JUMPBK 1251
+#define MV_INV_GUM2_default 1205
+#define MV_SWR_2_3 1152
+#define MV_MAN_GOD 481
+#define MV_MAN_STARTLADDER 452
+#define MV_TEST_JUMPFW 1074
+#define MSG_SC2_PUTMANUP 1026
+#define MSG_SC6_BTNPUSH 1017
+#define QU_NDV_MORG 971
+#define ANI_INV_COIN 875
+#define PIC_INV_HANDLE 867
+#define ST_INV_OLDGLASSES_default 404
+#define ANI_INV_OLDHANDLE 795
+#define ANI_INV_OLDEGG 364
+#define PIC_INV_SEL 868
+#define QU_SLN_BOOT_MORG 847
+#define MV_SLN_BOOT_LOOK 833
+#define PIC_SCD_SEL 734
+#define GRID_SC6_MAMASHA 684
+#define MV_MAN_JUMPONPLANK 551
+#define QU_SC4_ENTER 539
+#define QU_EGTR_SLIMBOLTLEGS 523
+#define ANI_PLANK 501
+#define MV_MAN_GOU 460
+#define ST_MAN_GOR 326
+#define rMV_EGBR_LOWERHEAD 462
+#define ST_MAN_GOLADDERD 456
+#define MV_MAN_GOLADDERDOWN 455
+#define ST_OTM_GLS_RIGHT 423
+#define MV_EGBR_BRK_GLASSES 387
+#define ST_DYAS_SITSOPEN 309
+#define ST_DYAS_SITSTOUS 312
+#define MV_DYAS_OPENBOX_LIES 323
+#define rMV_MAN_TOTRUBAHOR 447
+#define PIC_SC4_LTRUBA 506
+#define QU_SC4_GOCLOCK 595
+#define MV_MOM_SHAKE 663
+#define QU_SC6_ENTER_LEFT 708
+#define QU_BTT_DRINK 758
+#define ST_HGN_LOOK 811
+#define QU_SC9_EATBALL 942
+#define ST_VSN_LEFT 954
+#define PIC_SC10_RTRUBA 973
+#define MSG_SC2_HIDELADDER 1023
+#define QU_STR_PLUU 1189
+#define MV_HDLL_0_1 1210
+#define QU_SC16_ENTER_LEFT 1294
+#define MSG_SC16_STARTLAUGH 1374
+#define MV_MUG_0_1 1297
+#define ST_BOTTLE_FULL 1431
+#define QU_HND_TAKE1 1441
+#define QU_SC21_ENTER_UP 1629
+#define MV_GRFU_TURN_UL 1653
+#define MV_GRFU_STARTCHMOK 1657
+#define MSG_SC23_CLICKBTN2 1737
+#define MV_MAN22_HANDLEDOWN 1795
+#define PIC_SC21_DTRUBA 1823
+#define QU_SC25_LADDERUP 1925
+#define MV_CHI_SHOW 1958
+#define PIC_SC27_HITZONE 2055
+#define ANI_SHOOTER1 2108
+#define QU_DLD_ICK 2219
+#define MV_FFT_TUBE_STOP 2238
+#define MV_FFT_PIPE_BLINK 2248
+#define ANI_CACTUS 2267
+#define MV_LEG_1_2 2344
+#define PIC_SC30_LTRUBA 2354
+#define MV_LEG_POT1_OUT 2369
+#define PIC_SC31_RTRUBA 2440
+#define ANI_CACTUS_31 2456
+#define QU_SC20_SHOWSTOOL 2466
+#define ST_CTS31_GROWN2 2472
+#define MV_STL34_PUTBOX 2487
+#define MSG_SC35_STARTFLOW 2523
+#define ANI_LUK_34 2541
+#define ST_GRD37_STAND 2590
+#define QU_GRD37_LOOKR 2598
+#define PIC_SC37_WALL1 2600
+#define MV_MAN33_PUTMUG 2621
+#define ST_MUG33_FULL 2626
+#define rMV_MAN_HMRKICK 2694
+#define MV_MAN11_PUTBOOT2 2703
+#define QU_SC11_SHOWBOOT 2708
+#define ANI_DOMINO_3 2732
+#define ST_MUG17_EMPTY 2739
+#define QU_SC32_ENTER_LIFTUP 2829
+#define MSG_SC6_TESTNUMBALLS 2904
+#define MV_MAN3_GIVEBLACK_1 2914
+#define MSG_SC8_STANDUP 2976
+#define ST_BTN6_ON 2994
+#define QU_VSN_TURNR 2998
+#define MV_SWR_SPOLZING_BALD 3006
+#define MSG_SC13_CLOSEBRIDGE 3046
+#define SND_5_007 3148
+#define SND_5_018 3159
+#define MV_RPE15_NORM 3256
+#define QU_SC38_SHOWHMR 2197
+#define MV_CLN_TUZH 3324
+#define MV_MAN22_STANDTABUR_R 3331
+#define QU_SC23_SHOWSTOOL 3335
+#define MSG_SC26_CLICKVENT 1947
+#define QU_MAN_DEF_STOPSHOES2_R 3402
+#define MV_SWR_DENY_BALD 3429
+#define MV_MAN22_TRYBOOT_NOSOCK 3434
+#define QU_SC6_SND5 3580
+#define SND_8_004 3614
+#define SND_8_015 3625
+#define SND_9_003 3642
+#define SND_9_014 3658
+#define SND_11_011 3695
+#define SND_11_022 3706
+#define SND_20_002 3930
+#define SND_20_013 3946
+#define SND_22_011 3994
+#define SND_22_022 4005
+#define SND_CMN_041 4034
+#define SND_22_033 1766
+#define MV_MAN1_FALL 4228
+#define PIC_SC28_FRAME6 4263
+#define PIC_SC28_DARK2 4267
+#define MSG_SC28_TURNOFF_1 4279
+#define SND_30_003 4361
+#define QU_SC30_SND5 4368
+#define SND_30_014 4379
+#define SND_32_001 4392
+#define SND_32_012 4408
+#define SND_32_023 4419
+#define SND_32_034 4430
+#define SND_35_020 4518
+#define MV_MAN34_STANDBOX_FLOOR 4569
+#define MV_CPT36_NORM 4601
+#define MV_RHT_CLOSE 2363
+#define MV_MAN34_PUTSTOOL_BOX 4613
+#define PIC_MNU_LOAD_D 4627
+#define PIC_MSV_EMPTY_L 4640
+#define PIC_MSV_3_D 4653
+#define PIC_MSV_DOTS_L 4669
+#define MV_TBL_WALKR 4706
+#define MV_EYE30_BLINK 4717
+#define QU_EYE30_LOOK 4720
+#define SND_CMN_052 4747
+#define PIC_TEST5 4786
+#define QU_BALL_WALKL 4920
+#define QU_BRD16_TRY 4955
+#define SC_FINAL3 5001
+#define ANI_FN2_HAND1 5028
+#define MV_IN2BOOT_FALL 5141
+#define SC_18 1142
+#define SC_29 2063
+#define SND_25_030 5175
+#define MSG_LIFT_CLOSEDOOR 5194
+#define MV_MAN23_TRYBROOM 5307
+#define PIC_MAP_P11 5287
+#define QU_SC23_ENTER_DOWNTOUP 5328
+#define PIC_MAP_H19 5393
+#define PIC_MAP_S30 5252
+#define PIC_MAP_S32_2 5256


Commit: b4bf88be4618e22a7707b042731ac4c9de8e874f
    https://github.com/scummvm/scummvm/commit/b4bf88be4618e22a7707b042731ac4c9de8e874f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-04T01:53:13-07:00

Commit Message:
FULLPIPE: Add engine to the build system

Changed paths:
    engines/configure.engines
    engines/engines.mk
    engines/plugins_table.h



diff --git a/engines/configure.engines b/engines/configure.engines
index 15aa11d..d9360fe 100644
--- a/engines/configure.engines
+++ b/engines/configure.engines
@@ -13,6 +13,7 @@ add_engine cruise "Cinematique evo 2" yes
 add_engine draci "Dragon History" yes
 add_engine drascula "Drascula: The Vampire Strikes Back" yes
 add_engine dreamweb "Dreamweb" yes
+add_engine fullpipe "Full Pipe" yes
 add_engine gob "Gobli*ns" yes
 add_engine groovie "Groovie" yes "groovie2" "7th Guest"
 add_engine groovie2 "Groovie 2 games" no
diff --git a/engines/engines.mk b/engines/engines.mk
index b905a28..6771748 100644
--- a/engines/engines.mk
+++ b/engines/engines.mk
@@ -61,6 +61,11 @@ DEFINES += -DENABLE_DREAMWEB=$(ENABLE_DREAMWEB)
 MODULES += engines/dreamweb
 endif
 
+ifdef ENABLE_FULLPIPE
+DEFINES += -DENABLE_FULLPIPE=$(ENABLE_FULLPIPE)
+MODULES += engines/fullpipe
+endif
+
 ifdef ENABLE_GOB
 DEFINES += -DENABLE_GOB=$(ENABLE_GOB)
 MODULES += engines/gob
diff --git a/engines/plugins_table.h b/engines/plugins_table.h
index 4497945..5c2309e 100644
--- a/engines/plugins_table.h
+++ b/engines/plugins_table.h
@@ -29,6 +29,9 @@ LINK_PLUGIN(DRASCULA)
 #if PLUGIN_ENABLED_STATIC(DREAMWEB)
 LINK_PLUGIN(DREAMWEB)
 #endif
+#if PLUGIN_ENABLED_STATIC(FULLPIPE)
+LINK_PLUGIN(FULLPIPE)
+#endif
 #if PLUGIN_ENABLED_STATIC(GOB)
 LINK_PLUGIN(GOB)
 #endif


Commit: 26e6f5086046ad824c6338fc78ea49f9d71f0dbd
    https://github.com/scummvm/scummvm/commit/26e6f5086046ad824c6338fc78ea49f9d71f0dbd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-04T01:53:13-07:00

Commit Message:
FULLPIPE: Initial engine skeleton with detection

Changed paths:
  A engines/fullpipe/detection.cpp
  A engines/fullpipe/fullpipe.cpp
  A engines/fullpipe/fullpipe.h



diff --git a/engines/fullpipe/detection.cpp b/engines/fullpipe/detection.cpp
new file mode 100644
index 0000000..4cb46ba
--- /dev/null
+++ b/engines/fullpipe/detection.cpp
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "base/plugins.h"
+
+#include "engines/advancedDetector.h"
+#include "common/file.h"
+
+#include "fullpipe/fullpipe.h"
+
+
+namespace Fullpipe {
+
+const char *FullpipeEngine::getGameId() const {
+	return _gameDescription->gameid;
+}
+
+}
+
+static const PlainGameDescriptor fullpipeGames[] = {
+	{"fullpipe", "Full Pipe"},
+	{0, 0}
+};
+
+namespace Fullpipe {
+
+static const ADGameDescription gameDescriptions[] = {
+
+	// Fullpipe Russian version
+	{
+		"fullpipe",
+		0,
+		AD_ENTRY1s("0654.sc2", "099f54f86d33ad2395f3b854b7e05058", 2272),
+		Common::RU_RUS,
+		Common::kPlatformWindows,
+		ADGF_NO_FLAGS,
+		GUIO1(GUIO_NONE)
+	},
+
+	// Fullpipe German version
+	{
+		"fullpipe",
+		0,
+		AD_ENTRY1s("0654.sc2", "d8743351fc53d205f42d91f6d791e51b", 2272),
+		Common::RU_RUS,
+		Common::kPlatformWindows,
+		ADGF_NO_FLAGS,
+		GUIO1(GUIO_NONE)
+	},
+
+	AD_TABLE_END_MARKER
+};
+
+} // End of namespace Fullpipe
+
+class FullpipeMetaEngine : public AdvancedMetaEngine {
+public:
+	FullpipeMetaEngine() : AdvancedMetaEngine(Fullpipe::gameDescriptions, sizeof(ADGameDescription), fullpipeGames) {
+		_singleid = "fullpipe";
+	}
+
+	virtual const char *getName() const {
+		return "Fullpipe Engine";
+	}
+
+	virtual const char *getOriginalCopyright() const {
+		return "Fullpipe Engine (C) Pipe Studio";
+	}
+
+	virtual bool hasFeature(MetaEngineFeature f) const;
+	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+};
+
+bool FullpipeMetaEngine::hasFeature(MetaEngineFeature f) const {
+	return false;
+}
+
+bool Fullpipe::FullpipeEngine::hasFeature(EngineFeature f) const {
+	return false;
+}
+
+bool FullpipeMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+	if (desc) {
+		*engine = new Fullpipe::FullpipeEngine(syst, desc);
+	}
+	return desc != 0;
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(FULLPIPE)
+	REGISTER_PLUGIN_DYNAMIC(FULLPIPE, PLUGIN_TYPE_ENGINE, FullpipeMetaEngine);
+#else
+	REGISTER_PLUGIN_STATIC(FULLPIPE, PLUGIN_TYPE_ENGINE, FullpipeMetaEngine);
+#endif
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
new file mode 100644
index 0000000..23bae97
--- /dev/null
+++ b/engines/fullpipe/fullpipe.cpp
@@ -0,0 +1,81 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "base/plugins.h"
+
+#include "common/config-manager.h"
+
+#include "engines/util.h"
+
+#include "fullpipe/fullpipe.h"
+
+namespace Fullpipe {
+
+FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
+	// Setup mixer
+	if (!_mixer->isReady()) {
+		warning("Sound initialization failed.");
+	}
+
+	_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
+	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
+
+	_rnd = new Common::RandomSource("fullpipe");
+
+}
+
+FullpipeEngine::~FullpipeEngine() {
+	delete _rnd;
+}
+
+Common::Error FullpipeEngine::run() {
+	// Initialize backend
+	initGraphics(800, 600, true);
+
+	_isSaveAllowed = false;
+
+	return Common::kNoError;
+}
+
+void FullpipeEngine::updateEvents() {
+	Common::Event event;
+	Common::EventManager *eventMan = _system->getEventManager();
+
+	while (eventMan->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_KEYDOWN:
+			_keyState = event.kbd.keycode;
+			break;
+		case Common::EVENT_KEYUP:
+			_keyState = Common::KEYCODE_INVALID;
+			break;
+		case Common::EVENT_MOUSEMOVE:
+			_mouseX = event.mouse.x;
+			_mouseY = event.mouse.y;
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
new file mode 100644
index 0000000..f9b0368
--- /dev/null
+++ b/engines/fullpipe/fullpipe.h
@@ -0,0 +1,80 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_H
+#define FULLPIPE_H
+
+#include "common/scummsys.h"
+#include "common/events.h"
+#include "common/keyboard.h"
+#include "common/random.h"
+#include "common/savefile.h"
+#include "common/system.h"
+
+#include "audio/mixer.h"
+
+#include "graphics/surface.h"
+
+#include "engines/engine.h"
+
+struct ADGameDescription;
+
+namespace Fullpipe {
+
+enum FullpipeGameFeatures {
+};
+
+class FullpipeEngine : public ::Engine {
+protected:
+
+	Common::Error run();
+
+public:
+	FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc);
+	virtual ~FullpipeEngine();
+
+	// Detection related functions
+	const ADGameDescription *_gameDescription;
+	const char *getGameId() const;
+	Common::Platform getPlatform() const;
+	bool hasFeature(EngineFeature f) const;
+
+	Common::RandomSource *_rnd;
+
+	int _mouseX, _mouseY;
+	Common::KeyCode _keyState;
+	uint16 _buttonState;
+
+    void updateEvents();
+
+public:
+
+	bool _isSaveAllowed;
+
+	bool canLoadGameStateCurrently() { return _isSaveAllowed; }
+	bool canSaveGameStateCurrently() { return _isSaveAllowed; }
+
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_H */


Commit: c69415112f790091ba1a9545462078ae3960c72a
    https://github.com/scummvm/scummvm/commit/c69415112f790091ba1a9545462078ae3960c72a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:06-07:00

Commit Message:
FULLPIPE: Implemented NMI archive parser

Changed paths:
  A engines/fullpipe/ngiarchive.cpp
  A engines/fullpipe/ngiarchive.h
    engines/fullpipe/fullpipe.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 23bae97..5be5338 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -22,11 +22,13 @@
 
 #include "base/plugins.h"
 
+#include "common/archive.h"
 #include "common/config-manager.h"
 
 #include "engines/util.h"
 
 #include "fullpipe/fullpipe.h"
+#include "fullpipe/ngiarchive.h"
 
 namespace Fullpipe {
 
@@ -53,6 +55,8 @@ Common::Error FullpipeEngine::run() {
 
 	_isSaveAllowed = false;
 
+	Common::Archive *arch = makeNGIArchive("3896.nl");
+
 	return Common::kNoError;
 }
 
diff --git a/engines/fullpipe/ngiarchive.cpp b/engines/fullpipe/ngiarchive.cpp
new file mode 100644
index 0000000..801d020
--- /dev/null
+++ b/engines/fullpipe/ngiarchive.cpp
@@ -0,0 +1,181 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+#include "common/archive.h"
+
+#include "common/file.h"
+#include "common/hash-str.h"
+#include "common/memstream.h"
+#include "common/bufferedstream.h"
+#include "common/textconsole.h"
+
+#include "fullpipe/ngiarchive.h"
+
+namespace Fullpipe {
+
+#define NGI_FILENAME_MAX 13
+
+struct NgiHeader {
+	int32 pos;
+	int32 extVal;
+	int32 flags;
+	int32 size;
+	char  filename[NGI_FILENAME_MAX];
+};
+
+typedef Common::HashMap<Common::String, NgiHeader*, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> NgiHeadersMap;
+
+class NGIArchive : public Common::Archive {
+	NgiHeadersMap _headers;
+	Common::String _ngiFilename;
+
+public:
+	NGIArchive(const Common::String &name);
+	virtual ~NGIArchive();
+
+	// Archive implementation
+	virtual bool hasFile(const Common::String &name) const;
+	virtual int listMembers(Common::ArchiveMemberList &list) const;
+	virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
+	virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
+};
+
+NGIArchive::NGIArchive(const Common::String &filename) : _ngiFilename(filename) {
+	Common::File ngiFile;
+
+	if (!ngiFile.open(_ngiFilename)) {
+		warning("NGIArchive::NGIArchive(): Could not find the archive file");
+		return;
+	}
+
+	ngiFile.seek(4, SEEK_SET);
+
+	unsigned int count = ngiFile.readUint16LE(); // How many entries?
+
+	ngiFile.seek(20, SEEK_SET);
+
+	unsigned int key = ngiFile.readUint16LE();
+
+	byte key1, key2;
+
+	key1 = key & 0xff;
+	key2 = (key >> 8) & 0xff;
+
+	int fatSize = count * 32;
+
+	ngiFile.seek(32, SEEK_SET);
+
+	byte *fat = (byte *)calloc(fatSize, 1);
+
+	ngiFile.read(fat, fatSize);
+
+	for (int i = 0; i < fatSize; i++) {
+		key1 = (key1 << 1) ^ key2;
+		key2 = (key2 >> 1) ^ key1;
+
+		fat[i] ^= key1;
+	}
+
+	NgiHeader header;
+	NgiHeader *head;
+
+	for (uint i = 0; i < count; i++) {
+		memcpy(header.filename, &fat[i * 32], 12);
+		header.filename[12] = 0;
+		header.flags = READ_LE_UINT32(&fat[i * 32 + 16]);
+		header.extVal = READ_LE_UINT32(&fat[i * 32 + 20]);
+		header.pos = READ_LE_UINT32(&fat[i * 32 + 24]);
+		header.size = READ_LE_UINT32(&fat[i * 32 + 28]);
+
+		if (header.flags & 0x1e0) {
+			warning("File has flags: %.8x\n", header.flags & 0x1e0);
+		}
+
+		head = new NgiHeader(header);
+
+		_headers[header.filename] = head;
+	}
+
+	free(fat);
+
+	debug(0, "NGIArchive::NGIArchive(%s): Located %d files", filename.c_str(), _headers.size());
+}
+
+NGIArchive::~NGIArchive() {
+	debug(0, "NGIArchive Destructor Called");
+	NgiHeadersMap::iterator it = _headers.begin();
+	for ( ; it != _headers.end(); ++it) {
+		delete it->_value;
+	}
+}
+
+bool NGIArchive::hasFile(const Common::String &name) const {
+	return _headers.contains(name);
+}
+
+	int NGIArchive::listMembers(Common::ArchiveMemberList &list) const {
+	int matches = 0;
+
+	NgiHeadersMap::const_iterator it = _headers.begin();
+	for ( ; it != _headers.end(); ++it) {
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_value->filename, this)));
+		matches++;
+	}
+
+	return matches;
+}
+
+const Common::ArchiveMemberPtr NGIArchive::getMember(const Common::String &name) const {
+	if (!hasFile(name))
+		return Common::ArchiveMemberPtr();
+
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
+Common::SeekableReadStream *NGIArchive::createReadStreamForMember(const Common::String &name) const {
+	if (!_headers.contains(name)) {
+		return 0;
+	}
+
+	NgiHeader *hdr = _headers[name];
+
+	Common::File archiveFile;
+	archiveFile.open(_ngiFilename);
+	archiveFile.seek(hdr->pos, SEEK_SET);
+
+	// TODO: It would be good if ArjFile could decompress files in a streaming
+	// mode, so it would not need to pre-allocate the entire output.
+	byte *data = (byte *)malloc(hdr->size);
+	assert(data);
+
+	int32 len = archiveFile.read(data, hdr->size);
+	assert(len == hdr->size);
+
+	return new Common::MemoryReadStream(data, hdr->size, DisposeAfterUse::YES);
+}
+
+Common::Archive *makeNGIArchive(const Common::String &name) {
+	return new NGIArchive(name);
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/ngiarchive.h b/engines/fullpipe/ngiarchive.h
new file mode 100644
index 0000000..ee977c6
--- /dev/null
+++ b/engines/fullpipe/ngiarchive.h
@@ -0,0 +1,42 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_NGIARCHIVE_H
+#define FULLPIPE_NGIARCHIVE_H
+
+#include "common/str.h"
+
+namespace Fullpipe {
+
+class Archive;
+
+/**
+ * This factory method creates an Archive instance corresponding to the content
+ * of the NGI compressed file with the given name.
+ *
+ * May return 0 in case of a failure.
+ */
+Common::Archive *makeNGIArchive(const Common::String &name);
+
+} // End of namespace Fullpipe
+
+#endif


Commit: 7e1736cd7080f5a745d657b7edd37898a30a2da4
    https://github.com/scummvm/scummvm/commit/7e1736cd7080f5a745d657b7edd37898a30a2da4
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:06-07:00

Commit Message:
FULLPIPE: Added constants for object names and partial translation

Changed paths:
  A engines/fullpipe/objectnames.h



diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
new file mode 100644
index 0000000..a952002
--- /dev/null
+++ b/engines/fullpipe/objectnames.h
@@ -0,0 +1,233 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// This file is used in order to avoid usage of constants in Russian accross the code
+
+#define sO_ "\xc1\xe0\xe1\xf3\xeb\xff"	// "Бабуля"
+#define sO_Pool "\xc1\xe0\xf1\xf1\xe5\xe9\xed"	// "Бассейн"
+#define sO_ "\xc1\xe0\xf2\xf3\xf2\xe0"	// "Батута"
+#define sO_WithoutBoot "\xc1\xe5\xe7 \xe1\xee\xf2\xe8\xed\xea\xe0"	// "Без ботинка"
+#define sO_ "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xee\xe2"	// "Без горшков"
+#define sO_ "\xc1\xe5\xe7 \xea\xee\xe2\xf0\xe8\xea\xe0"	// "Без коврика"
+#define sO_WithoutCoin "\xc1\xe5\xe7 \xec\xee\xed\xe5\xf2\xfb"	// "Без монеты"
+#define sO_WithNothing "\xc1\xe5\xe7 \xed\xe8\xf7\xe5\xe3\xee"	// "Без ничего"
+#define sO_WithoutHandle "\xc1\xe5\xe7 \xf0\xf3\xf7\xea\xe8"	// "Без ручки"
+#define sO_WithoutStool "\xc1\xe5\xe7 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xe8"	// "Без табуретки"
+#define sO_WithoutBox "\xc1\xe5\xe7 \xff\xf9\xe8\xea\xe0"	// "Без ящика"
+#define sO_Blocked "\xc1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed"	// "Блокирован"
+#define sO_BlockedShe "\xc1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed\xe0"	// "Блокирована"
+#define sO_Awaken "\xc1\xee\xe4\xf0\xf1\xf2\xe2\xf3\xe5\xf2"	// "Бодрствует"
+#define sO_Boot_15 "\xc1\xee\xf2\xe8\xed\xee\xea_15"	// "Ботинок_15"
+#define sO_Bottle_38 "\xc1\xf3\xf2\xfb\xeb\xea\xe0_38"	// "Бутылка_38"
+#define sO_InSmokeRoom "\xc2 \xea\xf3\xf0\xe8\xeb\xea\xe5"	// "В курилке"
+#define sO_InSock "\xc2 \xed\xee\xf1\xea\xe5"	// "В носке"
+#define sO_InGlasses "\xc2 \xee\xf7\xea\xe0\xf5"	// "В очках"
+#define sO_ "\xc2_14"	// "В_14"
+#define sO_ "\xc2_32 \xeb\xe5\xe6\xe8\xf2"	// "В_32 лежит"
+#define sO_ "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2"	// "В_32 торчит"
+#define sO_ "\xc2_7"	// "В_7"
+#define sO_Valve1_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc1_26"	// "Вентиль1_26"
+#define sO_Valve2_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc2_26"	// "Вентиль2_26"
+#define sO_Valve3_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc3_26"	// "Вентиль3_26"
+#define sO_Valve4_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc4_26"	// "Вентиль4_26"
+#define sO_Valve5_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc5_26"	// "Вентиль5_26"
+#define sO_Valve_34 "\xc2\xe5\xed\xf2\xe8\xeb\xfc_34"	// "Вентиль_34"
+#define sO_UpperHatch_23 "\xc2\xe5\xf0\xf5\xed\xe8\xe9 \xeb\xfe\xea_23"	// "Верхний люк_23"
+#define sO_Taken "\xc2\xe7\xff\xf2"	// "Взят"
+#define sO_ "\xc2\xe8\xf1\xe8\xf2 \xed\xe0 \xf2\xf0\xf3\xe1\xe5"	// "Висит на трубе"
+#define sO_On "\xc2\xea\xeb"	// "Вкл"
+#define sO_TurnedOn "\xc2\xea\xeb\xfe\xf7\xe5\xed"	// "Включен"
+#define sO_ "\xc2\xf3\xe3\xeb\xf3\xf1\xe5\xe4"	// "Вуглусед"
+#define sO_Off "\xc2\xfb\xea\xeb"	// "Выкл"
+#define sO_ "\xc2\xfb\xea\xeb\xfe\xf7\xe5\xed"	// "Выключен"
+#define sO_ "\xc2\xfb\xf0\xee\xf1"	// "Вырос"
+#define sO_ "\xc3\xeb\xe0\xe2\xe0\xf0\xfc"	// "Главарь"
+#define sO_ "\xc3\xee\xf0\xf8\xee\xea"	// "Горшок"
+#define sO_ "\xc3\xf3\xeb\xff\xe5\xf2"	// "Гуляет"
+#define sO_Yes "\xc4\xe0"	// "Да"
+#define sO_ "\xc4\xe5\xe2\xee\xf7\xea\xe0"	// "Девочка"
+#define sO_ "\xc4\xe5\xe2\xee\xf7\xea\xe0-\xf1\xeb\xee\xed\xe8\xea"	// "Девочка-слоник"
+#define sO_ "\xc4\xe5\xe4\xf3\xf8\xea\xe0"	// "Дедушка"
+#define sO_ "\xc4\xee\xf1\xea\xe0_25"	// "Доска_25"
+#define sO_ "\xc4\xee\xf1\xea\xe0_34"	// "Доска_34"
+#define sO_ "\xc4\xff\xe4\xff \xef\xf0\xfb\xe3\xe0\xeb"	// "Дядя прыгал"
+#define sO_Dude "\xc4\xff\xe4\xff"	// "Дядя"
+#define sO_ "\xc4\xff\xe4\xff-\xff\xf9\xe8\xea"	// "Дядя-ящик"
+#define sO_ "\xc4\xff\xe4\xff_\xea\xe0\xf2\xe0\xeb\xf1\xff"	// "Дядя_катался"
+#define sO_Eats "\xc5\xf1\xf2"	// "Ест"
+#define sO_Present "\xc5\xf1\xf2\xfc"	// "Есть"
+#define sO_CloseThing1 "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5 1"	// "Закрываемое 1"
+#define sO_CloseThing2 "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5 2"	// "Закрываемое 2"
+#define sO_CloseThing3 "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5 3"	// "Закрываемое 3"
+#define sO_CloseThing "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5"	// "Закрываемое"
+#define sO_Closed "\xc7\xe0\xea\xf0\xfb\xf2"	// "Закрыт"
+#define sO_ClosedWithBoot "\xc7\xe0\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Закрыта с ботинком"
+#define sO_ClosedShe "\xc7\xe0\xea\xf0\xfb\xf2\xe0"	// "Закрыта"
+#define sO_ "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xed\xe0\xef\xee\xeb\xee\xe2\xe8\xed\xf3"	// "Заполнен наполовину"
+#define sO_ "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xf6\xe5\xeb\xe8\xea\xee\xec"	// "Заполнен целиком"
+#define sO_MirroredTo "\xc7\xe5\xf0\xea\xe0\xeb\xfc\xed\xe0\xff \xea"	// "Зеркальная к"
+#define sO_Playing "\xc8\xe3\xf0\xe0\xe5\xf2"	// "Играет"
+#define sO_Cactus "\xca\xe0\xea\xf2\xf3\xf1"	// "Кактус"
+#define sO_SwingingWithBoot "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Катается с ботинком"
+#define sO_Swinging "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff"	// "Катается"
+#define sO_ "\xca\xe0\xf7\xe5\xeb\xe5\xed\xff"	// "Качеленя"
+#define sO_LiftButtons "\xca\xed\xee\xef\xea\xe8 \xeb\xe8\xf4\xf2\xe0"	// "Кнопки лифта"
+#define sO_ "\xca\xee\xe2\xf0\xe8\xea_35"	// "Коврик_35"
+#define sO_Valve_35 "\xca\xf0\xe0\xed_35"	// "Кран_35"
+#define sO_Cup "\xca\xf0\xf3\xe6\xea\xe0"	// "Кружка"
+#define sO_ "\xca\xf3\xe1\xe8\xea"	// "Кубик"
+#define sO_LeftPipe_15 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_15"	// "Левая труба_15"
+#define sO_LeftPipe_26 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_26"	// "Левая труба_26"
+#define sO_LeftPipe_29 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_29"	// "Левая труба_29"
+#define sO_LeftPipe_30 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_30"	// "Левая труба_30"
+#define sO_LeftPipe_37 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_37"	// "Левая труба_37"
+#define sO_ "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xe2\xed\xe8\xe7_24"	// "Лестница вниз_24"
+#define sO_ "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xf1\xe2\xe5\xf0\xf5\xf3_8"	// "Лестница сверху_8"
+#define sO_Stairway "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0"	// "Лестница"
+#define sO_ "\xcb\xe5\xf2\xf3\xed\xfb"	// "Летуны"
+#define sO_Hatch_26 "\xcb\xfe\xea_26"	// "Люк_26"
+#define sO_Hatch_34 "\xcb\xfe\xea_34"	// "Люк_34"
+#define sO_ "\xcc\xe0\xec\xe0 \xf0\xf3\xf7\xea\xe8_32"	// "Мама ручки_32"
+#define sO_ "\xcc\xe0\xec\xe0\xf8\xe0"	// "Мамаша"
+#define sO_Bag_22 "\xcc\xe5\xf8\xee\xea_22"	// "Мешок_22"
+#define sO_CoinSlot_1 "\xcc\xee\xed\xe5\xf2\xee\xef\xf0\xe8\xe5\xec\xed\xe8\xea 1"	// "Монетоприемник 1"
+#define sO_CoinSlot_22 "\xcc\xee\xed\xe5\xf2\xee\xef\xf0\xe8\xe5\xec\xed\xe8\xea_22"	// "Монетоприемник_22"
+#define sO_CoinSlot_35 "\xcc\xee\xed\xe5\xf2\xee\xef\xf0\xe8\xe5\xec\xed\xe8\xea_35"	// "Монетоприемник_35"
+#define sO_Bridge "\xcc\xee\xf1\xf2"	// "Мост"
+#define sO_Fly_12 "\xcc\xf3\xf5\xe0_12"	// "Муха_12"
+#define sO_Fly_17 "\xcc\xf3\xf5\xe0_17"	// "Муха_17"
+#define sO_OnTheFloor "\xcd\xe0 \xef\xee\xeb\xf3"	// "На полу"
+#define sO_OnTheSpring "\xcd\xe0 \xef\xf0\xf3\xe6\xe8\xed\xe5"	// "На пружине"
+#define sO_OnTheTable "\xcd\xe0 \xf1\xf2\xee\xeb\xe5"	// "На столе"
+#define sO_OnStool "\xcd\xe0 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xe5"	// "На табуретке"
+#define sO_ "\xcd\xe0\xe4\xf3\xe2\xe0\xf2\xe5\xeb\xfc"	// "Надуватель"
+#define sO_NotTaken "\xcd\xe5 \xe2\xe7\xff\xf2"	// "Не взят"
+#define sO_NotHanging "\xcd\xe5 \xe2\xe8\xf1\xe8\xf2"	// "Не висит"
+#define sO_NotGrown "\xcd\xe5 \xe2\xfb\xf0\xee\xf1"	// "Не вырос"
+#define sO_ "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee"	// "Не колол яйцо"
+#define sO_ "\xcd\xe5 \xed\xe0\xe9\xe4\xe5\xed\xee \xe8\xec\xff \xef\xee \xed\xee\xec\xe5\xf0\xf3 "	// "Не найдено имя по номеру "
+#define sO_ "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0"	// "Недоступна"
+#define sO_ "\xcd\xe5\xeb\xfc\xe7\xff \xe2\xe7\xff\xf2\xfc"	// "Нельзя взять"
+#define sO_No "\xcd\xe5\xf2"	// "Нет"
+#define sO_LowerHatch_23 "\xcd\xe8\xe6\xed\xe8\xe9 \xeb\xfe\xea_23"	// "Нижний люк_23"
+#define sO_LowerPipe "\xcd\xe8\xe6\xed\xff\xff \xf2\xf0\xf3\xe1\xe0"	// "Нижняя труба"
+#define sO_LowerPipe_21 "\xcd\xe8\xe6\xed\xff\xff \xf2\xf0\xf3\xe1\xe0_21"	// "Нижняя труба_21"
+#define sO_WantsNothing "\xcd\xe8\xf7\xe5\xe3\xee \xed\xe5 \xf5\xee\xf7\xe5\xf2"	// "Ничего не хочет"
+#define sO_ "\xcd\xee\xf0\xea\xe0 \xea\xee\xe7\xff\xe2\xea\xe8"	// "Норка козявки"
+#define sO_Sock_26 "\xcd\xee\xf1\xee\xea_26"	// "Носок_26"
+#define sO_ "\xce\xf1\xfc \xf7\xe0\xf1\xee\xe2"	// "Ось часов"
+#define sO_Opened "\xce\xf2\xea\xf0\xfb\xf2"	// "Открыт"
+#define sO_OpenedWithBoot "\xce\xf2\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Открыта с ботинком"
+#define sO_OpenedShe "\xce\xf2\xea\xf0\xfb\xf2\xe0"	// "Открыта"
+#define sO_ "\xce\xf2\xec\xee\xf0\xee\xe6\xe5\xed\xed\xfb\xe9"	// "Отмороженный"
+#define sO_ "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Отсутствует"
+#define sO_Error "\xce\xf8\xe8\xe1\xea\xe0"	// "Ошибка"
+#define sO_Passive "\xcf\xe0\xf1\xf1\xe8\xe2\xed\xe0"	// "Пассивна"
+#define sO_First "\xcf\xe5\xf0\xe2\xfb\xe9"	// "Первый"
+#define sO_UpsideDown "\xcf\xe5\xf0\xe5\xe2\xe5\xf0\xed\xf3\xf2\xe0"	// "Перевернута"
+#define sO_Overfull "\xcf\xe5\xf0\xe5\xef\xee\xeb\xed\xe5\xed"	// "Переполнен"
+#define sO_ "\xcf\xee\xe6\xe0\xf0\xed\xe8\xea"	// "Пожарник"
+#define sO_ "\xcf\xee\xea\xe0\xe7\xfb\xe2\xe0\xe5\xf2 \xef\xff\xf2\xea\xf3"	// "Показывает пятку"
+#define sO_FullPipe "\xcf\xee\xeb\xed\xe0\xff \xd2\xf0\xf3\xe1\xe0"	// "Полная Труба"
+#define sO_RightStairs_9 "\xcf\xf0\xe0\xe2\xe0\xff \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe0_9"	// "Правая лестница_9"
+#define sO_RightPipe_17 "\xcf\xf0\xe0\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_17"	// "Правая труба_17"
+#define sO_Present "\xcf\xf0\xe8\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Присутствует"
+#define sO_SwallenEgg "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xee\xe5 \xff\xe9\xf6\xee"	// "Проглоченное яйцо"
+#define sO_SwallenEggs "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xfb\xe5 \xff\xe9\xf6\xe0"	// "Проглоченные яйца"
+#define sO_ "\xcf\xf3\xe7\xee\xe4\xf3\xe2"	// "Пузодув"
+#define sO_Empty "\xcf\xf3\xf1\xf2"	// "Пуст"
+#define sO_EmptyShe "\xcf\xf3\xf1\xf2\xe0\xff"	// "Пустая"
+#define sO_ "\xcf\xf3\xf2\xfc \xea \xf2\xf0\xf3\xe1\xe5"	// "Путь к трубе"
+#define sO_Drinking "\xcf\xfc\xe5\xf2"	// "Пьет"
+#define sO_BrokenInPieces "\xd0\xe0\xe7\xe1\xe8\xf2\xe0"	// "Разбита"
+#define sO_ "\xd0\xe0\xe7\xe1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed"	// "Разблокирован"
+#define sO_ "\xd0\xe0\xe7\xe2\xe5\xf0\xed\xf3\xf2"	// "Развернут"
+#define sO_ "\xd0\xee\xf2\xee\xf5\xf0\xf3\xf1"	// "Ротохрус"
+#define sO_ "\xd0\xf3\xea\xe0 \xc1\xe8\xeb\xe5\xf2\xe5\xf0\xf8\xe8"	// "Рука Билетерши"
+#define sO_ "\xd0\xf3\xea\xee\xff\xf2\xea\xe0 \xf0\xfb\xf7\xe0\xe3\xe0_23"	// "Рукоятка рычага_23"
+#define sO_ "\xd0\xf3\xf7\xea\xe0 \xee\xf2 \xf7\xe0\xf1\xee\xe2"	// "Ручка от часов"
+#define sO_Lever_23 "\xd0\xfb\xf7\xe0\xe3_23"	// "Рычаг_23"
+#define sO_WithDudeOnLeft "\xd1 \xc4\xff\xe4\xe5\xe9 \xf1\xeb\xe5\xe2\xe0"	// "С Дядей слева"
+#define sO_WithDudeOnRight "\xd1 \xc4\xff\xe4\xe5\xe9 \xf1\xef\xf0\xe0\xe2\xe0"	// "С Дядей справа"
+#define sO_WithBoot "\xd1 \xe1\xe0\xf8\xec\xe0\xea\xee\xec"	// "С башмаком"
+#define sO_WithBig "\xd1 \xe1\xee\xeb\xfc\xf8\xe8\xec"	// "С большим"
+#define sO_WithPlunger "\xd1 \xe2\xe0\xed\xf2\xf3\xe7\xee\xec"	// "С вантузом"
+#define sO_ "\xd1 \xe3\xee\xf0\xf8\xea\xee\xec"	// "С горшком"
+#define sO_WithGum "\xd1 \xe6\xe2\xe0\xf7\xea\xee\xe9"	// "С жвачкой"
+#define sO_ "\xd1 \xeb\xee\xef\xe0\xf2\xee\xe9"	// "С лопатой"
+#define sO_ "\xd1 \xec\xe0\xeb\xfb\xec"	// "С малым"
+#define sO_WithHammer "\xd1 \xec\xee\xeb\xee\xf2\xea\xee\xec"	// "С молотком"
+#define sO_WithCoin "\xd1 \xec\xee\xed\xe5\xf2\xee\xe9"	// "С монетой"
+#define sO_WithSock "\xd1 \xed\xee\xf1\xea\xee\xec"	// "С носком"
+#define sO_ "\xd1 \xef\xf0\xee\xe1\xea\xee\xe9"	// "С пробкой"
+#define sO_ "\xd1 \xf0\xf3\xeb\xe5\xec"	// "С рулем"
+#define sO_WithHandle "\xd1 \xf0\xf3\xf7\xea\xee\xe9"	// "С ручкой"
+#define sO_WithApple "\xd1 \xff\xe1\xeb\xee\xea\xee\xec"	// "С яблоком"
+#define sO_WithBox "\xd1 \xff\xf9\xe8\xea\xee\xec"	// "С ящиком"
+#define sO_Sugar "\xd1\xe0\xf5\xe0\xf0\xee\xea"	// "Сахарок"
+#define sO_ "\xd1\xe2\xe5\xf0\xed\xf3\xf2"	// "Свернут"
+#define sO_Sitting "\xd1\xe8\xe4\xe8\xf2"	// "Сидит"
+#define sO_Laughing "\xd1\xec\xe5\xe5\xf2\xf1\xff"	// "Смеется"
+#define sO_ "\xd1\xee \xe2\xf1\xe5\xec\xe8"	// "Со всеми"
+#define sO_ "\xd1\xee \xf8\xe2\xe0\xe1\xf0\xee\xe9"	// "Со шваброй"
+#define sO_ "\xd1\xee \xf8\xeb\xe0\xed\xe3\xee\xec"	// "Со шлангом"
+#define sO_ "\xd1\xee \xf9\xe5\xf2\xea\xee\xe9"	// "Со щеткой"
+#define sO_Sleeping "\xd1\xef\xe8\xf2"	// "Спит"
+#define sO_OnRight "\xd1\xef\xf0\xe0\xe2\xe0"	// "Справа"
+#define sO_ "\xd1\xf2\xee\xe8\xf2 \xe2 \xe1\xee\xf2\xe8\xed\xea\xe0\xf5"	// "Стоит в ботинках"
+#define sO_ "\xd1\xf2\xee\xe8\xf2 \xe2 \xf3\xe3\xeb\xf3"	// "Стоит в углу"
+#define sO_Guardian "\xd1\xf2\xee\xf0\xee\xe6"	// "Сторож"
+#define sO_Guard_1 "\xd1\xf2\xf0\xe0\xe6 1"	// "Страж 1"
+#define sO_Gurad_2 "\xd1\xf2\xf0\xe0\xe6 2"	// "Страж 2"
+#define sO_Guard_3 "\xd1\xf2\xf0\xe0\xe6 3"	// "Страж 3"
+#define sO_Stool_34 "\xd2\xe0\xe1\xf3\xf0\xe5\xf2_34"	// "Табурет_34"
+#define sO_Pipe_9 "\xd2\xf0\xf3\xe1\xe0_9"	// "Труба_9"
+#define sO_ "\xd2\xf3\xec\xe1\xe0_16"	// "Тумба_16"
+#define sO_ "\xd2\xf3\xec\xe1\xe0_17"	// "Тумба_17"
+#define sO_ "\xd2\xf3\xec\xe1\xe0_33"	// "Тумба_33"
+#define sO_ "\xd3 \xc4\xff\xe4\xe8 \xed\xe0 \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe5"	// "У Дяди на лестнице"
+#define sO_ "\xd3 \xc4\xff\xe4\xe8"	// "У Дяди"
+#define sO_ "\xd3 \xf2\xf0\xf3\xe1\xfb \xf1 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xee\xe9"	// "У трубы с табуреткой"
+#define sO_ "\xd3 \xf2\xf0\xf3\xe1\xfb"	// "У трубы"
+#define sO_ "\xd3\xe1\xee\xf0\xf9\xe8\xea\xe8"	// "Уборщики"
+#define sO_ "\xd3\xe1\xee\xf0\xf9\xe8\xf6\xe0"	// "Уборщица"
+#define sO_ "\xd3\xe5\xf5\xe0\xeb\xe0"	// "Уехала"
+#define sO_ "\xd3\xef\xe0\xeb \xf0\xe0\xe7"	// "Упал раз"
+#define sO_ "\xd3\xef\xe0\xeb\xe0 \xf9\xe5\xf2\xea\xe0"	// "Упала щетка"
+#define sO_ScratchingBelly "\xd7\xe5\xf8\xe5\xf2 \xef\xf3\xe7\xee"	// "Чешет пузо"
+#define sO_Level0 "\xdd\xf2\xe0\xe6 0"	// "Этаж 0"
+#define sO_Level1 "\xdd\xf2\xe0\xe6 1"	// "Этаж 1"
+#define sO_Level2 "\xdd\xf2\xe0\xe6 2"	// "Этаж 2"
+#define sO_Level3 "\xdd\xf2\xe0\xe6 3"	// "Этаж 3"
+#define sO_Level4 "\xdd\xf2\xe0\xe6 4"	// "Этаж 4"
+#define sO_Level5 "\xdd\xf2\xe0\xe6 5"	// "Этаж 5"
+#define sO_Level6 "\xdd\xf2\xe0\xe6 6"	// "Этаж 6"
+#define sO_Level7 "\xdd\xf2\xe0\xe6 7"	// "Этаж 7"
+#define sO_Level8 "\xdd\xf2\xe0\xe6 8"	// "Этаж 8"
+#define sO_Level9 "\xdd\xf2\xe0\xe6 9"	// "Этаж 9"
+#define sO_ "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2 \xee\xf2\xe4\xe0\xeb \xec\xee\xed\xe5\xf2\xf3"	// "Яйцеглот отдал монету"
+#define sO_ "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2"	// "Яйцеглот"
+#define sO_ "\xdf\xe9\xf6\xe5\xea\xee\xeb"	// "Яйцекол"
+#define sO_ "\xdf\xe9\xf6\xee \xed\xe5 \xed\xe5\xf1\xe5\xf2"	// "Яйцо не несет"
+#define sO_Egg1 "\xdf\xe9\xf6\xee1"	// "Яйцо1"
+#define sO_Egg2 "\xdf\xe9\xf6\xee2"	// "Яйцо2"
+#define sO_Egg3 "\xdf\xe9\xf6\xee3"	// "Яйцо3"


Commit: 392093124bc820b2f910b7e76a31a85847c75496
    https://github.com/scummvm/scummvm/commit/392093124bc820b2f910b7e76a31a85847c75496
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:06-07:00

Commit Message:
FULLPIPE: translated rest of the object names

Changed paths:
    engines/fullpipe/objectnames.h



diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
index a952002..75c382b 100644
--- a/engines/fullpipe/objectnames.h
+++ b/engines/fullpipe/objectnames.h
@@ -22,17 +22,17 @@
 
 // This file is used in order to avoid usage of constants in Russian accross the code
 
-#define sO_ "\xc1\xe0\xe1\xf3\xeb\xff"	// "Бабуля"
+#define sO_Grandma "\xc1\xe0\xe1\xf3\xeb\xff"	// "Бабуля"
 #define sO_Pool "\xc1\xe0\xf1\xf1\xe5\xe9\xed"	// "Бассейн"
-#define sO_ "\xc1\xe0\xf2\xf3\xf2\xe0"	// "Батута"
+#define sO_TumyTrampie "\xc1\xe0\xf2\xf3\xf2\xe0"	// "Батута"
 #define sO_WithoutBoot "\xc1\xe5\xe7 \xe1\xee\xf2\xe8\xed\xea\xe0"	// "Без ботинка"
-#define sO_ "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xee\xe2"	// "Без горшков"
-#define sO_ "\xc1\xe5\xe7 \xea\xee\xe2\xf0\xe8\xea\xe0"	// "Без коврика"
+#define sO_WithoutJug "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xee\xe2"	// "Без горшков"
+#define sO_WithoutCarpet "\xc1\xe5\xe7 \xea\xee\xe2\xf0\xe8\xea\xe0"	// "Без коврика"
 #define sO_WithoutCoin "\xc1\xe5\xe7 \xec\xee\xed\xe5\xf2\xfb"	// "Без монеты"
 #define sO_WithNothing "\xc1\xe5\xe7 \xed\xe8\xf7\xe5\xe3\xee"	// "Без ничего"
 #define sO_WithoutHandle "\xc1\xe5\xe7 \xf0\xf3\xf7\xea\xe8"	// "Без ручки"
 #define sO_WithoutStool "\xc1\xe5\xe7 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xe8"	// "Без табуретки"
-#define sO_WithoutBox "\xc1\xe5\xe7 \xff\xf9\xe8\xea\xe0"	// "Без ящика"
+#define sO_WithoutDrawer "\xc1\xe5\xe7 \xff\xf9\xe8\xea\xe0"	// "Без ящика"
 #define sO_Blocked "\xc1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed"	// "Блокирован"
 #define sO_BlockedShe "\xc1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed\xe0"	// "Блокирована"
 #define sO_Awaken "\xc1\xee\xe4\xf0\xf1\xf2\xe2\xf3\xe5\xf2"	// "Бодрствует"
@@ -41,10 +41,10 @@
 #define sO_InSmokeRoom "\xc2 \xea\xf3\xf0\xe8\xeb\xea\xe5"	// "В курилке"
 #define sO_InSock "\xc2 \xed\xee\xf1\xea\xe5"	// "В носке"
 #define sO_InGlasses "\xc2 \xee\xf7\xea\xe0\xf5"	// "В очках"
-#define sO_ "\xc2_14"	// "В_14"
-#define sO_ "\xc2_32 \xeb\xe5\xe6\xe8\xf2"	// "В_32 лежит"
-#define sO_ "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2"	// "В_32 торчит"
-#define sO_ "\xc2_7"	// "В_7"
+#define sO_V_14 "\xc2_14"	// "В_14"
+#define sO_V_32_Lies "\xc2_32 \xeb\xe5\xe6\xe8\xf2"	// "В_32 лежит"
+#define sO_V_32_Stands "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2"	// "В_32 торчит"
+#define sO_V_7 "\xc2_7"	// "В_7"
 #define sO_Valve1_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc1_26"	// "Вентиль1_26"
 #define sO_Valve2_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc2_26"	// "Вентиль2_26"
 #define sO_Valve3_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc3_26"	// "Вентиль3_26"
@@ -53,26 +53,26 @@
 #define sO_Valve_34 "\xc2\xe5\xed\xf2\xe8\xeb\xfc_34"	// "Вентиль_34"
 #define sO_UpperHatch_23 "\xc2\xe5\xf0\xf5\xed\xe8\xe9 \xeb\xfe\xea_23"	// "Верхний люк_23"
 #define sO_Taken "\xc2\xe7\xff\xf2"	// "Взят"
-#define sO_ "\xc2\xe8\xf1\xe8\xf2 \xed\xe0 \xf2\xf0\xf3\xe1\xe5"	// "Висит на трубе"
+#define sO_HangsOnPipe "\xc2\xe8\xf1\xe8\xf2 \xed\xe0 \xf2\xf0\xf3\xe1\xe5"	// "Висит на трубе"
 #define sO_On "\xc2\xea\xeb"	// "Вкл"
 #define sO_TurnedOn "\xc2\xea\xeb\xfe\xf7\xe5\xed"	// "Включен"
-#define sO_ "\xc2\xf3\xe3\xeb\xf3\xf1\xe5\xe4"	// "Вуглусед"
+#define sO_HareTheNooksiter "\xc2\xf3\xe3\xeb\xf3\xf1\xe5\xe4"	// "Вуглусед"
 #define sO_Off "\xc2\xfb\xea\xeb"	// "Выкл"
-#define sO_ "\xc2\xfb\xea\xeb\xfe\xf7\xe5\xed"	// "Выключен"
-#define sO_ "\xc2\xfb\xf0\xee\xf1"	// "Вырос"
-#define sO_ "\xc3\xeb\xe0\xe2\xe0\xf0\xfc"	// "Главарь"
-#define sO_ "\xc3\xee\xf0\xf8\xee\xea"	// "Горшок"
-#define sO_ "\xc3\xf3\xeb\xff\xe5\xf2"	// "Гуляет"
+#define sO_TurnedOff "\xc2\xfb\xea\xeb\xfe\xf7\xe5\xed"	// "Выключен"
+#define sO_HasGrown "\xc2\xfb\xf0\xee\xf1"	// "Вырос"
+#define sO_Boss "\xc3\xeb\xe0\xe2\xe0\xf0\xfc"	// "Главарь"
+#define sO_Jug "\xc3\xee\xf0\xf8\xee\xea"	// "Горшок"
+#define sO_Strolling "\xc3\xf3\xeb\xff\xe5\xf2"	// "Гуляет"
 #define sO_Yes "\xc4\xe0"	// "Да"
-#define sO_ "\xc4\xe5\xe2\xee\xf7\xea\xe0"	// "Девочка"
-#define sO_ "\xc4\xe5\xe2\xee\xf7\xea\xe0-\xf1\xeb\xee\xed\xe8\xea"	// "Девочка-слоник"
-#define sO_ "\xc4\xe5\xe4\xf3\xf8\xea\xe0"	// "Дедушка"
-#define sO_ "\xc4\xee\xf1\xea\xe0_25"	// "Доска_25"
-#define sO_ "\xc4\xee\xf1\xea\xe0_34"	// "Доска_34"
-#define sO_ "\xc4\xff\xe4\xff \xef\xf0\xfb\xe3\xe0\xeb"	// "Дядя прыгал"
+#define sO_Girl "\xc4\xe5\xe2\xee\xf7\xea\xe0"	// "Девочка"
+#define sO_Elephantine "\xc4\xe5\xe2\xee\xf7\xea\xe0-\xf1\xeb\xee\xed\xe8\xea"	// "Девочка-слоник"
+#define sO_Grandpa "\xc4\xe5\xe4\xf3\xf8\xea\xe0"	// "Дедушка"
+#define sO_Plank_25 "\xc4\xee\xf1\xea\xe0_25"	// "Доска_25"
+#define sO_Plank_34 "\xc4\xee\xf1\xea\xe0_34"	// "Доска_34"
+#define sO_DudeJumped "\xc4\xff\xe4\xff \xef\xf0\xfb\xe3\xe0\xeb"	// "Дядя прыгал"
 #define sO_Dude "\xc4\xff\xe4\xff"	// "Дядя"
-#define sO_ "\xc4\xff\xe4\xff-\xff\xf9\xe8\xea"	// "Дядя-ящик"
-#define sO_ "\xc4\xff\xe4\xff_\xea\xe0\xf2\xe0\xeb\xf1\xff"	// "Дядя_катался"
+#define sO_GuvTheDrawer "\xc4\xff\xe4\xff-\xff\xf9\xe8\xea"	// "Дядя-ящик"
+#define sO_DudeSwinged "\xc4\xff\xe4\xff_\xea\xe0\xf2\xe0\xeb\xf1\xff"	// "Дядя_катался"
 #define sO_Eats "\xc5\xf1\xf2"	// "Ест"
 #define sO_Present "\xc5\xf1\xf2\xfc"	// "Есть"
 #define sO_CloseThing1 "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5 1"	// "Закрываемое 1"
@@ -82,32 +82,32 @@
 #define sO_Closed "\xc7\xe0\xea\xf0\xfb\xf2"	// "Закрыт"
 #define sO_ClosedWithBoot "\xc7\xe0\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Закрыта с ботинком"
 #define sO_ClosedShe "\xc7\xe0\xea\xf0\xfb\xf2\xe0"	// "Закрыта"
-#define sO_ "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xed\xe0\xef\xee\xeb\xee\xe2\xe8\xed\xf3"	// "Заполнен наполовину"
-#define sO_ "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xf6\xe5\xeb\xe8\xea\xee\xec"	// "Заполнен целиком"
+#define sO_HalfFull "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xed\xe0\xef\xee\xeb\xee\xe2\xe8\xed\xf3"	// "Заполнен наполовину"
+#define sO_Full "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xf6\xe5\xeb\xe8\xea\xee\xec"	// "Заполнен целиком"
 #define sO_MirroredTo "\xc7\xe5\xf0\xea\xe0\xeb\xfc\xed\xe0\xff \xea"	// "Зеркальная к"
 #define sO_Playing "\xc8\xe3\xf0\xe0\xe5\xf2"	// "Играет"
 #define sO_Cactus "\xca\xe0\xea\xf2\xf3\xf1"	// "Кактус"
 #define sO_SwingingWithBoot "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Катается с ботинком"
 #define sO_Swinging "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff"	// "Катается"
-#define sO_ "\xca\xe0\xf7\xe5\xeb\xe5\xed\xff"	// "Качеленя"
+#define sO_Swingie "\xca\xe0\xf7\xe5\xeb\xe5\xed\xff"	// "Качеленя"
 #define sO_LiftButtons "\xca\xed\xee\xef\xea\xe8 \xeb\xe8\xf4\xf2\xe0"	// "Кнопки лифта"
-#define sO_ "\xca\xee\xe2\xf0\xe8\xea_35"	// "Коврик_35"
+#define sO_Carpet_35 "\xca\xee\xe2\xf0\xe8\xea_35"	// "Коврик_35"
 #define sO_Valve_35 "\xca\xf0\xe0\xed_35"	// "Кран_35"
 #define sO_Cup "\xca\xf0\xf3\xe6\xea\xe0"	// "Кружка"
-#define sO_ "\xca\xf3\xe1\xe8\xea"	// "Кубик"
+#define sO_Cube "\xca\xf3\xe1\xe8\xea"	// "Кубик"
 #define sO_LeftPipe_15 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_15"	// "Левая труба_15"
 #define sO_LeftPipe_26 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_26"	// "Левая труба_26"
 #define sO_LeftPipe_29 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_29"	// "Левая труба_29"
 #define sO_LeftPipe_30 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_30"	// "Левая труба_30"
 #define sO_LeftPipe_37 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_37"	// "Левая труба_37"
-#define sO_ "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xe2\xed\xe8\xe7_24"	// "Лестница вниз_24"
-#define sO_ "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xf1\xe2\xe5\xf0\xf5\xf3_8"	// "Лестница сверху_8"
+#define sO_StarsDown_24 "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xe2\xed\xe8\xe7_24"	// "Лестница вниз_24"
+#define sO_StairsUp_8 "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xf1\xe2\xe5\xf0\xf5\xf3_8"	// "Лестница сверху_8"
 #define sO_Stairway "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0"	// "Лестница"
-#define sO_ "\xcb\xe5\xf2\xf3\xed\xfb"	// "Летуны"
+#define sO_Fliers "\xcb\xe5\xf2\xf3\xed\xfb"	// "Летуны"
 #define sO_Hatch_26 "\xcb\xfe\xea_26"	// "Люк_26"
 #define sO_Hatch_34 "\xcb\xfe\xea_34"	// "Люк_34"
-#define sO_ "\xcc\xe0\xec\xe0 \xf0\xf3\xf7\xea\xe8_32"	// "Мама ручки_32"
-#define sO_ "\xcc\xe0\xec\xe0\xf8\xe0"	// "Мамаша"
+#define sO_MommyOfHand_32 "\xcc\xe0\xec\xe0 \xf0\xf3\xf7\xea\xe8_32"	// "Мама ручки_32"
+#define sO_BigMumsy "\xcc\xe0\xec\xe0\xf8\xe0"	// "Мамаша"
 #define sO_Bag_22 "\xcc\xe5\xf8\xee\xea_22"	// "Мешок_22"
 #define sO_CoinSlot_1 "\xcc\xee\xed\xe5\xf2\xee\xef\xf0\xe8\xe5\xec\xed\xe8\xea 1"	// "Монетоприемник 1"
 #define sO_CoinSlot_22 "\xcc\xee\xed\xe5\xf2\xee\xef\xf0\xe8\xe5\xec\xed\xe8\xea_22"	// "Монетоприемник_22"
@@ -119,100 +119,99 @@
 #define sO_OnTheSpring "\xcd\xe0 \xef\xf0\xf3\xe6\xe8\xed\xe5"	// "На пружине"
 #define sO_OnTheTable "\xcd\xe0 \xf1\xf2\xee\xeb\xe5"	// "На столе"
 #define sO_OnStool "\xcd\xe0 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xe5"	// "На табуретке"
-#define sO_ "\xcd\xe0\xe4\xf3\xe2\xe0\xf2\xe5\xeb\xfc"	// "Надуватель"
+#define sO_Inflater "\xcd\xe0\xe4\xf3\xe2\xe0\xf2\xe5\xeb\xfc"	// "Надуватель"
 #define sO_NotTaken "\xcd\xe5 \xe2\xe7\xff\xf2"	// "Не взят"
 #define sO_NotHanging "\xcd\xe5 \xe2\xe8\xf1\xe8\xf2"	// "Не висит"
 #define sO_NotGrown "\xcd\xe5 \xe2\xfb\xf0\xee\xf1"	// "Не вырос"
-#define sO_ "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee"	// "Не колол яйцо"
-#define sO_ "\xcd\xe5 \xed\xe0\xe9\xe4\xe5\xed\xee \xe8\xec\xff \xef\xee \xed\xee\xec\xe5\xf0\xf3 "	// "Не найдено имя по номеру "
-#define sO_ "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0"	// "Недоступна"
-#define sO_ "\xcd\xe5\xeb\xfc\xe7\xff \xe2\xe7\xff\xf2\xfc"	// "Нельзя взять"
+#define sO_NotCrackedEggs "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee"	// "Не колол яйцо"
+#define sO_NotAvailable "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0"	// "Недоступна"
+#define sO_CannotTake "\xcd\xe5\xeb\xfc\xe7\xff \xe2\xe7\xff\xf2\xfc"	// "Нельзя взять"
 #define sO_No "\xcd\xe5\xf2"	// "Нет"
 #define sO_LowerHatch_23 "\xcd\xe8\xe6\xed\xe8\xe9 \xeb\xfe\xea_23"	// "Нижний люк_23"
 #define sO_LowerPipe "\xcd\xe8\xe6\xed\xff\xff \xf2\xf0\xf3\xe1\xe0"	// "Нижняя труба"
 #define sO_LowerPipe_21 "\xcd\xe8\xe6\xed\xff\xff \xf2\xf0\xf3\xe1\xe0_21"	// "Нижняя труба_21"
 #define sO_WantsNothing "\xcd\xe8\xf7\xe5\xe3\xee \xed\xe5 \xf5\xee\xf7\xe5\xf2"	// "Ничего не хочет"
-#define sO_ "\xcd\xee\xf0\xea\xe0 \xea\xee\xe7\xff\xe2\xea\xe8"	// "Норка козявки"
+#define sO_FriesPit "\xcd\xee\xf0\xea\xe0 \xea\xee\xe7\xff\xe2\xea\xe8"	// "Норка козявки"
 #define sO_Sock_26 "\xcd\xee\xf1\xee\xea_26"	// "Носок_26"
-#define sO_ "\xce\xf1\xfc \xf7\xe0\xf1\xee\xe2"	// "Ось часов"
+#define sO_ClockAxis "\xce\xf1\xfc \xf7\xe0\xf1\xee\xe2"	// "Ось часов"
 #define sO_Opened "\xce\xf2\xea\xf0\xfb\xf2"	// "Открыт"
 #define sO_OpenedWithBoot "\xce\xf2\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Открыта с ботинком"
 #define sO_OpenedShe "\xce\xf2\xea\xf0\xfb\xf2\xe0"	// "Открыта"
-#define sO_ "\xce\xf2\xec\xee\xf0\xee\xe6\xe5\xed\xed\xfb\xe9"	// "Отмороженный"
-#define sO_ "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Отсутствует"
+#define sO_WeirdWacko "\xce\xf2\xec\xee\xf0\xee\xe6\xe5\xed\xed\xfb\xe9"	// "Отмороженный"
+#define sO_NotFound "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Отсутствует"
 #define sO_Error "\xce\xf8\xe8\xe1\xea\xe0"	// "Ошибка"
 #define sO_Passive "\xcf\xe0\xf1\xf1\xe8\xe2\xed\xe0"	// "Пассивна"
 #define sO_First "\xcf\xe5\xf0\xe2\xfb\xe9"	// "Первый"
 #define sO_UpsideDown "\xcf\xe5\xf0\xe5\xe2\xe5\xf0\xed\xf3\xf2\xe0"	// "Перевернута"
 #define sO_Overfull "\xcf\xe5\xf0\xe5\xef\xee\xeb\xed\xe5\xed"	// "Переполнен"
-#define sO_ "\xcf\xee\xe6\xe0\xf0\xed\xe8\xea"	// "Пожарник"
-#define sO_ "\xcf\xee\xea\xe0\xe7\xfb\xe2\xe0\xe5\xf2 \xef\xff\xf2\xea\xf3"	// "Показывает пятку"
+#define sO_Fireman "\xcf\xee\xe6\xe0\xf0\xed\xe8\xea"	// "Пожарник"
+#define sO_ShowingHeel "\xcf\xee\xea\xe0\xe7\xfb\xe2\xe0\xe5\xf2 \xef\xff\xf2\xea\xf3"	// "Показывает пятку"
 #define sO_FullPipe "\xcf\xee\xeb\xed\xe0\xff \xd2\xf0\xf3\xe1\xe0"	// "Полная Труба"
 #define sO_RightStairs_9 "\xcf\xf0\xe0\xe2\xe0\xff \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe0_9"	// "Правая лестница_9"
 #define sO_RightPipe_17 "\xcf\xf0\xe0\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_17"	// "Правая труба_17"
 #define sO_Present "\xcf\xf0\xe8\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Присутствует"
-#define sO_SwallenEgg "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xee\xe5 \xff\xe9\xf6\xee"	// "Проглоченное яйцо"
-#define sO_SwallenEggs "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xfb\xe5 \xff\xe9\xf6\xe0"	// "Проглоченные яйца"
-#define sO_ "\xcf\xf3\xe7\xee\xe4\xf3\xe2"	// "Пузодув"
+#define sO_GulpedEgg "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xee\xe5 \xff\xe9\xf6\xee"	// "Проглоченное яйцо"
+#define sO_GulpedEggs "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xfb\xe5 \xff\xe9\xf6\xe0"	// "Проглоченные яйца"
+#define sO_BellyInflater "\xcf\xf3\xe7\xee\xe4\xf3\xe2"	// "Пузодув"
 #define sO_Empty "\xcf\xf3\xf1\xf2"	// "Пуст"
 #define sO_EmptyShe "\xcf\xf3\xf1\xf2\xe0\xff"	// "Пустая"
-#define sO_ "\xcf\xf3\xf2\xfc \xea \xf2\xf0\xf3\xe1\xe5"	// "Путь к трубе"
+#define sO_WayToPipe "\xcf\xf3\xf2\xfc \xea \xf2\xf0\xf3\xe1\xe5"	// "Путь к трубе"
 #define sO_Drinking "\xcf\xfc\xe5\xf2"	// "Пьет"
 #define sO_BrokenInPieces "\xd0\xe0\xe7\xe1\xe8\xf2\xe0"	// "Разбита"
-#define sO_ "\xd0\xe0\xe7\xe1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed"	// "Разблокирован"
-#define sO_ "\xd0\xe0\xe7\xe2\xe5\xf0\xed\xf3\xf2"	// "Развернут"
-#define sO_ "\xd0\xee\xf2\xee\xf5\xf0\xf3\xf1"	// "Ротохрус"
-#define sO_ "\xd0\xf3\xea\xe0 \xc1\xe8\xeb\xe5\xf2\xe5\xf0\xf8\xe8"	// "Рука Билетерши"
-#define sO_ "\xd0\xf3\xea\xee\xff\xf2\xea\xe0 \xf0\xfb\xf7\xe0\xe3\xe0_23"	// "Рукоятка рычага_23"
-#define sO_ "\xd0\xf3\xf7\xea\xe0 \xee\xf2 \xf7\xe0\xf1\xee\xe2"	// "Ручка от часов"
+#define sO_Unblocked "\xd0\xe0\xe7\xe1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed"	// "Разблокирован"
+#define sO_Unfolded "\xd0\xe0\xe7\xe2\xe5\xf0\xed\xf3\xf2"	// "Развернут"
+#define sO_Jawcrucnher "\xd0\xee\xf2\xee\xf5\xf0\xf3\xf1"	// "Ротохрус"
+#define sO_UsherHand "\xd0\xf3\xea\xe0 \xc1\xe8\xeb\xe5\xf2\xe5\xf0\xf8\xe8"	// "Рука Билетерши"
+#define sO_LeverHandle_23 "\xd0\xf3\xea\xee\xff\xf2\xea\xe0 \xf0\xfb\xf7\xe0\xe3\xe0_23"	// "Рукоятка рычага_23"
+#define sO_ClockHandle "\xd0\xf3\xf7\xea\xe0 \xee\xf2 \xf7\xe0\xf1\xee\xe2"	// "Ручка от часов"
 #define sO_Lever_23 "\xd0\xfb\xf7\xe0\xe3_23"	// "Рычаг_23"
 #define sO_WithDudeOnLeft "\xd1 \xc4\xff\xe4\xe5\xe9 \xf1\xeb\xe5\xe2\xe0"	// "С Дядей слева"
 #define sO_WithDudeOnRight "\xd1 \xc4\xff\xe4\xe5\xe9 \xf1\xef\xf0\xe0\xe2\xe0"	// "С Дядей справа"
 #define sO_WithBoot "\xd1 \xe1\xe0\xf8\xec\xe0\xea\xee\xec"	// "С башмаком"
 #define sO_WithBig "\xd1 \xe1\xee\xeb\xfc\xf8\xe8\xec"	// "С большим"
 #define sO_WithPlunger "\xd1 \xe2\xe0\xed\xf2\xf3\xe7\xee\xec"	// "С вантузом"
-#define sO_ "\xd1 \xe3\xee\xf0\xf8\xea\xee\xec"	// "С горшком"
+#define sO_WithJug "\xd1 \xe3\xee\xf0\xf8\xea\xee\xec"	// "С горшком"
 #define sO_WithGum "\xd1 \xe6\xe2\xe0\xf7\xea\xee\xe9"	// "С жвачкой"
-#define sO_ "\xd1 \xeb\xee\xef\xe0\xf2\xee\xe9"	// "С лопатой"
-#define sO_ "\xd1 \xec\xe0\xeb\xfb\xec"	// "С малым"
+#define sO_WithShovel "\xd1 \xeb\xee\xef\xe0\xf2\xee\xe9"	// "С лопатой"
+#define sO_WithTiny "\xd1 \xec\xe0\xeb\xfb\xec"	// "С малым"
 #define sO_WithHammer "\xd1 \xec\xee\xeb\xee\xf2\xea\xee\xec"	// "С молотком"
 #define sO_WithCoin "\xd1 \xec\xee\xed\xe5\xf2\xee\xe9"	// "С монетой"
 #define sO_WithSock "\xd1 \xed\xee\xf1\xea\xee\xec"	// "С носком"
-#define sO_ "\xd1 \xef\xf0\xee\xe1\xea\xee\xe9"	// "С пробкой"
-#define sO_ "\xd1 \xf0\xf3\xeb\xe5\xec"	// "С рулем"
+#define sO_WithCork "\xd1 \xef\xf0\xee\xe1\xea\xee\xe9"	// "С пробкой"
+#define sO_WithSteering "\xd1 \xf0\xf3\xeb\xe5\xec"	// "С рулем"
 #define sO_WithHandle "\xd1 \xf0\xf3\xf7\xea\xee\xe9"	// "С ручкой"
 #define sO_WithApple "\xd1 \xff\xe1\xeb\xee\xea\xee\xec"	// "С яблоком"
-#define sO_WithBox "\xd1 \xff\xf9\xe8\xea\xee\xec"	// "С ящиком"
+#define sO_WithDrawer "\xd1 \xff\xf9\xe8\xea\xee\xec"	// "С ящиком"
 #define sO_Sugar "\xd1\xe0\xf5\xe0\xf0\xee\xea"	// "Сахарок"
-#define sO_ "\xd1\xe2\xe5\xf0\xed\xf3\xf2"	// "Свернут"
+#define sO_Convoluted "\xd1\xe2\xe5\xf0\xed\xf3\xf2"	// "Свернут"
 #define sO_Sitting "\xd1\xe8\xe4\xe8\xf2"	// "Сидит"
 #define sO_Laughing "\xd1\xec\xe5\xe5\xf2\xf1\xff"	// "Смеется"
-#define sO_ "\xd1\xee \xe2\xf1\xe5\xec\xe8"	// "Со всеми"
-#define sO_ "\xd1\xee \xf8\xe2\xe0\xe1\xf0\xee\xe9"	// "Со шваброй"
-#define sO_ "\xd1\xee \xf8\xeb\xe0\xed\xe3\xee\xec"	// "Со шлангом"
-#define sO_ "\xd1\xee \xf9\xe5\xf2\xea\xee\xe9"	// "Со щеткой"
+#define sO_WithEveryone "\xd1\xee \xe2\xf1\xe5\xec\xe8"	// "Со всеми"
+#define sO_WithMop "\xd1\xee \xf8\xe2\xe0\xe1\xf0\xee\xe9"	// "Со шваброй"
+#define sO_WithHose "\xd1\xee \xf8\xeb\xe0\xed\xe3\xee\xec"	// "Со шлангом"
+#define sO_WithBrush "\xd1\xee \xf9\xe5\xf2\xea\xee\xe9"	// "Со щеткой"
 #define sO_Sleeping "\xd1\xef\xe8\xf2"	// "Спит"
 #define sO_OnRight "\xd1\xef\xf0\xe0\xe2\xe0"	// "Справа"
-#define sO_ "\xd1\xf2\xee\xe8\xf2 \xe2 \xe1\xee\xf2\xe8\xed\xea\xe0\xf5"	// "Стоит в ботинках"
-#define sO_ "\xd1\xf2\xee\xe8\xf2 \xe2 \xf3\xe3\xeb\xf3"	// "Стоит в углу"
+#define sO_StandsInBoots "\xd1\xf2\xee\xe8\xf2 \xe2 \xe1\xee\xf2\xe8\xed\xea\xe0\xf5"	// "Стоит в ботинках"
+#define sO_StandsInCorner "\xd1\xf2\xee\xe8\xf2 \xe2 \xf3\xe3\xeb\xf3"	// "Стоит в углу"
 #define sO_Guardian "\xd1\xf2\xee\xf0\xee\xe6"	// "Сторож"
 #define sO_Guard_1 "\xd1\xf2\xf0\xe0\xe6 1"	// "Страж 1"
 #define sO_Gurad_2 "\xd1\xf2\xf0\xe0\xe6 2"	// "Страж 2"
 #define sO_Guard_3 "\xd1\xf2\xf0\xe0\xe6 3"	// "Страж 3"
 #define sO_Stool_34 "\xd2\xe0\xe1\xf3\xf0\xe5\xf2_34"	// "Табурет_34"
 #define sO_Pipe_9 "\xd2\xf0\xf3\xe1\xe0_9"	// "Труба_9"
-#define sO_ "\xd2\xf3\xec\xe1\xe0_16"	// "Тумба_16"
-#define sO_ "\xd2\xf3\xec\xe1\xe0_17"	// "Тумба_17"
-#define sO_ "\xd2\xf3\xec\xe1\xe0_33"	// "Тумба_33"
-#define sO_ "\xd3 \xc4\xff\xe4\xe8 \xed\xe0 \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe5"	// "У Дяди на лестнице"
-#define sO_ "\xd3 \xc4\xff\xe4\xe8"	// "У Дяди"
-#define sO_ "\xd3 \xf2\xf0\xf3\xe1\xfb \xf1 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xee\xe9"	// "У трубы с табуреткой"
-#define sO_ "\xd3 \xf2\xf0\xf3\xe1\xfb"	// "У трубы"
-#define sO_ "\xd3\xe1\xee\xf0\xf9\xe8\xea\xe8"	// "Уборщики"
-#define sO_ "\xd3\xe1\xee\xf0\xf9\xe8\xf6\xe0"	// "Уборщица"
-#define sO_ "\xd3\xe5\xf5\xe0\xeb\xe0"	// "Уехала"
-#define sO_ "\xd3\xef\xe0\xeb \xf0\xe0\xe7"	// "Упал раз"
-#define sO_ "\xd3\xef\xe0\xeb\xe0 \xf9\xe5\xf2\xea\xe0"	// "Упала щетка"
+#define sO_Pedestal_16 "\xd2\xf3\xec\xe1\xe0_16"	// "Тумба_16"
+#define sO_Pedestal_17 "\xd2\xf3\xec\xe1\xe0_17"	// "Тумба_17"
+#define sO_Pedestal_33 "\xd2\xf3\xec\xe1\xe0_33"	// "Тумба_33"
+#define sO_NearDudesStairs "\xd3 \xc4\xff\xe4\xe8 \xed\xe0 \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe5"	// "У Дяди на лестнице"
+#define sO_NearDude "\xd3 \xc4\xff\xe4\xe8"	// "У Дяди"
+#define sO_NearPipeWithStool "\xd3 \xf2\xf0\xf3\xe1\xfb \xf1 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xee\xe9"	// "У трубы с табуреткой"
+#define sO_NearPipe "\xd3 \xf2\xf0\xf3\xe1\xfb"	// "У трубы"
+#define sO_Janitors "\xd3\xe1\xee\xf0\xf9\xe8\xea\xe8"	// "Уборщики"
+#define sO_Janitress "\xd3\xe1\xee\xf0\xf9\xe8\xf6\xe0"	// "Уборщица"
+#define sO_Gone "\xd3\xe5\xf5\xe0\xeb\xe0"	// "Уехала"
+#define sO_FallenOnce "\xd3\xef\xe0\xeb \xf0\xe0\xe7"	// "Упал раз"
+#define sO_FallenBrush "\xd3\xef\xe0\xeb\xe0 \xf9\xe5\xf2\xea\xe0"	// "Упала щетка"
 #define sO_ScratchingBelly "\xd7\xe5\xf8\xe5\xf2 \xef\xf3\xe7\xee"	// "Чешет пузо"
 #define sO_Level0 "\xdd\xf2\xe0\xe6 0"	// "Этаж 0"
 #define sO_Level1 "\xdd\xf2\xe0\xe6 1"	// "Этаж 1"
@@ -224,10 +223,10 @@
 #define sO_Level7 "\xdd\xf2\xe0\xe6 7"	// "Этаж 7"
 #define sO_Level8 "\xdd\xf2\xe0\xe6 8"	// "Этаж 8"
 #define sO_Level9 "\xdd\xf2\xe0\xe6 9"	// "Этаж 9"
-#define sO_ "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2 \xee\xf2\xe4\xe0\xeb \xec\xee\xed\xe5\xf2\xf3"	// "Яйцеглот отдал монету"
-#define sO_ "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2"	// "Яйцеглот"
-#define sO_ "\xdf\xe9\xf6\xe5\xea\xee\xeb"	// "Яйцекол"
-#define sO_ "\xdf\xe9\xf6\xee \xed\xe5 \xed\xe5\xf1\xe5\xf2"	// "Яйцо не несет"
+#define sO_EggGulperGaveCoin "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2 \xee\xf2\xe4\xe0\xeb \xec\xee\xed\xe5\xf2\xf3"	// "Яйцеглот отдал монету"
+#define sO_EggGulper "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2"	// "Яйцеглот"
+#define sO_EggCracker "\xdf\xe9\xf6\xe5\xea\xee\xeb"	// "Яйцекол"
+#define sO_NotLayingEgg "\xdf\xe9\xf6\xee \xed\xe5 \xed\xe5\xf1\xe5\xf2"	// "Яйцо не несет"
 #define sO_Egg1 "\xdf\xe9\xf6\xee1"	// "Яйцо1"
 #define sO_Egg2 "\xdf\xe9\xf6\xee2"	// "Яйцо2"
 #define sO_Egg3 "\xdf\xe9\xf6\xee3"	// "Яйцо3"


Commit: 94f2adb8d6966b4306c00f647d2807b6ae9a6639
    https://github.com/scummvm/scummvm/commit/94f2adb8d6966b4306c00f647d2807b6ae9a6639
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:07-07:00

Commit Message:
FULLPIPE: Initial stub for all classes in loadGam()

Changed paths:
  A engines/fullpipe/objects.h
  A engines/fullpipe/stateloader.cpp
    engines/fullpipe/fullpipe.h



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index f9b0368..daa992b 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -43,6 +43,8 @@ namespace Fullpipe {
 enum FullpipeGameFeatures {
 };
 
+class CGameLoader;
+
 class FullpipeEngine : public ::Engine {
 protected:
 
@@ -66,6 +68,9 @@ public:
 
     void updateEvents();
 
+	CGameLoader *g_gameLoader;
+	bool loadGam(char *fname);
+
 public:
 
 	bool _isSaveAllowed;
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
new file mode 100644
index 0000000..e96de89
--- /dev/null
+++ b/engines/fullpipe/objects.h
@@ -0,0 +1,215 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_OBJECTS_H
+#define FULLPIPE_OBJECTS_H
+
+namespace Fullpipe {
+
+class CObject {
+	int vmt;
+};
+
+class CObList {
+	int vmt;
+	int m_pNodeHead;
+	int m_pNodeTail;
+	int m_nCount;
+	int m_pNodeFree;
+	int m_pBlocks;
+	int m_nBlockSize;
+};
+
+class CObArray {
+	CObject obj;
+	int m_pData;
+	int m_nSize;
+	int m_nMaxSize;
+	int m_nGrowBy;
+};
+
+class CNode {
+	int pNext;
+	CNode *pPrev;
+	void *data;
+};
+
+class CPtrList {
+	CObject obj;
+	CNode *m_pNodeHead;
+	int m_pNodeTail;
+	int m_nCount;
+	int m_pNodeFree;
+	int m_pBlocks;
+	int m_nBlockSize;
+};
+
+class SceneTagList {
+  CPtrList list;
+};
+
+class GameProject {
+	CObject obj;
+	int field_4;
+	char *headerFilename;
+	SceneTagList *sceneTagList;
+	void *field_10;
+};
+
+class CInteractionController {
+	CObject obj;
+	CObList interactions;
+	int16 field_20;
+	char gap_22[2];
+	int flag24;
+};
+
+class CInputControllerItemArray {
+	CObArray objs;
+};
+
+class CInputController {
+	CObject obj;
+	int flag;
+	int flags;
+	int cursorHandle;
+	int hCursor;
+	int field_14;
+	int cursorId;
+	int cursorIndex;
+	CInputControllerItemArray cursorsArray;
+	int cursorDrawX;
+	int cursorDrawY;
+	int cursorDrawWidth;
+	int cursorDrawHeight;
+	int cursorItemPicture;
+};
+
+class Sc2Array {
+	CObArray objs;
+};
+
+union VarValue {
+  int floatValue;
+  int intValue;
+  int stringValue;
+};
+
+class Message {
+	CObject obj;
+	int messageKind;
+	int16 parentId;
+	char gap_A[2];
+	int x;
+	int y;
+	int field_14;
+	int sceneClickX;
+	int sceneClickY;
+	int field_20;
+	int field_24;
+	int param28;
+	int field_2C;
+	int field_30;
+	int field_34;
+};
+
+class ExCommand {
+	Message msg;
+	int messageNum;
+	int field_3C;
+	int flags;
+	int parId;
+};
+
+class CGameVar {
+	CObject obj;
+	CGameVar *nextVarObj;
+	CGameVar *prevVarObj;
+	CGameVar *parentVarObj;
+	CGameVar *subVars;
+	int field_14;
+	char *stringObj;
+	VarValue value;
+	int varType;
+};
+
+class CGameLoader {
+ public:
+	bool loadFile(char *fname);
+
+ private:
+	CObject obj;
+	GameProject *gameProject;
+	CInteractionController *interactionController;
+	int field_C;
+	int field_10;
+	int field_14;
+	int field_18;
+	int field_1C;
+	int field_20;
+	int field_24;
+	int field_28;
+	int field_2C;
+	CInputController inputController;
+	int inventory;
+	int field_7C;
+	int field_80;
+	int field_84;
+	int field_88;
+	int field_8C;
+	int field_90;
+	int field_94;
+	int field_98;
+	int field_9C;
+	int field_A0;
+	int field_A4;
+	int field_A8;
+	int field_AC;
+	int field_B0;
+	int field_B4;
+	int field_B8;
+	int field_BC;
+	int field_C0;
+	int field_C4;
+	int field_C8;
+	int field_CC;
+	int field_D0;
+	int field_D4;
+	Sc2Array sc2array;
+	void *sceneSwitcher;
+	void *preloadCallback;
+	void *readSavegameCallback;
+	int16 field_F8;
+	int16 field_FA;
+	CObArray preloadItems;
+	CGameVar *gameVar;
+	char *gameName;
+	ExCommand exCommand;
+	int updateCounter;
+	int preloadId1;
+	int preloadId2;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_OBJECTS_H */
+
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
new file mode 100644
index 0000000..1959bff
--- /dev/null
+++ b/engines/fullpipe/stateloader.cpp
@@ -0,0 +1,39 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+#include "fullpipe/objects.h"
+
+namespace Fullpipe {
+
+bool FullpipeEngine::loadGam(char *fname) {
+	g_gameLoader = new CGameLoader();
+
+	if (g_gameLoader->loadFile(fname)) {
+		// TODO
+	} else
+		return false;
+
+	return true;
+}
+
+} // End of namespace Fullpipe


Commit: fa30dcef152aab077346ecf08e5436609535ef13
    https://github.com/scummvm/scummvm/commit/fa30dcef152aab077346ecf08e5436609535ef13
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:07-07:00

Commit Message:
FULLPIPE: Add loader for GameProject

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 5be5338..ca430fc 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -55,6 +55,8 @@ Common::Error FullpipeEngine::run() {
 
 	_isSaveAllowed = false;
 
+	loadGam("fullpipe.gam");
+
 	Common::Archive *arch = makeNGIArchive("3896.nl");
 
 	return Common::kNoError;
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index daa992b..d7bbe14 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -69,7 +69,11 @@ public:
     void updateEvents();
 
 	CGameLoader *g_gameLoader;
-	bool loadGam(char *fname);
+	bool loadGam(const char *fname);
+
+	int _gameProjectVersion;
+	int _gameProjectValue;
+	int _scrollSpeed;
 
 public:
 
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index e96de89..5e4b288 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -64,15 +64,21 @@ class CPtrList {
 };
 
 class SceneTagList {
-  CPtrList list;
+	CPtrList list;
+
+ public:
+	SceneTagList(Common::File &file);
 };
 
 class GameProject {
-	CObject obj;
-	int field_4;
-	char *headerFilename;
-	SceneTagList *sceneTagList;
-	void *field_10;
+	CObject _obj;
+	int _field_4;
+	char *_headerFilename;
+	SceneTagList *_sceneTagList;
+	int _field_10;
+
+ public:
+	GameProject(Common::File &file);
 };
 
 class CInteractionController {
@@ -154,59 +160,60 @@ class CGameVar {
 
 class CGameLoader {
  public:
-	bool loadFile(char *fname);
+	bool loadFile(const char *fname);
+	~CGameLoader();
 
  private:
-	CObject obj;
-	GameProject *gameProject;
-	CInteractionController *interactionController;
-	int field_C;
-	int field_10;
-	int field_14;
-	int field_18;
-	int field_1C;
-	int field_20;
-	int field_24;
-	int field_28;
-	int field_2C;
-	CInputController inputController;
-	int inventory;
-	int field_7C;
-	int field_80;
-	int field_84;
-	int field_88;
-	int field_8C;
-	int field_90;
-	int field_94;
-	int field_98;
-	int field_9C;
-	int field_A0;
-	int field_A4;
-	int field_A8;
-	int field_AC;
-	int field_B0;
-	int field_B4;
-	int field_B8;
-	int field_BC;
-	int field_C0;
-	int field_C4;
-	int field_C8;
-	int field_CC;
-	int field_D0;
-	int field_D4;
-	Sc2Array sc2array;
-	void *sceneSwitcher;
-	void *preloadCallback;
-	void *readSavegameCallback;
-	int16 field_F8;
-	int16 field_FA;
-	CObArray preloadItems;
+	CObject _obj;
+	GameProject *_gameProject;
+	CInteractionController *_interactionController;
+	int _field_C;
+	int _field_10;
+	int _field_14;
+	int _field_18;
+	int _field_1C;
+	int _field_20;
+	int _field_24;
+	int _field_28;
+	int _field_2C;
+	CInputController _inputController;
+	int _inventory;
+	int _field_7C;
+	int _field_80;
+	int _field_84;
+	int _field_88;
+	int _field_8C;
+	int _field_90;
+	int _field_94;
+	int _field_98;
+	int _field_9C;
+	int _field_A0;
+	int _field_A4;
+	int _field_A8;
+	int _field_AC;
+	int _field_B0;
+	int _field_B4;
+	int _field_B8;
+	int _field_BC;
+	int _field_C0;
+	int _field_C4;
+	int _field_C8;
+	int _field_CC;
+	int _field_D0;
+	int _field_D4;
+	Sc2Array _sc2array;
+	void *_sceneSwitcher;
+	void *_preloadCallback;
+	void *_readSavegameCallback;
+	int16 _field_F8;
+	int16 _field_FA;
+	CObArray _preloadItems;
 	CGameVar *gameVar;
-	char *gameName;
-	ExCommand exCommand;
-	int updateCounter;
-	int preloadId1;
-	int preloadId2;
+	char *_gameName;
+	ExCommand _exCommand;
+	int _updateCounter;
+	int _preloadId1;
+	int _preloadId2;
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 1959bff..9a45fad 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -21,11 +21,14 @@
  */
 
 #include "fullpipe/fullpipe.h"
+
+#include "common/file.h"
+
 #include "fullpipe/objects.h"
 
 namespace Fullpipe {
 
-bool FullpipeEngine::loadGam(char *fname) {
+bool FullpipeEngine::loadGam(const char *fname) {
 	g_gameLoader = new CGameLoader();
 
 	if (g_gameLoader->loadFile(fname)) {
@@ -36,4 +39,62 @@ bool FullpipeEngine::loadGam(char *fname) {
 	return true;
 }
 
+bool CGameLoader::loadFile(const char *fname) {
+	Common::File file;
+
+	if (!file.open(fname))
+		return false;
+
+	char *tmp;
+	int len = file.readByte();
+	tmp = (char *)calloc(len + 1, 1);
+	file.read(tmp, len);
+
+	_gameName = tmp;
+
+	_gameProject = new GameProject(file);
+
+	return true;
+}
+
+CGameLoader::~CGameLoader() {
+	free(_gameName);
+}
+
+GameProject::GameProject(Common::File &file) {
+	_field_4 = 0;
+	_headerFilename = 0;
+	_field_10 = 12;
+
+	// FIXME
+	int _gameProjectVersion = file.readUint32LE();
+	int _gameProjectValue = file.readUint16LE();
+	int _scrollSpeed = file.readUint32LE();
+
+	char *tmp;
+	int len = file.readByte();
+	tmp = (char *)calloc(len + 1, 1);
+	file.read(tmp, len);
+	
+	_headerFilename = tmp;
+
+	_sceneTagList = new SceneTagList(file);
+
+	debug(0, "_gameProjectVersion = %d", _gameProjectVersion);
+	debug(0, "_gameProjectValue = %d", _gameProjectValue);
+	debug(0, "_scrollSpeed = %d", _scrollSpeed);
+	debug(0, "_headerFilename = %s", _headerFilename);
+
+	if (_gameProjectVersion >= 3)
+		_field_4 = file.readUint32LE();
+
+	if (_gameProjectVersion >= 5) {
+		file.readUint32LE();
+		file.readUint32LE();
+	}
+}
+
+SceneTagList::SceneTagList(Common::File &file) {
+}
+
 } // End of namespace Fullpipe


Commit: 82cbf508b57f1b01ef06f0cd8dea9d53874203a4
    https://github.com/scummvm/scummvm/commit/82cbf508b57f1b01ef06f0cd8dea9d53874203a4
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:07-07:00

Commit Message:
FULLPIPE: Refactored pascal style string reader

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 5e4b288..dbeb7bc 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -67,7 +67,7 @@ class SceneTagList {
 	CPtrList list;
 
  public:
-	SceneTagList(Common::File &file);
+	SceneTagList(CFile &file);
 };
 
 class GameProject {
@@ -78,7 +78,8 @@ class GameProject {
 	int _field_10;
 
  public:
-	GameProject(Common::File &file);
+	GameProject(CFile &file);
+	~GameProject();
 };
 
 class CInteractionController {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 9a45fad..60b83a0 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -24,6 +24,7 @@
 
 #include "common/file.h"
 
+#include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
 
 namespace Fullpipe {
@@ -40,17 +41,12 @@ bool FullpipeEngine::loadGam(const char *fname) {
 }
 
 bool CGameLoader::loadFile(const char *fname) {
-	Common::File file;
+	CFile file;
 
 	if (!file.open(fname))
 		return false;
 
-	char *tmp;
-	int len = file.readByte();
-	tmp = (char *)calloc(len + 1, 1);
-	file.read(tmp, len);
-
-	_gameName = tmp;
+	_gameName = file.readPascalString();
 
 	_gameProject = new GameProject(file);
 
@@ -61,7 +57,7 @@ CGameLoader::~CGameLoader() {
 	free(_gameName);
 }
 
-GameProject::GameProject(Common::File &file) {
+GameProject::GameProject(CFile &file) {
 	_field_4 = 0;
 	_headerFilename = 0;
 	_field_10 = 12;
@@ -71,12 +67,7 @@ GameProject::GameProject(Common::File &file) {
 	int _gameProjectValue = file.readUint16LE();
 	int _scrollSpeed = file.readUint32LE();
 
-	char *tmp;
-	int len = file.readByte();
-	tmp = (char *)calloc(len + 1, 1);
-	file.read(tmp, len);
-	
-	_headerFilename = tmp;
+	_headerFilename = file.readPascalString();
 
 	_sceneTagList = new SceneTagList(file);
 
@@ -94,7 +85,11 @@ GameProject::GameProject(Common::File &file) {
 	}
 }
 
-SceneTagList::SceneTagList(Common::File &file) {
+GameProject::~GameProject() {
+	free(_headerFilename);
+}
+
+SceneTagList::SceneTagList(CFile &file) {
 }
 
 } // End of namespace Fullpipe


Commit: 146e5a92249e3b0ea7f4057d3a620b2ff837a57e
    https://github.com/scummvm/scummvm/commit/146e5a92249e3b0ea7f4057d3a620b2ff837a57e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:07-07:00

Commit Message:
FULLPIPE: Read SceneTags from fullpipe.gam

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index dbeb7bc..69b12d0 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -47,24 +47,23 @@ class CObArray {
 	int m_nGrowBy;
 };
 
-class CNode {
-	int pNext;
-	CNode *pPrev;
-	void *data;
-};
+class SceneTag {
+	CObject _obj;
+	int _field_4;
+	char *_tag;
+	int _scene;
+	int16 _sceneId;
+	int16 _field_12;
 
-class CPtrList {
-	CObject obj;
-	CNode *m_pNodeHead;
-	int m_pNodeTail;
-	int m_nCount;
-	int m_pNodeFree;
-	int m_pBlocks;
-	int m_nBlockSize;
+ public:
+	SceneTag(CFile &file);
+	~SceneTag();
 };
 
+typedef Common::List<SceneTag> SceneTagList_;
+
 class SceneTagList {
-	CPtrList list;
+	SceneTagList_ list;
 
  public:
 	SceneTagList(CFile &file);
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 60b83a0..e50bbb2 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -23,6 +23,7 @@
 #include "fullpipe/fullpipe.h"
 
 #include "common/file.h"
+#include "common/list.h"
 
 #include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
@@ -90,6 +91,29 @@ GameProject::~GameProject() {
 }
 
 SceneTagList::SceneTagList(CFile &file) {
+	int numEntries = file.readUint16LE();
+
+	debug(0, "numEntries: %d", numEntries);
+
+	for (int i = 0; i < numEntries; i++) {
+		SceneTag *t = new SceneTag(file);
+		list.push_back(*t);
+	}
+}
+
+SceneTag::SceneTag(CFile &file) {
+	_field_4 = 0;
+	_scene = 0;
+
+	_sceneId = file.readUint16LE();
+
+	_tag = file.readPascalString();
+
+	debug(0, "sceneId: %d  tag: %s", _sceneId, _tag);
+}
+
+SceneTag::~SceneTag() {
+	free(_tag);
 }
 
 } // End of namespace Fullpipe


Commit: 4eb91762744a1235129467200f16754e85e4d3c2
    https://github.com/scummvm/scummvm/commit/4eb91762744a1235129467200f16754e85e4d3c2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:07-07:00

Commit Message:
FULLPIPE: Moved global variables to fullpipe.cpp

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index ca430fc..f4d502d 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -32,6 +32,10 @@
 
 namespace Fullpipe {
 
+int g_gameProjectVersion = 0;
+int g_gameProjectValue = 0;
+int g_scrollSpeed = 0;
+
 FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
 	// Setup mixer
 	if (!_mixer->isReady()) {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index d7bbe14..a6a58ff 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -45,6 +45,11 @@ enum FullpipeGameFeatures {
 
 class CGameLoader;
 
+extern int g_gameProjectVersion;
+extern int g_gameProjectValue;
+extern int g_scrollSpeed;
+
+
 class FullpipeEngine : public ::Engine {
 protected:
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index e50bbb2..ffeb0b6 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -48,14 +48,23 @@ bool CGameLoader::loadFile(const char *fname) {
 		return false;
 
 	_gameName = file.readPascalString();
+	debug(0, "_gameName: %s", _gameName);
 
 	_gameProject = new GameProject(file);
 
+	if (g_gameProjectVersion < 12) {
+		error("Old gameProjectVersion: %d", g_gameProjectVersion);
+	}
+
+	_gameName = file.readPascalString();
+	debug(0, "_gameName: %s", _gameName);
+
 	return true;
 }
 
 CGameLoader::~CGameLoader() {
 	free(_gameName);
+	delete _gameProject;
 }
 
 GameProject::GameProject(CFile &file) {
@@ -63,24 +72,23 @@ GameProject::GameProject(CFile &file) {
 	_headerFilename = 0;
 	_field_10 = 12;
 
-	// FIXME
-	int _gameProjectVersion = file.readUint32LE();
-	int _gameProjectValue = file.readUint16LE();
-	int _scrollSpeed = file.readUint32LE();
+	g_gameProjectVersion = file.readUint32LE();
+	g_gameProjectValue = file.readUint16LE();
+	g_scrollSpeed = file.readUint32LE();
 
 	_headerFilename = file.readPascalString();
 
-	_sceneTagList = new SceneTagList(file);
-
-	debug(0, "_gameProjectVersion = %d", _gameProjectVersion);
-	debug(0, "_gameProjectValue = %d", _gameProjectValue);
-	debug(0, "_scrollSpeed = %d", _scrollSpeed);
+	debug(0, "_gameProjectVersion = %d", g_gameProjectVersion);
+	debug(0, "_gameProjectValue = %d", g_gameProjectValue);
+	debug(0, "_scrollSpeed = %d", g_scrollSpeed);
 	debug(0, "_headerFilename = %s", _headerFilename);
 
-	if (_gameProjectVersion >= 3)
+	_sceneTagList = new SceneTagList(file);
+
+	if (g_gameProjectVersion >= 3)
 		_field_4 = file.readUint32LE();
 
-	if (_gameProjectVersion >= 5) {
+	if (g_gameProjectVersion >= 5) {
 		file.readUint32LE();
 		file.readUint32LE();
 	}


Commit: ba26e179804e2cca229bcd1ae028ce03a410e436
    https://github.com/scummvm/scummvm/commit/ba26e179804e2cca229bcd1ae028ce03a410e436
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:08-07:00

Commit Message:
FULLPIPE: Load inventory from fullpipe.gam

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 69b12d0..04fc42b 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -39,6 +39,22 @@ class CObList {
 	int m_nBlockSize;
 };
 
+class MemoryObject {
+  CObject obj;
+  int filename;
+  int field_8;
+  int field_C;
+  int field_10;
+  char field_14;
+  char field_15;
+  char field_16;
+  char field_17;
+  int data;
+  int dataSize;
+  int flags;
+  int libHandle;
+};
+
 class CObArray {
 	CObject obj;
 	int m_pData;
@@ -47,6 +63,22 @@ class CObArray {
 	int m_nGrowBy;
 };
 
+struct CNode {
+  CNode *pNext;
+  CNode *pPrev;
+  void *data;
+};
+
+class CPtrList {
+  CObject obj;
+  CNode *m_pNodeHead;
+  int m_pNodeTail;
+  int m_nCount;
+  int m_pNodeFree;
+  int m_pBlocks;
+  int m_nBlockSize;
+};
+
 class SceneTag {
 	CObject _obj;
 	int _field_4;
@@ -63,7 +95,7 @@ class SceneTag {
 typedef Common::List<SceneTag> SceneTagList_;
 
 class SceneTagList {
-	SceneTagList_ list;
+	SceneTagList_ _list;
 
  public:
 	SceneTagList(CFile &file);
@@ -158,6 +190,131 @@ class CGameVar {
 	int varType;
 };
 
+class InventoryPoolItem {
+ public:
+	int16 _id;
+	int16 _pictureObjectNormalId;
+	int16 _pictureObjectId1;
+	int16 _pictureObjectMouseInsideId;
+	int16 _pictureObjectId3;
+	int16 _field_A;
+	int _field_C;
+	int _obj;
+	int _flags;
+};
+
+typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
+
+class CInventory {
+	CObject _obj;
+	int16 _sceneId;
+	int16 _field_6;
+	InventoryPoolItems _itemsPool;
+
+ public:
+	CInventory() { _sceneId = 0; }
+	bool load(CFile &file);
+};
+
+struct InventoryItem {
+	int16 itemId;
+	int16 count;
+};
+
+typedef Common::Array<InventoryItem> InventoryItems;
+
+class InventoryIcon {
+	int pictureObjectNormal;
+	int pictureObjectMouseInside;
+	int pictureObject3;
+	int x1;
+	int y1;
+	int x2;
+	int y2;
+	int16 inventoryItemId;
+	int16 field_1E;
+	int isSelected;
+	int isMouseInside;
+};
+
+typedef Common::Array<InventoryIcon> InventoryIcons;
+
+class Background {
+	CPtrList list;
+	int stringObj;
+	int x;
+	int y;
+	int16 messageQueueId;
+	int colorMemoryObj;
+	int bigPictureArray1Count;
+	int bigPictureArray2Count;
+	int bigPictureArray;
+};
+
+class ShadowsItemArray {
+	CObArray objs;
+};
+
+class Shadows {
+	CObject obj;
+	int sceneId;
+	int staticAniObjectId;
+	int movementId;
+	ShadowsItemArray items;
+};
+
+class Scene {
+	Background bg;
+	CPtrList staticANIObjectList1;
+	CPtrList staticANIObjectList2;
+	CPtrList messageQueueList;
+	CPtrList faObjectList;
+	Shadows *shadows;
+	int soundList;
+	int16 sceneId;
+	int stringObj;
+	int field_BC;
+	int libHandle;
+};
+
+class Picture {
+	MemoryObject obj;
+	Common::Rect rect;
+	int convertedBitmap;
+	int x;
+	int y;
+	int field_44;
+	int width;
+	int height;
+	int bitmap;
+	int field_54;
+	int memoryObject2;
+	int alpha;
+	int paletteData;
+};
+
+class BigPicture {
+	Picture pic;
+};
+
+class CInventory2 {
+	CInventory _inventory;
+	InventoryItems _inventoryItems;
+	InventoryIcons _inventoryIcons;
+	int _selectedId;
+	int _field_48;
+	int _isInventoryOut;
+	int _isLocked;
+	int _topOffset;
+	Scene *_sceneObj;
+	BigPicture *_picture;
+
+ public:
+	CInventory2();
+	bool load(CFile &file);
+	bool read(CFile &file);
+};
+
 class CGameLoader {
  public:
 	bool loadFile(const char *fname);
@@ -177,30 +334,7 @@ class CGameLoader {
 	int _field_28;
 	int _field_2C;
 	CInputController _inputController;
-	int _inventory;
-	int _field_7C;
-	int _field_80;
-	int _field_84;
-	int _field_88;
-	int _field_8C;
-	int _field_90;
-	int _field_94;
-	int _field_98;
-	int _field_9C;
-	int _field_A0;
-	int _field_A4;
-	int _field_A8;
-	int _field_AC;
-	int _field_B0;
-	int _field_B4;
-	int _field_B8;
-	int _field_BC;
-	int _field_C0;
-	int _field_C4;
-	int _field_C8;
-	int _field_CC;
-	int _field_D0;
-	int _field_D4;
+	CInventory2 _inventory;
 	Sc2Array _sc2array;
 	void *_sceneSwitcher;
 	void *_preloadCallback;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index ffeb0b6..5c571e0 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -23,6 +23,7 @@
 #include "fullpipe/fullpipe.h"
 
 #include "common/file.h"
+#include "common/array.h"
 #include "common/list.h"
 
 #include "fullpipe/utils.h"
@@ -59,6 +60,10 @@ bool CGameLoader::loadFile(const char *fname) {
 	_gameName = file.readPascalString();
 	debug(0, "_gameName: %s", _gameName);
 
+	_inventory.load(file);
+
+	debug(0, "%x", file.pos());
+
 	return true;
 }
 
@@ -105,7 +110,7 @@ SceneTagList::SceneTagList(CFile &file) {
 
 	for (int i = 0; i < numEntries; i++) {
 		SceneTag *t = new SceneTag(file);
-		list.push_back(*t);
+		_list.push_back(*t);
 	}
 }
 
@@ -124,4 +129,55 @@ SceneTag::~SceneTag() {
 	free(_tag);
 }
 
+bool CInventory::load(CFile &file) {
+	_sceneId = file.readUint16LE();
+	int numInvs = file.readUint32LE();
+
+	debug(0, "numInvs: %d %x", numInvs, numInvs);
+
+	for (int i = 0; i < numInvs; i++) {
+		InventoryPoolItem *t = new InventoryPoolItem();
+		t->_id = file.readUint16LE();
+		t->_pictureObjectNormalId = file.readUint16LE();
+		t->_pictureObjectId1 = file.readUint16LE();
+		t->_pictureObjectMouseInsideId = file.readUint16LE();
+		t->_pictureObjectId3 = file.readUint16LE();
+		t->_flags = file.readUint32LE();
+		t->_field_C = 0;
+		t->_field_A = -536;
+		_itemsPool.push_back(*t);
+	}
+
+	return true;
+}
+
+CInventory2::CInventory2() {
+	_selectedId = -1;
+	_field_48 = -1;
+	_sceneObj = 0;
+	_picture = 0;
+	_isInventoryOut = 0;
+	_isLocked = 0;
+	_topOffset = -65;
+}
+
+bool CInventory2::load(CFile &file) {
+	return _inventory.load(file);
+}
+
+bool CInventory2::read(CFile &file) { // CInventory2_SerializePartially
+	int numInvs = file.readUint32LE();
+
+	debug(0, "numInvs: %d", numInvs);
+
+	for (int i = 0; i < numInvs; i++) {
+		InventoryItem *t = new InventoryItem();
+		t->itemId = file.readUint16LE();
+		t->count = file.readUint16LE();
+		_inventoryItems.push_back(*t);
+	}
+
+	return true;
+}
+
 } // End of namespace Fullpipe


Commit: e624ee3442a9777ed4efeaf52223579cf7eabc4e
    https://github.com/scummvm/scummvm/commit/e624ee3442a9777ed4efeaf52223579cf7eabc4e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:08-07:00

Commit Message:
FULLPIPE: Add utils.h which was overlooked

Changed paths:
  A engines/fullpipe/utils.h



diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
new file mode 100644
index 0000000..55f0b6f
--- /dev/null
+++ b/engines/fullpipe/utils.h
@@ -0,0 +1,42 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_UTILS_H
+#define FULLPIPE_UTILS_H
+
+namespace Fullpipe {
+
+class CFile : public Common::File {
+	public:
+	char *readPascalString() {
+		char *tmp;
+		int len = readByte();
+		tmp = (char *)calloc(len + 1, 1);
+		read(tmp, len);
+
+		return tmp;
+	}
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_UTILS_H */


Commit: 4f4834d934df9cb320058ad3f58f52a38e2894ef
    https://github.com/scummvm/scummvm/commit/4f4834d934df9cb320058ad3f58f52a38e2894ef
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:08-07:00

Commit Message:
FULLPIPE: CFile -> MfcArchive

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 04fc42b..20fbcde 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -88,7 +88,7 @@ class SceneTag {
 	int16 _field_12;
 
  public:
-	SceneTag(CFile &file);
+	SceneTag(MfcArchive &file);
 	~SceneTag();
 };
 
@@ -98,7 +98,7 @@ class SceneTagList {
 	SceneTagList_ _list;
 
  public:
-	SceneTagList(CFile &file);
+	SceneTagList(MfcArchive &file);
 };
 
 class GameProject {
@@ -109,7 +109,7 @@ class GameProject {
 	int _field_10;
 
  public:
-	GameProject(CFile &file);
+	GameProject(MfcArchive &file);
 	~GameProject();
 };
 
@@ -213,7 +213,7 @@ class CInventory {
 
  public:
 	CInventory() { _sceneId = 0; }
-	bool load(CFile &file);
+	bool load(MfcArchive &file);
 };
 
 struct InventoryItem {
@@ -311,8 +311,8 @@ class CInventory2 {
 
  public:
 	CInventory2();
-	bool load(CFile &file);
-	bool read(CFile &file);
+	bool load(MfcArchive &file);
+	bool read(MfcArchive &file);
 };
 
 class CGameLoader {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 5c571e0..ba80798 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -43,7 +43,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 }
 
 bool CGameLoader::loadFile(const char *fname) {
-	CFile file;
+	MfcArchive file;
 
 	if (!file.open(fname))
 		return false;
@@ -72,7 +72,7 @@ CGameLoader::~CGameLoader() {
 	delete _gameProject;
 }
 
-GameProject::GameProject(CFile &file) {
+GameProject::GameProject(MfcArchive &file) {
 	_field_4 = 0;
 	_headerFilename = 0;
 	_field_10 = 12;
@@ -103,7 +103,7 @@ GameProject::~GameProject() {
 	free(_headerFilename);
 }
 
-SceneTagList::SceneTagList(CFile &file) {
+SceneTagList::SceneTagList(MfcArchive &file) {
 	int numEntries = file.readUint16LE();
 
 	debug(0, "numEntries: %d", numEntries);
@@ -114,7 +114,7 @@ SceneTagList::SceneTagList(CFile &file) {
 	}
 }
 
-SceneTag::SceneTag(CFile &file) {
+SceneTag::SceneTag(MfcArchive &file) {
 	_field_4 = 0;
 	_scene = 0;
 
@@ -129,7 +129,7 @@ SceneTag::~SceneTag() {
 	free(_tag);
 }
 
-bool CInventory::load(CFile &file) {
+bool CInventory::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 	int numInvs = file.readUint32LE();
 
@@ -161,11 +161,11 @@ CInventory2::CInventory2() {
 	_topOffset = -65;
 }
 
-bool CInventory2::load(CFile &file) {
+bool CInventory2::load(MfcArchive &file) {
 	return _inventory.load(file);
 }
 
-bool CInventory2::read(CFile &file) { // CInventory2_SerializePartially
+bool CInventory2::read(MfcArchive &file) { // CInventory2_SerializePartially
 	int numInvs = file.readUint32LE();
 
 	debug(0, "numInvs: %d", numInvs);
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 55f0b6f..73be461 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -25,7 +25,7 @@
 
 namespace Fullpipe {
 
-class CFile : public Common::File {
+class MfcArchive : public Common::File {
 	public:
 	char *readPascalString() {
 		char *tmp;


Commit: 4bc204cfc466c889c2e539cc23eab87f37d409c9
    https://github.com/scummvm/scummvm/commit/4bc204cfc466c889c2e539cc23eab87f37d409c9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:08-07:00

Commit Message:
FULLPIPE: Start of Interaction loading

Changed paths:
    engines/fullpipe/objects.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 20fbcde..c39bbb3 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -113,12 +113,35 @@ class GameProject {
 	~GameProject();
 };
 
+class CInteraction {
+  CObject obj;
+  int16 objectId1;
+  int16 objectId2;
+  int16 objectId3;
+  int16 staticsId1;
+  int16 staticsId2;
+  int16 field_E;
+  int objectState1;
+  int objectState2;
+  int xOffs;
+  int yOffs;
+  int messageQueue;
+  int sceneId;
+  int field_28;
+  int flags;
+  int stringObj;
+};
+
+typedef Common::List<CInteraction> CInteractions;
+
 class CInteractionController {
-	CObject obj;
-	CObList interactions;
-	int16 field_20;
-	char gap_22[2];
-	int flag24;
+	CObject _obj;
+	CInteractions _interactions;
+	int16 _field_20;
+	int _flag24;
+
+ public:
+	CInteractionController() : _field_20(0), _flag24(1) {}
 };
 
 class CInputControllerItemArray {


Commit: 05418b908afd2563e85a56652f750af65a3d4cc8
    https://github.com/scummvm/scummvm/commit/05418b908afd2563e85a56652f750af65a3d4cc8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:08-07:00

Commit Message:
FULLPIPE: Turn all MfcArchive loading functions into virtual methods

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index c39bbb3..802306d 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -26,21 +26,15 @@
 namespace Fullpipe {
 
 class CObject {
-	int vmt;
+ public:
+	virtual bool load(MfcArchive &in) { return true; }
+	virtual ~CObject() {}
 };
 
-class CObList {
-	int vmt;
-	int m_pNodeHead;
-	int m_pNodeTail;
-	int m_nCount;
-	int m_pNodeFree;
-	int m_pBlocks;
-	int m_nBlockSize;
-};
+typedef Common::List<CObject> CObList;
 
 class MemoryObject {
-  CObject obj;
+	//CObject obj;
   int filename;
   int field_8;
   int field_C;
@@ -56,7 +50,7 @@ class MemoryObject {
 };
 
 class CObArray {
-	CObject obj;
+	//CObject obj;
 	int m_pData;
 	int m_nSize;
 	int m_nMaxSize;
@@ -70,7 +64,7 @@ struct CNode {
 };
 
 class CPtrList {
-  CObject obj;
+	//CObject obj;
   CNode *m_pNodeHead;
   int m_pNodeTail;
   int m_nCount;
@@ -79,8 +73,7 @@ class CPtrList {
   int m_nBlockSize;
 };
 
-class SceneTag {
-	CObject _obj;
+class SceneTag : CObject {
 	int _field_4;
 	char *_tag;
 	int _scene;
@@ -88,33 +81,35 @@ class SceneTag {
 	int16 _field_12;
 
  public:
-	SceneTag(MfcArchive &file);
+	SceneTag();
 	~SceneTag();
+
+	virtual bool load(MfcArchive &file);
 };
 
 typedef Common::List<SceneTag> SceneTagList_;
 
-class SceneTagList {
+class SceneTagList : CObject {
 	SceneTagList_ _list;
 
  public:
-	SceneTagList(MfcArchive &file);
+	virtual bool load(MfcArchive &file);
 };
 
-class GameProject {
-	CObject _obj;
+class GameProject : CObject {
 	int _field_4;
 	char *_headerFilename;
 	SceneTagList *_sceneTagList;
 	int _field_10;
 
  public:
-	GameProject(MfcArchive &file);
+	GameProject();
 	~GameProject();
+	virtual bool load(MfcArchive &file);
 };
 
 class CInteraction {
-  CObject obj;
+	//CObject obj;
   int16 objectId1;
   int16 objectId2;
   int16 objectId3;
@@ -132,11 +127,9 @@ class CInteraction {
   int stringObj;
 };
 
-typedef Common::List<CInteraction> CInteractions;
-
 class CInteractionController {
-	CObject _obj;
-	CInteractions _interactions;
+	//CObject _obj;
+	CObList _interactions;
 	int16 _field_20;
 	int _flag24;
 
@@ -149,7 +142,7 @@ class CInputControllerItemArray {
 };
 
 class CInputController {
-	CObject obj;
+	//CObject obj;
 	int flag;
 	int flags;
 	int cursorHandle;
@@ -176,7 +169,7 @@ union VarValue {
 };
 
 class Message {
-	CObject obj;
+	//CObject obj;
 	int messageKind;
 	int16 parentId;
 	char gap_A[2];
@@ -202,7 +195,7 @@ class ExCommand {
 };
 
 class CGameVar {
-	CObject obj;
+	//CObject obj;
 	CGameVar *nextVarObj;
 	CGameVar *prevVarObj;
 	CGameVar *parentVarObj;
@@ -228,15 +221,14 @@ class InventoryPoolItem {
 
 typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
 
-class CInventory {
-	CObject _obj;
+class CInventory : CObject {
 	int16 _sceneId;
 	int16 _field_6;
 	InventoryPoolItems _itemsPool;
 
  public:
 	CInventory() { _sceneId = 0; }
-	bool load(MfcArchive &file);
+	virtual bool load(MfcArchive &file);
 };
 
 struct InventoryItem {
@@ -279,7 +271,7 @@ class ShadowsItemArray {
 };
 
 class Shadows {
-	CObject obj;
+	//CObject obj;
 	int sceneId;
 	int staticAniObjectId;
 	int movementId;
@@ -320,7 +312,7 @@ class BigPicture {
 	Picture pic;
 };
 
-class CInventory2 {
+class CInventory2 : CObject {
 	CInventory _inventory;
 	InventoryItems _inventoryItems;
 	InventoryIcons _inventoryIcons;
@@ -334,8 +326,8 @@ class CInventory2 {
 
  public:
 	CInventory2();
-	bool load(MfcArchive &file);
-	bool read(MfcArchive &file);
+	bool loadPartial(MfcArchive &file);
+	virtual bool load(MfcArchive &file);
 };
 
 class CGameLoader {
@@ -344,7 +336,7 @@ class CGameLoader {
 	~CGameLoader();
 
  private:
-	CObject _obj;
+	//CObject _obj;
 	GameProject *_gameProject;
 	CInteractionController *_interactionController;
 	int _field_C;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index ba80798..bdfd4e0 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -51,7 +51,9 @@ bool CGameLoader::loadFile(const char *fname) {
 	_gameName = file.readPascalString();
 	debug(0, "_gameName: %s", _gameName);
 
-	_gameProject = new GameProject(file);
+	_gameProject = new GameProject();
+
+	_gameProject->load(file);
 
 	if (g_gameProjectVersion < 12) {
 		error("Old gameProjectVersion: %d", g_gameProjectVersion);
@@ -72,11 +74,13 @@ CGameLoader::~CGameLoader() {
 	delete _gameProject;
 }
 
-GameProject::GameProject(MfcArchive &file) {
+GameProject::GameProject() {
 	_field_4 = 0;
 	_headerFilename = 0;
 	_field_10 = 12;
+}
 
+bool GameProject::load(MfcArchive &file) {
 	g_gameProjectVersion = file.readUint32LE();
 	g_gameProjectValue = file.readUint16LE();
 	g_scrollSpeed = file.readUint32LE();
@@ -88,7 +92,9 @@ GameProject::GameProject(MfcArchive &file) {
 	debug(0, "_scrollSpeed = %d", g_scrollSpeed);
 	debug(0, "_headerFilename = %s", _headerFilename);
 
-	_sceneTagList = new SceneTagList(file);
+	_sceneTagList = new SceneTagList();
+
+	_sceneTagList->load(file);
 
 	if (g_gameProjectVersion >= 3)
 		_field_4 = file.readUint32LE();
@@ -97,32 +103,41 @@ GameProject::GameProject(MfcArchive &file) {
 		file.readUint32LE();
 		file.readUint32LE();
 	}
+
+	return true;
 }
 
 GameProject::~GameProject() {
 	free(_headerFilename);
 }
 
-SceneTagList::SceneTagList(MfcArchive &file) {
+bool SceneTagList::load(MfcArchive &file) {
 	int numEntries = file.readUint16LE();
 
 	debug(0, "numEntries: %d", numEntries);
 
 	for (int i = 0; i < numEntries; i++) {
-		SceneTag *t = new SceneTag(file);
+		SceneTag *t = new SceneTag();
+		t->load(file);
 		_list.push_back(*t);
 	}
+
+	return true;
 }
 
-SceneTag::SceneTag(MfcArchive &file) {
+SceneTag::SceneTag() {
 	_field_4 = 0;
 	_scene = 0;
+}
 
+bool SceneTag::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 
 	_tag = file.readPascalString();
 
 	debug(0, "sceneId: %d  tag: %s", _sceneId, _tag);
+
+	return true;
 }
 
 SceneTag::~SceneTag() {
@@ -165,7 +180,7 @@ bool CInventory2::load(MfcArchive &file) {
 	return _inventory.load(file);
 }
 
-bool CInventory2::read(MfcArchive &file) { // CInventory2_SerializePartially
+bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartially
 	int numInvs = file.readUint32LE();
 
 	debug(0, "numInvs: %d", numInvs);


Commit: bd565771d0bb54eedaa1b51f1d0f1ab123d48249
    https://github.com/scummvm/scummvm/commit/bd565771d0bb54eedaa1b51f1d0f1ab123d48249
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:08-07:00

Commit Message:
FULLPIPE: Started work on CObList loader

Changed paths:
  A engines/fullpipe/utils.cpp
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 802306d..40ca202 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -31,22 +31,25 @@ class CObject {
 	virtual ~CObject() {}
 };
 
-typedef Common::List<CObject> CObList;
+class CObList : Common::List<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
 
 class MemoryObject {
 	//CObject obj;
-  int filename;
-  int field_8;
-  int field_C;
-  int field_10;
-  char field_14;
-  char field_15;
-  char field_16;
-  char field_17;
-  int data;
-  int dataSize;
-  int flags;
-  int libHandle;
+	int filename;
+	int field_8;
+	int field_C;
+	int field_10;
+	char field_14;
+	char field_15;
+	char field_16;
+	char field_17;
+	int data;
+	int dataSize;
+	int flags;
+	int libHandle;
 };
 
 class CObArray {
@@ -58,9 +61,9 @@ class CObArray {
 };
 
 struct CNode {
-  CNode *pNext;
-  CNode *pPrev;
-  void *data;
+	CNode *pNext;
+	CNode *pPrev;
+	void *data;
 };
 
 class CPtrList {
@@ -73,7 +76,7 @@ class CPtrList {
   int m_nBlockSize;
 };
 
-class SceneTag : CObject {
+class SceneTag : public CObject {
 	int _field_4;
 	char *_tag;
 	int _scene;
@@ -89,14 +92,14 @@ class SceneTag : CObject {
 
 typedef Common::List<SceneTag> SceneTagList_;
 
-class SceneTagList : CObject {
+class SceneTagList : public CObject {
 	SceneTagList_ _list;
 
  public:
 	virtual bool load(MfcArchive &file);
 };
 
-class GameProject : CObject {
+class GameProject : public CObject {
 	int _field_4;
 	char *_headerFilename;
 	SceneTagList *_sceneTagList;
@@ -127,14 +130,15 @@ class CInteraction {
   int stringObj;
 };
 
-class CInteractionController {
-	//CObject _obj;
+class CInteractionController : public CObject {
 	CObList _interactions;
 	int16 _field_20;
 	int _flag24;
 
  public:
 	CInteractionController() : _field_20(0), _flag24(1) {}
+
+	virtual bool load(MfcArchive &file);
 };
 
 class CInputControllerItemArray {
@@ -143,19 +147,22 @@ class CInputControllerItemArray {
 
 class CInputController {
 	//CObject obj;
-	int flag;
-	int flags;
-	int cursorHandle;
-	int hCursor;
-	int field_14;
-	int cursorId;
-	int cursorIndex;
-	CInputControllerItemArray cursorsArray;
-	int cursorDrawX;
-	int cursorDrawY;
-	int cursorDrawWidth;
-	int cursorDrawHeight;
-	int cursorItemPicture;
+	int _flag;
+	int _flags;
+	int _cursorHandle;
+	int _hCursor;
+	int _field_14;
+	int _cursorId;
+	int _cursorIndex;
+	CInputControllerItemArray _cursorsArray;
+	int _cursorDrawX;
+	int _cursorDrawY;
+	int _cursorDrawWidth;
+	int _cursorDrawHeight;
+	int _cursorItemPicture;
+
+ public:
+	CInputController();
 };
 
 class Sc2Array {
@@ -221,7 +228,7 @@ class InventoryPoolItem {
 
 typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
 
-class CInventory : CObject {
+class CInventory : public CObject {
 	int16 _sceneId;
 	int16 _field_6;
 	InventoryPoolItems _itemsPool;
@@ -312,7 +319,7 @@ class BigPicture {
 	Picture pic;
 };
 
-class CInventory2 : CObject {
+class CInventory2 : public CObject {
 	CInventory _inventory;
 	InventoryItems _inventoryItems;
 	InventoryIcons _inventoryIcons;
@@ -332,8 +339,11 @@ class CInventory2 : CObject {
 
 class CGameLoader {
  public:
+	CGameLoader();
+	virtual ~CGameLoader();
+
 	bool loadFile(const char *fname);
-	~CGameLoader();
+	virtual bool load(MfcArchive &file);
 
  private:
 	//CObject _obj;
@@ -357,7 +367,7 @@ class CGameLoader {
 	int16 _field_F8;
 	int16 _field_FA;
 	CObArray _preloadItems;
-	CGameVar *gameVar;
+	CGameVar *_gameVar;
 	char *_gameName;
 	ExCommand _exCommand;
 	int _updateCounter;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index bdfd4e0..0057e4c 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -42,12 +42,50 @@ bool FullpipeEngine::loadGam(const char *fname) {
 	return true;
 }
 
+CGameLoader::CGameLoader() {
+	_interactionController = new CInteractionController();
+
+	// g_gameLoader = this;  // FIXME
+
+	_gameProject = 0;
+	//_gameName = "untitled";
+
+	//addMessageHandler2(CGameLoader_messageHandler1, 0, 0);
+	//insertMessageHandler(CGameLoader_messageHandler2, 0, 128);
+	//insertMessageHandler(CGameLoader_messageHandler3, 0, 1);
+
+	_field_FA = 0;
+	_field_F8 = 0;
+	_sceneSwitcher = 0;
+	_preloadCallback = 0;
+	_readSavegameCallback = 0;
+	_gameVar = 0;
+	_preloadId1 = 0;
+	_preloadId2 = 0;
+	_updateCounter = 0;
+
+	//g_x = 0;
+	//g_y = 0;
+	//dword_478480 = 0;
+	//g_objectId2 = 0;
+	//g_id = 0;
+}
+
+CGameLoader::~CGameLoader() {
+	free(_gameName);
+	delete _gameProject;
+}
+
 bool CGameLoader::loadFile(const char *fname) {
 	MfcArchive file;
 
 	if (!file.open(fname))
 		return false;
 
+	return load(file);
+}
+
+bool CGameLoader::load(MfcArchive &file) {
 	_gameName = file.readPascalString();
 	debug(0, "_gameName: %s", _gameName);
 
@@ -66,12 +104,9 @@ bool CGameLoader::loadFile(const char *fname) {
 
 	debug(0, "%x", file.pos());
 
-	return true;
-}
+	_interactionController->load(file);
 
-CGameLoader::~CGameLoader() {
-	free(_gameName);
-	delete _gameProject;
+	return true;
 }
 
 GameProject::GameProject() {
@@ -195,4 +230,25 @@ bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartia
 	return true;
 }
 
+bool CInteractionController::load(MfcArchive &file) {
+	return _interactions.load(file);
+}
+
+bool CObList::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	for (int i = 0; i < count; i++) {
+		CObject *t = file.parseClass();
+		t->load(file);
+
+		push_back(*t);
+	}
+
+	return true;
+}
+
+CInputController::CInputController() {
+	// TODO
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
new file mode 100644
index 0000000..e1031cf
--- /dev/null
+++ b/engines/fullpipe/utils.cpp
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "common/file.h"
+
+#include "fullpipe/utils.h"
+#include "fullpipe/objects.h"
+
+namespace Fullpipe {
+
+char *MfcArchive::readPascalString() {
+	char *tmp;
+	int len = readByte();
+	tmp = (char *)calloc(len + 1, 1);
+	read(tmp, len);
+
+	return tmp;
+}
+
+int MfcArchive::readCount() {
+	int count = readUint16LE();
+
+	if (count == 0xffff)
+		count = readUint32LE();
+
+	return count;
+}
+
+CObject *MfcArchive::parseClass() {
+	CObject *res;
+
+	res = new CInventory2();
+
+	return res;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 73be461..492f5ac 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -25,16 +25,13 @@
 
 namespace Fullpipe {
 
+class CObject;
+
 class MfcArchive : public Common::File {
 	public:
-	char *readPascalString() {
-		char *tmp;
-		int len = readByte();
-		tmp = (char *)calloc(len + 1, 1);
-		read(tmp, len);
-
-		return tmp;
-	}
+		char *readPascalString();
+		int readCount();
+		CObject *parseClass();
 };
 
 } // End of namespace Fullpipe


Commit: 0c03278937d0b7e85da3b60f1edf8bf7764aecbc
    https://github.com/scummvm/scummvm/commit/0c03278937d0b7e85da3b60f1edf8bf7764aecbc
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:09-07:00

Commit Message:
FULLPIPE: Start of reading CInteraction

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 40ca202..5b15aa0 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -111,23 +111,26 @@ class GameProject : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class CInteraction {
-	//CObject obj;
-  int16 objectId1;
-  int16 objectId2;
-  int16 objectId3;
-  int16 staticsId1;
-  int16 staticsId2;
-  int16 field_E;
-  int objectState1;
-  int objectState2;
-  int xOffs;
-  int yOffs;
-  int messageQueue;
-  int sceneId;
-  int field_28;
-  int flags;
-  int stringObj;
+class CInteraction : public CObject {
+  int16 _objectId1;
+  int16 _objectId2;
+  int16 _objectId3;
+  int16 _staticsId1;
+  int16 _staticsId2;
+  int16 _field_E;
+  int _objectState1;
+  int _objectState2;
+  int _xOffs;
+  int _yOffs;
+  int _messageQueue;
+  int _sceneId;
+  int _field_28;
+  int _flags;
+  char *_stringObj;
+
+ public:
+	CInteraction();
+	virtual bool load(MfcArchive &file);
 };
 
 class CInteractionController : public CObject {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 0057e4c..e1c6d55 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -251,4 +251,40 @@ CInputController::CInputController() {
 	// TODO
 }
 
+CInteraction::CInteraction() {
+	_objectId1 = 0;
+	_objectId2 = 0;
+	_staticsId1 = 0;
+	_objectId3 = 0;
+	_objectState2 = 0;
+	_objectState1 = 0;
+	_messageQueue = 0;
+	_flags = 0;
+	_yOffs = 0;
+	_xOffs = 0;
+	_staticsId2 = 0;
+	_field_28 = 0;
+	_sceneId = -1;
+}
+
+bool CInteraction::load(MfcArchive &file) {
+	_objectId1 = file.readUint16LE();
+	_objectId2 = file.readUint16LE();
+	_staticsId1 = file.readUint16LE();
+	_staticsId2 = file.readUint16LE();
+	_objectId3 = file.readUint16LE();
+	_objectState2 = file.readUint32LE();
+	_objectState1 = file.readUint32LE();
+	_xOffs = file.readUint32LE();
+	_yOffs = file.readUint32LE();
+	_sceneId = file.readUint32LE();
+	_flags = file.readUint32LE();
+	_stringObj = file.readPascalString();
+
+	// messageQueue
+
+	return true;
+}
+
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index e1031cf..75e5f69 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -47,12 +47,61 @@ int MfcArchive::readCount() {
 	return count;
 }
 
+enum {
+	kCInteraction = 0
+};
+
+const struct {
+	const char *name;
+	int id;
+} classMap[] = {
+	{ "CInteraction", kCInteraction },
+	{ 0, 0 }
+};
+
+MfcArchive::MfcArchive() {
+	for (int i; classMap[i].name; i++) {
+		_classMap[classMap[i].name] = classMap[i].id;
+	}
+
+	_lastIndex = 1;
+}
+
 CObject *MfcArchive::parseClass() {
-	CObject *res;
+	char *name;
+	int objectId;
+
+	uint obTag = readUint16LE();
+
+	if (obTag == 0xffff) {
+		int schema = readUint16LE();
+
+		name = readPascalString();
+
+		if (!_classMap.contains(name)) {
+			error("Unknown class in MfcArchive: %s", name);
+		}
+
+		_objectMap[_lastIndex] = objectId = _classMap[name];
+		_lastIndex++;
+	} else {
+		obTag &= ~0x8000;
+
+		if (_objectMap.size() < obTag) {
+			error("Object index too big: %d", obTag);
+		}
+
+		objectId = _objectMap[obTag];
+	}
 
-	res = new CInventory2();
+	switch (objectId) {
+	case kCInteraction:
+		return new CInteraction();
+	default:
+		error("Unknown objectId: %d", objectId);
+	}
 
-	return res;
+	return 0;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 492f5ac..a791139 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -23,15 +23,27 @@
 #ifndef FULLPIPE_UTILS_H
 #define FULLPIPE_UTILS_H
 
+#include "common/hash-str.h"
+#include "common/array.h"
+
 namespace Fullpipe {
 
 class CObject;
 
+typedef Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ClassMap;
+
 class MfcArchive : public Common::File {
-	public:
-		char *readPascalString();
-		int readCount();
-		CObject *parseClass();
+	ClassMap _classMap;
+	Common::Array<int> _objectMap;
+
+	int _lastIndex;
+
+ public:
+	MfcArchive();
+
+	char *readPascalString();
+	int readCount();
+	CObject *parseClass();
 };
 
 } // End of namespace Fullpipe


Commit: 72aeac3f3634cacdfdafd15388b6033592b9d25f
    https://github.com/scummvm/scummvm/commit/72aeac3f3634cacdfdafd15388b6033592b9d25f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:09-07:00

Commit Message:
FULLPIPE: Continue parsing CInteraction

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 5b15aa0..4551d29 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -111,6 +111,21 @@ class GameProject : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
+class MessageQueue : public CObject {
+  int _id;
+  int _flags;
+  char *_stringObj;
+  int16 _dataId;
+  int16 _field_12;
+  int _field_14;
+  CPtrList _exCommands;
+  int _counter;
+  int _field_38;
+  int _isFinished;
+  int _parId;
+  int _flag1;
+};
+
 class CInteraction : public CObject {
   int16 _objectId1;
   int16 _objectId2;
@@ -122,7 +137,7 @@ class CInteraction : public CObject {
   int _objectState2;
   int _xOffs;
   int _yOffs;
-  int _messageQueue;
+  MessageQueue *_messageQueue;
   int _sceneId;
   int _field_28;
   int _flags;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index e1c6d55..82ba456 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -237,6 +237,8 @@ bool CInteractionController::load(MfcArchive &file) {
 bool CObList::load(MfcArchive &file) {
 	int count = file.readCount();
 
+	debug(0, "CObList::count: %d", count);
+
 	for (int i = 0; i < count; i++) {
 		CObject *t = file.parseClass();
 		t->load(file);
@@ -281,8 +283,10 @@ bool CInteraction::load(MfcArchive &file) {
 	_flags = file.readUint32LE();
 	_stringObj = file.readPascalString();
 
-	// messageQueue
+	debug(0, "CInteraction::_stringObj = %s", _stringObj);
 
+	// messageQueue
+	_messageQueue = (MessageQueue *)file.parseClass();
 	return true;
 }
 
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 75e5f69..b39ae42 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -29,9 +29,15 @@
 
 namespace Fullpipe {
 
-char *MfcArchive::readPascalString() {
+char *MfcArchive::readPascalString(bool twoByte) {
 	char *tmp;
-	int len = readByte();
+	int len;
+
+	if (twoByte)
+		len = readUint16LE();
+	else
+		len = readByte();
+
 	tmp = (char *)calloc(len + 1, 1);
 	read(tmp, len);
 
@@ -73,17 +79,21 @@ CObject *MfcArchive::parseClass() {
 
 	uint obTag = readUint16LE();
 
+	debug(0, "parseClass::obTag = %d", obTag);
+
 	if (obTag == 0xffff) {
 		int schema = readUint16LE();
 
-		name = readPascalString();
+		debug(0, "parseClass::schema = %d", schema);
+
+		name = readPascalString(true);
 
 		if (!_classMap.contains(name)) {
-			error("Unknown class in MfcArchive: %s", name);
+			error("Unknown class in MfcArchive: <%s>", name);
 		}
 
-		_objectMap[_lastIndex] = objectId = _classMap[name];
-		_lastIndex++;
+		objectId = _classMap[name];
+		_objectMap.push_back(objectId);
 	} else {
 		obTag &= ~0x8000;
 
@@ -93,6 +103,8 @@ CObject *MfcArchive::parseClass() {
 
 		objectId = _objectMap[obTag];
 	}
+	
+	debug(0, "objectId: %d", objectId);
 
 	switch (objectId) {
 	case kCInteraction:
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index a791139..df56262 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -41,7 +41,7 @@ class MfcArchive : public Common::File {
  public:
 	MfcArchive();
 
-	char *readPascalString();
+	char *readPascalString(bool twoByte = false);
 	int readCount();
 	CObject *parseClass();
 };


Commit: e9fa2e52df6d5823499bd5731a16dba7c5c7c9db
    https://github.com/scummvm/scummvm/commit/e9fa2e52df6d5823499bd5731a16dba7c5c7c9db
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:09-07:00

Commit Message:
FULLPIPE: Continued loading CInteraction

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 4551d29..6b615ff 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -66,15 +66,7 @@ struct CNode {
 	void *data;
 };
 
-class CPtrList {
-	//CObject obj;
-  CNode *m_pNodeHead;
-  int m_pNodeTail;
-  int m_nCount;
-  int m_pNodeFree;
-  int m_pBlocks;
-  int m_nBlockSize;
-};
+typedef Common::Array<void *> CPtrList;
 
 class SceneTag : public CObject {
 	int _field_4;
@@ -112,36 +104,40 @@ class GameProject : public CObject {
 };
 
 class MessageQueue : public CObject {
-  int _id;
-  int _flags;
-  char *_stringObj;
-  int16 _dataId;
-  int16 _field_12;
-  int _field_14;
-  CPtrList _exCommands;
-  int _counter;
-  int _field_38;
-  int _isFinished;
-  int _parId;
-  int _flag1;
+	int _id;
+	int _flags;
+	char *_stringObj;
+	int16 _dataId;
+	int16 _field_12;
+	int _field_14;
+	CPtrList _exCommands;
+	int _counter;
+	int _field_38;
+	int _isFinished;
+	int _parId;
+	int _flag1;
+
+ public:
+	MessageQueue();
+	virtual bool load(MfcArchive &file);
 };
 
 class CInteraction : public CObject {
-  int16 _objectId1;
-  int16 _objectId2;
-  int16 _objectId3;
-  int16 _staticsId1;
-  int16 _staticsId2;
-  int16 _field_E;
-  int _objectState1;
-  int _objectState2;
-  int _xOffs;
-  int _yOffs;
-  MessageQueue *_messageQueue;
-  int _sceneId;
-  int _field_28;
-  int _flags;
-  char *_stringObj;
+	int16 _objectId1;
+	int16 _objectId2;
+	int16 _objectId3;
+	int16 _staticsId1;
+	int16 _staticsId2;
+	int16 _field_E;
+	int _objectState1;
+	int _objectState2;
+	int _xOffs;
+	int _yOffs;
+	MessageQueue *_messageQueue;
+	int _sceneId;
+	int _field_28;
+	int _flags;
+	char *_stringObj;
 
  public:
 	CInteraction();
@@ -188,35 +184,42 @@ class Sc2Array {
 };
 
 union VarValue {
-  int floatValue;
-  int intValue;
-  int stringValue;
+	int floatValue;
+	int intValue;
+	int stringValue;
 };
 
 class Message {
-	//CObject obj;
-	int messageKind;
-	int16 parentId;
-	char gap_A[2];
-	int x;
-	int y;
-	int field_14;
-	int sceneClickX;
-	int sceneClickY;
-	int field_20;
-	int field_24;
-	int param28;
-	int field_2C;
-	int field_30;
-	int field_34;
+ public:
+	int _messageKind;
+	int16 _parentId;
+	int _x;
+	int _y;
+	int _field_14;
+	int _sceneClickX;
+	int _sceneClickY;
+	int _field_20;
+	int _field_24;
+	int _param28;
+	int _field_2C;
+	int _field_30;
+	int _field_34;
+
+ public:
+	Message();
 };
 
-class ExCommand {
-	Message msg;
-	int messageNum;
-	int field_3C;
-	int flags;
-	int parId;
+class ExCommand : public CObject {
+	Message _msg;
+	int _messageNum;
+	int _field_3C;
+	int _flags;
+	int _parId;
+
+ public:
+	ExCommand();
+
+	virtual bool load(MfcArchive &file);
 };
 
 class CGameVar {
@@ -396,4 +399,3 @@ class CGameLoader {
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_OBJECTS_H */
-
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 82ba456..4e54aa3 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -116,6 +116,10 @@ GameProject::GameProject() {
 }
 
 bool GameProject::load(MfcArchive &file) {
+	_field_4 = 0;
+	_headerFilename = 0;
+	_field_10 = 12;
+
 	g_gameProjectVersion = file.readUint32LE();
 	g_gameProjectValue = file.readUint16LE();
 	g_scrollSpeed = file.readUint32LE();
@@ -166,6 +170,9 @@ SceneTag::SceneTag() {
 }
 
 bool SceneTag::load(MfcArchive &file) {
+	_field_4 = 0;
+	_scene = 0;
+
 	_sceneId = file.readUint16LE();
 
 	_tag = file.readPascalString();
@@ -287,8 +294,94 @@ bool CInteraction::load(MfcArchive &file) {
 
 	// messageQueue
 	_messageQueue = (MessageQueue *)file.parseClass();
+	_messageQueue->load(file);
+
+	return true;
+}
+
+MessageQueue::MessageQueue() {
+	_field_14 = 0;
+	_parId = 0;
+	_dataId = 0;
+	_id = 0;
+	_isFinished = 0;
+	_flags = 0;
+}
+
+bool MessageQueue::load(MfcArchive &file) {
+	_dataId = file.readUint16LE();
+
+	int count = file.readUint16LE();
+
+	_stringObj = file.readPascalString();
+	debug(0, "MessageQueue::count = %d", count);
+	debug(0, "MessageQueue::_stringObj = %s", _stringObj);
+
+	for (int i = 0; i < count; i++) {
+		CObject *tmp = file.parseClass();
+		tmp->load(file);
+
+		_exCommands.push_back(tmp);
+	}
+
+	_id = -1;
+	_field_14 = 0;
+	_parId = 0;
+	_isFinished = 0;
+
+	return true;
+}
+
+ExCommand::ExCommand() {
+	_field_3C = 1;
+	_messageNum = 0;
+	_flags = 0;
+	_parId = 0;
+}
+
+bool ExCommand::load(MfcArchive &file) {
+	debug(0, "ExCommand::load");
+
+	_msg._parentId = file.readUint16LE();
+	_msg._messageKind = file.readUint32LE();
+	_msg._x = file.readUint32LE();
+	_msg._y = file.readUint32LE();
+	_msg._field_14 = file.readUint32LE();
+	_msg._sceneClickX = file.readUint32LE();
+	_msg._sceneClickY = file.readUint32LE();
+	_msg._field_20 = file.readUint32LE();
+	_msg._field_24 = file.readUint32LE();
+	_msg._param28 = file.readUint32LE();
+	_msg._field_2C = file.readUint32LE();
+	_msg._field_30 = file.readUint32LE();
+	_msg._field_34 = file.readUint32LE();
+
+	_messageNum = file.readUint32LE();
+
+	_field_3C = 0;
+
+	if (g_gameProjectVersion >= 12) {
+		_flags = file.readUint32LE();
+		_parId = file.readUint32LE();
+	}
+
 	return true;
 }
 
+Message::Message() {
+	_messageKind = 0;
+	_parentId = 0;
+	_x = 0;
+	_y = 0;
+	_field_14 = 0;
+	_sceneClickX = 0;
+	_sceneClickY = 0;
+	_field_20 = 0;
+	_field_24 = 0;
+	_param28 = 0;
+	_field_2C = 0;
+	_field_30 = 0;
+	_field_34 = 0;
+}
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index b39ae42..954af84 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -54,14 +54,18 @@ int MfcArchive::readCount() {
 }
 
 enum {
-	kCInteraction = 0
+	kCInteraction = 0,
+	kMessageQueue = 1,
+	kExCommand = 2
 };
 
 const struct {
 	const char *name;
 	int id;
 } classMap[] = {
-	{ "CInteraction", kCInteraction },
+	{ "CInteraction",	kCInteraction },
+	{ "MessageQueue",	kMessageQueue },
+	{ "ExCommand",		kExCommand },
 	{ 0, 0 }
 };
 
@@ -79,7 +83,7 @@ CObject *MfcArchive::parseClass() {
 
 	uint obTag = readUint16LE();
 
-	debug(0, "parseClass::obTag = %d", obTag);
+	debug(0, "parseClass::obTag = %d (%04x)", obTag, obTag);
 
 	if (obTag == 0xffff) {
 		int schema = readUint16LE();
@@ -87,6 +91,7 @@ CObject *MfcArchive::parseClass() {
 		debug(0, "parseClass::schema = %d", schema);
 
 		name = readPascalString(true);
+		debug(0, "parseClass::class <%s>", name);
 
 		if (!_classMap.contains(name)) {
 			error("Unknown class in MfcArchive: <%s>", name);
@@ -94,14 +99,18 @@ CObject *MfcArchive::parseClass() {
 
 		objectId = _classMap[name];
 		_objectMap.push_back(objectId);
+
+		debug(0, "tag: %d", _objectMap.size());
 	} else {
 		obTag &= ~0x8000;
 
+		debug(0, "parseClass::obTag <%d>", obTag);
+
 		if (_objectMap.size() < obTag) {
-			error("Object index too big: %d", obTag);
+			error("Object index too big: %d  at 0x%08x", obTag, pos() - 2);
 		}
 
-		objectId = _objectMap[obTag];
+		objectId = _objectMap[obTag - 1];
 	}
 	
 	debug(0, "objectId: %d", objectId);
@@ -109,6 +118,10 @@ CObject *MfcArchive::parseClass() {
 	switch (objectId) {
 	case kCInteraction:
 		return new CInteraction();
+	case kMessageQueue:
+		return new MessageQueue();
+	case kExCommand:
+		return new ExCommand();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: ad47d5a5e2f0a1b88d101aca9ad25b2af2f1beae
    https://github.com/scummvm/scummvm/commit/ad47d5a5e2f0a1b88d101aca9ad25b2af2f1beae
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:09-07:00

Commit Message:
FULLPIPE: Attampt to fix serializer. Still not working

Changed paths:
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 954af84..d9fd3d8 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -75,6 +75,8 @@ MfcArchive::MfcArchive() {
 	}
 
 	_lastIndex = 1;
+
+	_objectMap.push_back(0);
 }
 
 CObject *MfcArchive::parseClass() {
@@ -100,7 +102,7 @@ CObject *MfcArchive::parseClass() {
 		objectId = _classMap[name];
 		_objectMap.push_back(objectId);
 
-		debug(0, "tag: %d", _objectMap.size());
+		debug(0, "tag: %d", _objectMap.size() - 1);
 	} else {
 		obTag &= ~0x8000;
 
@@ -110,7 +112,7 @@ CObject *MfcArchive::parseClass() {
 			error("Object index too big: %d  at 0x%08x", obTag, pos() - 2);
 		}
 
-		objectId = _objectMap[obTag - 1];
+		objectId = _objectMap[obTag];
 	}
 	
 	debug(0, "objectId: %d", objectId);


Commit: 9395ab11d2020779dd27c7720ef1cb791b030116
    https://github.com/scummvm/scummvm/commit/9395ab11d2020779dd27c7720ef1cb791b030116
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:09-07:00

Commit Message:
FULLPIPE: Hack to enable object loader

Changed paths:
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index d9fd3d8..36eb86c 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -101,6 +101,7 @@ CObject *MfcArchive::parseClass() {
 
 		objectId = _classMap[name];
 		_objectMap.push_back(objectId);
+		_objectMap.push_back(objectId); // Gross HACK
 
 		debug(0, "tag: %d", _objectMap.size() - 1);
 	} else {


Commit: 67d30f29f9e658ce760b8a1a5f413fef4d2d586e
    https://github.com/scummvm/scummvm/commit/67d30f29f9e658ce760b8a1a5f413fef4d2d586e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:10-07:00

Commit Message:
FULLPIPE: Added ObjstateCommand loader

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 6b615ff..36f6996 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -396,6 +396,16 @@ class CGameLoader {
 	int _preloadId2;
 };
 
+class CObjstateCommand : public CObject {
+	ExCommand _cmd;
+	char *_stringObj;
+	int _value;
+
+ public:
+	CObjstateCommand();
+	virtual bool load(MfcArchive &file);
+};
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_OBJECTS_H */
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 4e54aa3..fe67bf9 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -384,4 +384,18 @@ Message::Message() {
 	_field_34 = 0;
 }
 
+CObjstateCommand::CObjstateCommand() {
+	_value = 0;
+}
+
+bool CObjstateCommand::load(MfcArchive &file) {
+	_cmd.load(file);
+
+	_value = file.readUint32LE();
+
+	_stringObj = file.readPascalString();
+
+	return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 36eb86c..1c324a0 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -56,7 +56,8 @@ int MfcArchive::readCount() {
 enum {
 	kCInteraction = 0,
 	kMessageQueue = 1,
-	kExCommand = 2
+	kExCommand = 2,
+	kCObjstateCommand = 3
 };
 
 const struct {
@@ -66,6 +67,7 @@ const struct {
 	{ "CInteraction",	kCInteraction },
 	{ "MessageQueue",	kMessageQueue },
 	{ "ExCommand",		kExCommand },
+	{ "CObjstateCommand", kCObjstateCommand },
 	{ 0, 0 }
 };
 
@@ -125,6 +127,8 @@ CObject *MfcArchive::parseClass() {
 		return new MessageQueue();
 	case kExCommand:
 		return new ExCommand();
+	case kCObjstateCommand:
+		return new CObjstateCommand();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: 0b1bda78fc5144c8ea03e597face630c29a5a88f
    https://github.com/scummvm/scummvm/commit/0b1bda78fc5144c8ea03e597face630c29a5a88f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:10-07:00

Commit Message:
FULLPIPE: Fix object loading

Changed paths:
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 1c324a0..5da6311 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -103,10 +103,14 @@ CObject *MfcArchive::parseClass() {
 
 		objectId = _classMap[name];
 		_objectMap.push_back(objectId);
-		_objectMap.push_back(objectId); // Gross HACK
+		debug(0, "tag: %d (%x)", _objectMap.size() - 1, objectId);
 
-		debug(0, "tag: %d", _objectMap.size() - 1);
+		objectId = _classMap[name];
 	} else {
+		if ((obTag & 0x8000) == 0) {
+			error("Wrong object index format: %d  at 0x%08x", obTag, pos() - 2);
+		}
+
 		obTag &= ~0x8000;
 
 		debug(0, "parseClass::obTag <%d>", obTag);
@@ -118,6 +122,8 @@ CObject *MfcArchive::parseClass() {
 		objectId = _objectMap[obTag];
 	}
 	
+	_objectMap.push_back(objectId);
+
 	debug(0, "objectId: %d", objectId);
 
 	switch (objectId) {


Commit: da00b7143e08a0ed95142e4401896bd7653b04ab
    https://github.com/scummvm/scummvm/commit/da00b7143e08a0ed95142e4401896bd7653b04ab
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:10-07:00

Commit Message:
FULLPIPE: Add more debug output to archive loading

Changed paths:
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 5da6311..6534c64 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -71,8 +71,18 @@ const struct {
 	{ 0, 0 }
 };
 
+static const char *lookupObjectId(int id) {
+	for (int i = 0; classMap[i].name; i++) {
+		if (classMap[i].id == id)
+			return classMap[i].name;
+	}
+
+	return "";
+}
+
+
 MfcArchive::MfcArchive() {
-	for (int i; classMap[i].name; i++) {
+	for (int i = 0; classMap[i].name; i++) {
 		_classMap[classMap[i].name] = classMap[i].id;
 	}
 
@@ -87,7 +97,7 @@ CObject *MfcArchive::parseClass() {
 
 	uint obTag = readUint16LE();
 
-	debug(0, "parseClass::obTag = %d (%04x)", obTag, obTag);
+	debug(0, "parseClass::obTag = %d (%04x)  at 0x%08x", obTag, obTag, pos() - 2);
 
 	if (obTag == 0xffff) {
 		int schema = readUint16LE();
@@ -113,12 +123,12 @@ CObject *MfcArchive::parseClass() {
 
 		obTag &= ~0x8000;
 
-		debug(0, "parseClass::obTag <%d>", obTag);
-
 		if (_objectMap.size() < obTag) {
 			error("Object index too big: %d  at 0x%08x", obTag, pos() - 2);
 		}
 
+		debug(0, "parseClass::obTag <%s>", lookupObjectId(_objectMap[obTag]));
+
 		objectId = _objectMap[obTag];
 	}
 	


Commit: 54624966ce933e8a43fbf32dff0731b0db517e4a
    https://github.com/scummvm/scummvm/commit/54624966ce933e8a43fbf32dff0731b0db517e4a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:10-07:00

Commit Message:
FULLPIPE: Finish loading CInteractions

Changed paths:
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index fe67bf9..c2a244b 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -290,11 +290,11 @@ bool CInteraction::load(MfcArchive &file) {
 	_flags = file.readUint32LE();
 	_stringObj = file.readPascalString();
 
-	debug(0, "CInteraction::_stringObj = %s", _stringObj);
-
 	// messageQueue
 	_messageQueue = (MessageQueue *)file.parseClass();
-	_messageQueue->load(file);
+
+	if (_messageQueue)
+		_messageQueue->load(file);
 
 	return true;
 }
@@ -315,7 +315,6 @@ bool MessageQueue::load(MfcArchive &file) {
 
 	_stringObj = file.readPascalString();
 	debug(0, "MessageQueue::count = %d", count);
-	debug(0, "MessageQueue::_stringObj = %s", _stringObj);
 
 	for (int i = 0; i < count; i++) {
 		CObject *tmp = file.parseClass();
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 6534c64..09f00b8 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -41,6 +41,8 @@ char *MfcArchive::readPascalString(bool twoByte) {
 	tmp = (char *)calloc(len + 1, 1);
 	read(tmp, len);
 
+	debug(0, "readPascalString: %d <%s>", len, tmp);
+
 	return tmp;
 }
 
@@ -54,10 +56,11 @@ int MfcArchive::readCount() {
 }
 
 enum {
-	kCInteraction = 0,
-	kMessageQueue = 1,
-	kExCommand = 2,
-	kCObjstateCommand = 3
+	kNullObject = 0,
+	kCInteraction = 1,
+	kMessageQueue = 2,
+	kExCommand = 3,
+	kCObjstateCommand = 4
 };
 
 const struct {
@@ -88,7 +91,7 @@ MfcArchive::MfcArchive() {
 
 	_lastIndex = 1;
 
-	_objectMap.push_back(0);
+	_objectMap.push_back(kNullObject);
 }
 
 CObject *MfcArchive::parseClass() {
@@ -116,10 +119,9 @@ CObject *MfcArchive::parseClass() {
 		debug(0, "tag: %d (%x)", _objectMap.size() - 1, objectId);
 
 		objectId = _classMap[name];
+	} else if ((obTag & 0x8000) == 0) {
+		objectId = _objectMap[obTag];
 	} else {
-		if ((obTag & 0x8000) == 0) {
-			error("Wrong object index format: %d  at 0x%08x", obTag, pos() - 2);
-		}
 
 		obTag &= ~0x8000;
 
@@ -145,6 +147,9 @@ CObject *MfcArchive::parseClass() {
 		return new ExCommand();
 	case kCObjstateCommand:
 		return new CObjstateCommand();
+	case kNullObject:
+		warning("parseClass: NULL object  at 0x%08x", pos() - 2);
+		return 0;
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: 775065af1d23d9114594c96a77ecf04f1e722795
    https://github.com/scummvm/scummvm/commit/775065af1d23d9114594c96a77ecf04f1e722795
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:10-07:00

Commit Message:
FULLPIPE: Started CGameVar loading

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 36f6996..5f54790 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -31,7 +31,7 @@ class CObject {
 	virtual ~CObject() {}
 };
 
-class CObList : Common::List<CObject>, public CObject {
+class CObList : public Common::List<CObject>, public CObject {
  public:
 	virtual bool load(MfcArchive &file);
 };
@@ -52,12 +52,9 @@ class MemoryObject {
 	int libHandle;
 };
 
-class CObArray {
-	//CObject obj;
-	int m_pData;
-	int m_nSize;
-	int m_nMaxSize;
-	int m_nGrowBy;
+class CObArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
 };
 
 struct CNode {
@@ -82,16 +79,13 @@ class SceneTag : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-typedef Common::List<SceneTag> SceneTagList_;
-
-class SceneTagList : public CObject {
-	SceneTagList_ _list;
-
+class SceneTagList : public Common::List<SceneTag>, public CObject {
  public:
 	virtual bool load(MfcArchive &file);
 };
 
 class GameProject : public CObject {
+ public:
 	int _field_4;
 	char *_headerFilename;
 	SceneTagList *_sceneTagList;
@@ -180,13 +174,13 @@ class CInputController {
 };
 
 class Sc2Array {
-	CObArray objs;
+	CObArray _objs;
 };
 
 union VarValue {
-	int floatValue;
+	float floatValue;
 	int intValue;
-	int stringValue;
+	char *stringValue;
 };
 
 class Message {
@@ -222,16 +216,19 @@ class ExCommand : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class CGameVar {
-	//CObject obj;
-	CGameVar *nextVarObj;
-	CGameVar *prevVarObj;
-	CGameVar *parentVarObj;
-	CGameVar *subVars;
-	int field_14;
-	char *stringObj;
-	VarValue value;
-	int varType;
+ class CGameVar : public CObject {
+	CGameVar *_nextVarObj;
+	CGameVar *_prevVarObj;
+	CGameVar *_parentVarObj;
+	CGameVar *_subVars;
+	CGameVar *_field_14;
+	char *_stringObj;
+	VarValue _value;
+	int _varType;
+
+ public:
+	CGameVar();
+	virtual bool load(MfcArchive &file);
 };
 
 class InventoryPoolItem {
@@ -358,6 +355,18 @@ class CInventory2 : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
+struct PreloadItem {
+	int preloadId1;
+	int preloadId2;
+	int sceneId;
+	int field_C;
+};
+
+class PreloadItems : public Common::Array<PreloadItem>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
 class CGameLoader {
  public:
 	CGameLoader();
@@ -387,7 +396,7 @@ class CGameLoader {
 	void *_readSavegameCallback;
 	int16 _field_F8;
 	int16 _field_FA;
-	CObArray _preloadItems;
+	PreloadItems _preloadItems;
 	CGameVar *_gameVar;
 	char *_gameName;
 	ExCommand _exCommand;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index c2a244b..64604a2 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -102,10 +102,19 @@ bool CGameLoader::load(MfcArchive &file) {
 
 	_inventory.load(file);
 
-	debug(0, "%x", file.pos());
-
 	_interactionController->load(file);
 
+	debug(0, "count: %d", _gameProject->_sceneTagList->size());
+
+	// TODO: Load Sc2
+
+	_preloadItems.load(file);
+
+	_field_FA = file.readUint16LE();
+	_field_F8 = file.readUint16LE();
+
+	_gameVar = (CGameVar *)file.readClass();
+
 	return true;
 }
 
@@ -158,7 +167,7 @@ bool SceneTagList::load(MfcArchive &file) {
 	for (int i = 0; i < numEntries; i++) {
 		SceneTag *t = new SceneTag();
 		t->load(file);
-		_list.push_back(*t);
+		push_back(*t);
 	}
 
 	return true;
@@ -247,8 +256,7 @@ bool CObList::load(MfcArchive &file) {
 	debug(0, "CObList::count: %d", count);
 
 	for (int i = 0; i < count; i++) {
-		CObject *t = file.parseClass();
-		t->load(file);
+		CObject *t = file.readClass();
 
 		push_back(*t);
 	}
@@ -290,11 +298,7 @@ bool CInteraction::load(MfcArchive &file) {
 	_flags = file.readUint32LE();
 	_stringObj = file.readPascalString();
 
-	// messageQueue
-	_messageQueue = (MessageQueue *)file.parseClass();
-
-	if (_messageQueue)
-		_messageQueue->load(file);
+	_messageQueue = (MessageQueue *)file.readClass();
 
 	return true;
 }
@@ -317,8 +321,7 @@ bool MessageQueue::load(MfcArchive &file) {
 	debug(0, "MessageQueue::count = %d", count);
 
 	for (int i = 0; i < count; i++) {
-		CObject *tmp = file.parseClass();
-		tmp->load(file);
+		CObject *tmp = file.readClass();
 
 		_exCommands.push_back(tmp);
 	}
@@ -397,4 +400,81 @@ bool CObjstateCommand::load(MfcArchive &file) {
 	return true;
 }
 
+bool CObArray::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	debug(0, "CObArray::count: %d", count);
+
+	resize(count);
+
+	for (int i = 0; i < count; i++) {
+		CObject *t = file.readClass();
+
+		push_back(*t);
+	}
+
+	return true;
+}
+
+bool PreloadItems::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	debug(0, "CObArray::count: %d", count);
+
+	resize(count);
+
+	for (int i = 0; i < count; i++) {
+		PreloadItem *t = new PreloadItem();
+		t->preloadId1 = file.readUint32LE();
+		t->preloadId2 = file.readUint32LE();
+		t->sceneId = file.readUint32LE();
+		t->field_C = file.readUint32LE();
+
+		push_back(*t);
+	}
+
+	return true;
+}
+
+CGameVar::CGameVar() {
+	_subVars = 0;
+	_parentVarObj = 0;
+	_nextVarObj = 0;
+	_prevVarObj = 0;
+	_field_14 = 0;
+	_varType = 0;
+	_value.floatValue = 0;
+}
+
+bool CGameVar::load(MfcArchive &file) {
+	_stringObj = file.readPascalString();
+	_varType = file.readUint32LE();
+	debug(0, "CGameVar: %d", _varType);
+
+	switch (_varType) {
+	case 0:
+		_value.intValue = file.readUint32LE();
+		debug(0, "--> %d", _value.intValue);
+		break;
+	case 1:
+		_value.intValue = file.readUint32LE(); // FIXME
+		debug(0, "--> %f", _value.floatValue);
+		break;
+	case 2:
+		_value.stringValue = file.readPascalString();
+		debug(0, "--> %s", _value.stringValue);
+		break;
+	default:
+		error("Unknown var type");
+	}
+
+	_parentVarObj = (CGameVar *)file.readClass();
+	_prevVarObj = (CGameVar *)file.readClass();
+	_nextVarObj = (CGameVar *)file.readClass();
+	_field_14 = (CGameVar *)file.readClass();
+	_subVars = (CGameVar *)file.readClass();
+
+	return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 09f00b8..aa4c270 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -60,7 +60,8 @@ enum {
 	kCInteraction = 1,
 	kMessageQueue = 2,
 	kExCommand = 3,
-	kCObjstateCommand = 4
+	kCObjstateCommand = 4,
+	kCGameVar = 5
 };
 
 const struct {
@@ -71,6 +72,7 @@ const struct {
 	{ "MessageQueue",	kMessageQueue },
 	{ "ExCommand",		kExCommand },
 	{ "CObjstateCommand", kCObjstateCommand },
+	{ "CGameVar",		kCGameVar },
 	{ 0, 0 }
 };
 
@@ -94,6 +96,15 @@ MfcArchive::MfcArchive() {
 	_objectMap.push_back(kNullObject);
 }
 
+CObject *MfcArchive::readClass() {
+	CObject *res = parseClass();
+
+	if (res)
+		res->load(*this);
+
+	return res;
+}
+
 CObject *MfcArchive::parseClass() {
 	char *name;
 	int objectId;
@@ -139,6 +150,9 @@ CObject *MfcArchive::parseClass() {
 	debug(0, "objectId: %d", objectId);
 
 	switch (objectId) {
+	case kNullObject:
+		warning("parseClass: NULL object  at 0x%08x", pos() - 2);
+		return 0;
 	case kCInteraction:
 		return new CInteraction();
 	case kMessageQueue:
@@ -147,9 +161,8 @@ CObject *MfcArchive::parseClass() {
 		return new ExCommand();
 	case kCObjstateCommand:
 		return new CObjstateCommand();
-	case kNullObject:
-		warning("parseClass: NULL object  at 0x%08x", pos() - 2);
-		return 0;
+	case kCGameVar:
+		return new CGameVar();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index df56262..a4e9413 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -44,6 +44,7 @@ class MfcArchive : public Common::File {
 	char *readPascalString(bool twoByte = false);
 	int readCount();
 	CObject *parseClass();
+	CObject *readClass();
 };
 
 } // End of namespace Fullpipe


Commit: f106d791983223906847343c4b1f1ec7ffcc05d5
    https://github.com/scummvm/scummvm/commit/f106d791983223906847343c4b1f1ec7ffcc05d5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:10-07:00

Commit Message:
FULLPIPE: Fix object indexing

Changed paths:
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 64604a2..4189183 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -449,20 +449,19 @@ CGameVar::CGameVar() {
 bool CGameVar::load(MfcArchive &file) {
 	_stringObj = file.readPascalString();
 	_varType = file.readUint32LE();
-	debug(0, "CGameVar: %d", _varType);
 
 	switch (_varType) {
 	case 0:
 		_value.intValue = file.readUint32LE();
-		debug(0, "--> %d", _value.intValue);
+		debug(0, "d --> %d", _value.intValue);
 		break;
 	case 1:
 		_value.intValue = file.readUint32LE(); // FIXME
-		debug(0, "--> %f", _value.floatValue);
+		debug(0, "f --> %f", _value.floatValue);
 		break;
 	case 2:
 		_value.stringValue = file.readPascalString();
-		debug(0, "--> %s", _value.stringValue);
+		debug(0, "s --> %s", _value.stringValue);
 		break;
 	default:
 		error("Unknown var type");
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index aa4c270..a81665b 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -127,7 +127,7 @@ CObject *MfcArchive::parseClass() {
 
 		objectId = _classMap[name];
 		_objectMap.push_back(objectId);
-		debug(0, "tag: %d (%x)", _objectMap.size() - 1, objectId);
+		debug(0, "tag: %d 0x%x (%x)", _objectMap.size() - 1, _objectMap.size() - 1, objectId);
 
 		objectId = _classMap[name];
 	} else if ((obTag & 0x8000) == 0) {
@@ -145,7 +145,8 @@ CObject *MfcArchive::parseClass() {
 		objectId = _objectMap[obTag];
 	}
 	
-	_objectMap.push_back(objectId);
+	if (objectId)
+		_objectMap.push_back(objectId);
 
 	debug(0, "objectId: %d", objectId);
 


Commit: a116677e6e26ed9d0e8fcc40eaf88c0c40b25391
    https://github.com/scummvm/scummvm/commit/a116677e6e26ed9d0e8fcc40eaf88c0c40b25391
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:11-07:00

Commit Message:
FULLPIPE: Finish loading fullpipe.gam

Changed paths:
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 4189183..675a70c 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -464,7 +464,7 @@ bool CGameVar::load(MfcArchive &file) {
 		debug(0, "s --> %s", _value.stringValue);
 		break;
 	default:
-		error("Unknown var type");
+		error("Unknown var type: %d (0x%x)", _varType, _varType);
 	}
 
 	_parentVarObj = (CGameVar *)file.readClass();
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index a81665b..5df9a28 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -41,7 +41,7 @@ char *MfcArchive::readPascalString(bool twoByte) {
 	tmp = (char *)calloc(len + 1, 1);
 	read(tmp, len);
 
-	debug(0, "readPascalString: %d <%s>", len, tmp);
+	debug(9, "readPascalString: %d <%s>", len, tmp);
 
 	return tmp;
 }
@@ -85,6 +85,26 @@ static const char *lookupObjectId(int id) {
 	return "";
 }
 
+static CObject *createObject(int objectId) {
+	switch (objectId) {
+	case kNullObject:
+		return 0;
+	case kCInteraction:
+		return new CInteraction();
+	case kMessageQueue:
+		return new MessageQueue();
+	case kExCommand:
+		return new ExCommand();
+	case kCObjstateCommand:
+		return new CObjstateCommand();
+	case kCGameVar:
+		return new CGameVar();
+	default:
+		error("Unknown objectId: %d", objectId);
+	}
+
+	return 0;
+}
 
 MfcArchive::MfcArchive() {
 	for (int i = 0; classMap[i].name; i++) {
@@ -93,45 +113,60 @@ MfcArchive::MfcArchive() {
 
 	_lastIndex = 1;
 
-	_objectMap.push_back(kNullObject);
+	_objectMap.push_back(0);
+	_objectIdMap.push_back(kNullObject);
 }
 
 CObject *MfcArchive::readClass() {
-	CObject *res = parseClass();
+	bool isCopyReturned;
+	CObject *res = parseClass(&isCopyReturned);
 
-	if (res)
+	if (res && !isCopyReturned)
 		res->load(*this);
 
 	return res;
 }
 
-CObject *MfcArchive::parseClass() {
+CObject *MfcArchive::parseClass(bool *isCopyReturned) {
 	char *name;
-	int objectId;
+	int objectId = 0;
+	CObject *res = 0;
 
 	uint obTag = readUint16LE();
 
-	debug(0, "parseClass::obTag = %d (%04x)  at 0x%08x", obTag, obTag, pos() - 2);
+	debug(7, "parseClass::obTag = %d (%04x)  at 0x%08x", obTag, obTag, pos() - 2);
 
 	if (obTag == 0xffff) {
 		int schema = readUint16LE();
 
-		debug(0, "parseClass::schema = %d", schema);
+		debug(7, "parseClass::schema = %d", schema);
 
 		name = readPascalString(true);
-		debug(0, "parseClass::class <%s>", name);
+		debug(7, "parseClass::class <%s>", name);
 
 		if (!_classMap.contains(name)) {
 			error("Unknown class in MfcArchive: <%s>", name);
 		}
 
 		objectId = _classMap[name];
-		_objectMap.push_back(objectId);
-		debug(0, "tag: %d 0x%x (%x)", _objectMap.size() - 1, _objectMap.size() - 1, objectId);
 
-		objectId = _classMap[name];
+		debug(7, "tag: %d 0x%x (%x)", _objectMap.size() - 1, _objectMap.size() - 1, objectId);
+
+		res = createObject(objectId);
+		_objectMap.push_back(res);
+		_objectIdMap.push_back(objectId);
+
+		_objectMap.push_back(res); // Basically a hack, but behavior is all correct
+		_objectIdMap.push_back(objectId);
+
+		*isCopyReturned = false;
 	} else if ((obTag & 0x8000) == 0) {
-		objectId = _objectMap[obTag];
+		if (_objectMap.size() < obTag) {
+			error("Object index too big: %d  at 0x%08x", obTag, pos() - 2);
+		}
+		res = _objectMap[obTag];
+
+		*isCopyReturned = true;
 	} else {
 
 		obTag &= ~0x8000;
@@ -140,35 +175,18 @@ CObject *MfcArchive::parseClass() {
 			error("Object index too big: %d  at 0x%08x", obTag, pos() - 2);
 		}
 
-		debug(0, "parseClass::obTag <%s>", lookupObjectId(_objectMap[obTag]));
+		debug(7, "parseClass::obTag <%s>", lookupObjectId(_objectIdMap[obTag]));
 
-		objectId = _objectMap[obTag];
-	}
-	
-	if (objectId)
-		_objectMap.push_back(objectId);
+		objectId = _objectIdMap[obTag];
 
-	debug(0, "objectId: %d", objectId);
+		res = createObject(objectId);
+		_objectMap.push_back(res);
+		_objectIdMap.push_back(objectId);
 
-	switch (objectId) {
-	case kNullObject:
-		warning("parseClass: NULL object  at 0x%08x", pos() - 2);
-		return 0;
-	case kCInteraction:
-		return new CInteraction();
-	case kMessageQueue:
-		return new MessageQueue();
-	case kExCommand:
-		return new ExCommand();
-	case kCObjstateCommand:
-		return new CObjstateCommand();
-	case kCGameVar:
-		return new CGameVar();
-	default:
-		error("Unknown objectId: %d", objectId);
+		*isCopyReturned = false;
 	}
 
-	return 0;
+	return res;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index a4e9413..abf7efb 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -34,7 +34,8 @@ typedef Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::Ig
 
 class MfcArchive : public Common::File {
 	ClassMap _classMap;
-	Common::Array<int> _objectMap;
+	Common::Array<CObject *> _objectMap;
+	Common::Array<int> _objectIdMap;
 
 	int _lastIndex;
 
@@ -43,7 +44,7 @@ class MfcArchive : public Common::File {
 
 	char *readPascalString(bool twoByte = false);
 	int readCount();
-	CObject *parseClass();
+	CObject *parseClass(bool *isCopyReturned);
 	CObject *readClass();
 };
 


Commit: ffd8ebacc51b873aca4e9e36227be11647e1442a
    https://github.com/scummvm/scummvm/commit/ffd8ebacc51b873aca4e9e36227be11647e1442a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:11-07:00

Commit Message:
FULLPIPE: Removed excess debugging info and added variable levels

Changed paths:
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 675a70c..e9c5c3a 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -87,7 +87,7 @@ bool CGameLoader::loadFile(const char *fname) {
 
 bool CGameLoader::load(MfcArchive &file) {
 	_gameName = file.readPascalString();
-	debug(0, "_gameName: %s", _gameName);
+	debug(6, "_gameName: %s", _gameName);
 
 	_gameProject = new GameProject();
 
@@ -98,13 +98,13 @@ bool CGameLoader::load(MfcArchive &file) {
 	}
 
 	_gameName = file.readPascalString();
-	debug(0, "_gameName: %s", _gameName);
+	debug(6, "_gameName: %s", _gameName);
 
 	_inventory.load(file);
 
 	_interactionController->load(file);
 
-	debug(0, "count: %d", _gameProject->_sceneTagList->size());
+	debug(6, "sceneTag count: %d", _gameProject->_sceneTagList->size());
 
 	// TODO: Load Sc2
 
@@ -135,10 +135,10 @@ bool GameProject::load(MfcArchive &file) {
 
 	_headerFilename = file.readPascalString();
 
-	debug(0, "_gameProjectVersion = %d", g_gameProjectVersion);
-	debug(0, "_gameProjectValue = %d", g_gameProjectValue);
-	debug(0, "_scrollSpeed = %d", g_scrollSpeed);
-	debug(0, "_headerFilename = %s", _headerFilename);
+	debug(1, "_gameProjectVersion = %d", g_gameProjectVersion);
+	debug(1, "_gameProjectValue = %d", g_gameProjectValue);
+	debug(1, "_scrollSpeed = %d", g_scrollSpeed);
+	debug(1, "_headerFilename = %s", _headerFilename);
 
 	_sceneTagList = new SceneTagList();
 
@@ -162,8 +162,6 @@ GameProject::~GameProject() {
 bool SceneTagList::load(MfcArchive &file) {
 	int numEntries = file.readUint16LE();
 
-	debug(0, "numEntries: %d", numEntries);
-
 	for (int i = 0; i < numEntries; i++) {
 		SceneTag *t = new SceneTag();
 		t->load(file);
@@ -186,7 +184,7 @@ bool SceneTag::load(MfcArchive &file) {
 
 	_tag = file.readPascalString();
 
-	debug(0, "sceneId: %d  tag: %s", _sceneId, _tag);
+	debug(6, "sceneId: %d  tag: %s", _sceneId, _tag);
 
 	return true;
 }
@@ -199,8 +197,6 @@ bool CInventory::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 	int numInvs = file.readUint32LE();
 
-	debug(0, "numInvs: %d %x", numInvs, numInvs);
-
 	for (int i = 0; i < numInvs; i++) {
 		InventoryPoolItem *t = new InventoryPoolItem();
 		t->_id = file.readUint16LE();
@@ -234,8 +230,6 @@ bool CInventory2::load(MfcArchive &file) {
 bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartially
 	int numInvs = file.readUint32LE();
 
-	debug(0, "numInvs: %d", numInvs);
-
 	for (int i = 0; i < numInvs; i++) {
 		InventoryItem *t = new InventoryItem();
 		t->itemId = file.readUint16LE();
@@ -253,8 +247,6 @@ bool CInteractionController::load(MfcArchive &file) {
 bool CObList::load(MfcArchive &file) {
 	int count = file.readCount();
 
-	debug(0, "CObList::count: %d", count);
-
 	for (int i = 0; i < count; i++) {
 		CObject *t = file.readClass();
 
@@ -318,7 +310,6 @@ bool MessageQueue::load(MfcArchive &file) {
 	int count = file.readUint16LE();
 
 	_stringObj = file.readPascalString();
-	debug(0, "MessageQueue::count = %d", count);
 
 	for (int i = 0; i < count; i++) {
 		CObject *tmp = file.readClass();
@@ -342,8 +333,6 @@ ExCommand::ExCommand() {
 }
 
 bool ExCommand::load(MfcArchive &file) {
-	debug(0, "ExCommand::load");
-
 	_msg._parentId = file.readUint16LE();
 	_msg._messageKind = file.readUint32LE();
 	_msg._x = file.readUint32LE();
@@ -403,8 +392,6 @@ bool CObjstateCommand::load(MfcArchive &file) {
 bool CObArray::load(MfcArchive &file) {
 	int count = file.readCount();
 
-	debug(0, "CObArray::count: %d", count);
-
 	resize(count);
 
 	for (int i = 0; i < count; i++) {
@@ -419,8 +406,6 @@ bool CObArray::load(MfcArchive &file) {
 bool PreloadItems::load(MfcArchive &file) {
 	int count = file.readCount();
 
-	debug(0, "CObArray::count: %d", count);
-
 	resize(count);
 
 	for (int i = 0; i < count; i++) {
@@ -450,28 +435,36 @@ bool CGameVar::load(MfcArchive &file) {
 	_stringObj = file.readPascalString();
 	_varType = file.readUint32LE();
 
+	debugN(6, "[%03d] ", file.getLevel());
+	for (int i = 0; i < file.getLevel(); i++)
+		debugN(6, " ");
+
+	debugN(6, "<%s>: ", _stringObj);
+
 	switch (_varType) {
 	case 0:
 		_value.intValue = file.readUint32LE();
-		debug(0, "d --> %d", _value.intValue);
+		debug(6, "d --> %d", _value.intValue);
 		break;
 	case 1:
 		_value.intValue = file.readUint32LE(); // FIXME
-		debug(0, "f --> %f", _value.floatValue);
+		debug(6, "f --> %f", _value.floatValue);
 		break;
 	case 2:
 		_value.stringValue = file.readPascalString();
-		debug(0, "s --> %s", _value.stringValue);
+		debug(6, "s --> %s", _value.stringValue);
 		break;
 	default:
 		error("Unknown var type: %d (0x%x)", _varType, _varType);
 	}
 
+	file.incLevel();
 	_parentVarObj = (CGameVar *)file.readClass();
 	_prevVarObj = (CGameVar *)file.readClass();
 	_nextVarObj = (CGameVar *)file.readClass();
 	_field_14 = (CGameVar *)file.readClass();
 	_subVars = (CGameVar *)file.readClass();
+	file.decLevel();
 
 	return true;
 }
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 5df9a28..d85a01d 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -112,6 +112,7 @@ MfcArchive::MfcArchive() {
 	}
 
 	_lastIndex = 1;
+	_level = 0;
 
 	_objectMap.push_back(0);
 	_objectIdMap.push_back(kNullObject);
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index abf7efb..7b117ef 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -38,6 +38,7 @@ class MfcArchive : public Common::File {
 	Common::Array<int> _objectIdMap;
 
 	int _lastIndex;
+	int _level;
 
  public:
 	MfcArchive();
@@ -46,6 +47,10 @@ class MfcArchive : public Common::File {
 	int readCount();
 	CObject *parseClass(bool *isCopyReturned);
 	CObject *readClass();
+
+	void incLevel() { _level++; }
+	void decLevel() { _level--; }
+	int getLevel() { return _level; }
 };
 
 } // End of namespace Fullpipe


Commit: d3d3d01eb08cd7ee37480a9427bc563242aceeed
    https://github.com/scummvm/scummvm/commit/d3d3d01eb08cd7ee37480a9427bc563242aceeed
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:11-07:00

Commit Message:
FULLPIPE: Started sc2 file loading implementation

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 5f54790..a974852d 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -29,6 +29,8 @@ class CObject {
  public:
 	virtual bool load(MfcArchive &in) { return true; }
 	virtual ~CObject() {}
+
+	bool loadFile(const char *fname);
 };
 
 class CObList : public Common::List<CObject>, public CObject {
@@ -66,6 +68,7 @@ struct CNode {
 typedef Common::Array<void *> CPtrList;
 
 class SceneTag : public CObject {
+ public:
 	int _field_4;
 	char *_tag;
 	int _scene;
@@ -173,8 +176,26 @@ class CInputController {
 	CInputController();
 };
 
-class Sc2Array {
-	CObArray _objs;
+class Sc2 : public CObject {
+	int16 _sceneId;
+	int16 _field_2;
+	//Scene *_scene;
+	//CMotionController *_motionController;
+	int _data1;
+	int _count1;
+	int _defPicAniInfos;
+	int _defPicAniInfosCount;
+	int _picAniInfos;
+	int _picAniInfosCount;
+	int _isLoaded;
+	int _entranceData;
+	int _entranceDataCount;
+
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class Sc2Array : public Common::Array<Sc2> {
 };
 
 union VarValue {
@@ -367,12 +388,11 @@ class PreloadItems : public Common::Array<PreloadItem>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class CGameLoader {
+class CGameLoader : public CObject {
  public:
 	CGameLoader();
 	virtual ~CGameLoader();
 
-	bool loadFile(const char *fname);
 	virtual bool load(MfcArchive &file);
 
  private:
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index e9c5c3a..4602cee 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -76,7 +76,7 @@ CGameLoader::~CGameLoader() {
 	delete _gameProject;
 }
 
-bool CGameLoader::loadFile(const char *fname) {
+bool CObject::loadFile(const char *fname) {
 	MfcArchive file;
 
 	if (!file.open(fname))
@@ -106,7 +106,18 @@ bool CGameLoader::load(MfcArchive &file) {
 
 	debug(6, "sceneTag count: %d", _gameProject->_sceneTagList->size());
 
-	// TODO: Load Sc2
+	_sc2array.resize(_gameProject->_sceneTagList->size());
+
+	int i = 0;
+	for (SceneTagList::const_iterator it = _gameProject->_sceneTagList->begin(); it != _gameProject->_sceneTagList->end(); ++it, i++) {
+		char tmp[12];
+
+		snprintf(tmp, 11, "%04d.sc2", it->_sceneId);
+
+		debug(0, "sc: %d", it->_sceneId);
+
+		_sc2array[i].loadFile((const char *)tmp);
+	}
 
 	_preloadItems.load(file);
 
@@ -469,4 +480,10 @@ bool CGameVar::load(MfcArchive &file) {
 	return true;
 }
 
+bool Sc2::load(MfcArchive &file) {
+	_sceneId = file.readUint16LE();
+
+	return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index d85a01d..764da5a 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -56,12 +56,12 @@ int MfcArchive::readCount() {
 }
 
 enum {
-	kNullObject = 0,
-	kCInteraction = 1,
-	kMessageQueue = 2,
-	kExCommand = 3,
-	kCObjstateCommand = 4,
-	kCGameVar = 5
+	kNullObject,
+	kCInteraction,
+	kMessageQueue,
+	kExCommand,
+	kCObjstateCommand,
+	kCGameVar
 };
 
 const struct {


Commit: 928c19eeb0b2164fc925e71eed8ed1f4e137ddd2
    https://github.com/scummvm/scummvm/commit/928c19eeb0b2164fc925e71eed8ed1f4e137ddd2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:11-07:00

Commit Message:
FULLPIPE: More work on Sc2 loader

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index a974852d..069d25d 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -176,11 +176,20 @@ class CInputController {
 	CInputController();
 };
 
+class CMotionController : public CObject {
+	int _field_4;
+	int _isEnabled;
+
+ public:
+	CMotionController() : _isEnabled(1) {}
+	virtual bool load(MfcArchive &file);
+};
+
 class Sc2 : public CObject {
 	int16 _sceneId;
 	int16 _field_2;
 	//Scene *_scene;
-	//CMotionController *_motionController;
+	CMotionController *_motionController;
 	int _data1;
 	int _count1;
 	int _defPicAniInfos;
@@ -192,6 +201,7 @@ class Sc2 : public CObject {
 	int _entranceDataCount;
 
  public:
+	Sc2();
 	virtual bool load(MfcArchive &file);
 };
 
@@ -396,7 +406,6 @@ class CGameLoader : public CObject {
 	virtual bool load(MfcArchive &file);
 
  private:
-	//CObject _obj;
 	GameProject *_gameProject;
 	CInteractionController *_interactionController;
 	int _field_C;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 4602cee..ea8a3db 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -480,9 +480,35 @@ bool CGameVar::load(MfcArchive &file) {
 	return true;
 }
 
+Sc2::Sc2() {
+	_sceneId = 0;
+	_field_2 = 0;
+	//_scene = 0;
+	_motionController = 0;
+	_data1 = 0;
+	_count1 = 0;
+	_defPicAniInfos = 0;
+	_defPicAniInfosCount = 0;
+	_picAniInfos = 0;
+	_picAniInfosCount = 0;
+	_isLoaded = 0;
+	_entranceData = 0;
+	_entranceDataCount = 0;
+}
+
 bool Sc2::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 
+	file.readClass();
+	_motionController->load(file);
+
+	return true;
+}
+
+
+bool CMotionController::load(MfcArchive &file) {
+	// Is originally empty
+
 	return true;
 }
 


Commit: e24ce22ca7b62982c31a8a907f8423983be39bde
    https://github.com/scummvm/scummvm/commit/e24ce22ca7b62982c31a8a907f8423983be39bde
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:11-07:00

Commit Message:
FULLPIPE: Continued work on loading sc2 files

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 069d25d..e6ed98d 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -185,6 +185,18 @@ class CMotionController : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
+class CMctlCompoundArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class CMctlCompound : public CMotionController {
+	CMctlCompoundArray motionControllers;
+
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
 class Sc2 : public CObject {
 	int16 _sceneId;
 	int16 _field_2;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index ea8a3db..9698da8 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -499,15 +499,31 @@ Sc2::Sc2() {
 bool Sc2::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 
-	file.readClass();
-	_motionController->load(file);
+	_motionController = (CMotionController *)file.readClass();
 
 	return true;
 }
 
 
 bool CMotionController::load(MfcArchive &file) {
-	// Is originally empty
+	// Is originally empty	file.readClass();
+
+
+	return true;
+}
+
+bool CMctlCompound::load(MfcArchive &file) {
+	int count = file.readUint32LE();
+
+	debug(0, "CMctlCompund::count = %d", count);
+
+	return true;
+}
+
+bool CMctlCompoundArray::load(MfcArchive &file) {
+	int count = file.readUint32LE();
+
+	debug(0, "CMctlCompundArray::count = %d", count);
 
 	return true;
 }
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 764da5a..9c9246a 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -61,7 +61,8 @@ enum {
 	kMessageQueue,
 	kExCommand,
 	kCObjstateCommand,
-	kCGameVar
+	kCGameVar,
+	kCMctlCompound
 };
 
 const struct {
@@ -73,6 +74,7 @@ const struct {
 	{ "ExCommand",		kExCommand },
 	{ "CObjstateCommand", kCObjstateCommand },
 	{ "CGameVar",		kCGameVar },
+	{ "CMctlCompound",	kCMctlCompound },
 	{ 0, 0 }
 };
 
@@ -99,6 +101,8 @@ static CObject *createObject(int objectId) {
 		return new CObjstateCommand();
 	case kCGameVar:
 		return new CGameVar();
+	case kCMctlCompound:
+		return new CMctlCompound();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: 5eaa5696e7b80b3dcc4e26979b3ee1976cba4b49
    https://github.com/scummvm/scummvm/commit/5eaa5696e7b80b3dcc4e26979b3ee1976cba4b49
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: Added module.mk

OOPS!

Changed paths:
  A engines/fullpipe/module.mk



diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
new file mode 100644
index 0000000..319df8c
--- /dev/null
+++ b/engines/fullpipe/module.mk
@@ -0,0 +1,16 @@
+MODULE := engines/fullpipe
+
+MODULE_OBJS = \
+	detection.o \
+	fullpipe.o \
+	ngiarchive.o \
+	stateloader.o \
+	utils.o
+
+# This module can be built as a plugin
+ifdef BUILD_PLUGINS
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk


Commit: a3de44d3b2ca9e30692d074fd538f89f20611c8c
    https://github.com/scummvm/scummvm/commit/a3de44d3b2ca9e30692d074fd538f89f20611c8c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: Further work on sc2 loader

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index e6ed98d..81b172c 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -190,17 +190,89 @@ class CMctlCompoundArray : public Common::Array<CObject>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
+class CMctlConnectionPointsArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class CMctlCompoundArrayItem : public CObject {
+  int _motionControllerObj;
+  int _movGraphReactObj;
+  CMctlConnectionPointsArray _connectionPoints;
+  int _field_20;
+  int _field_24;
+  int _field_28;
+
+ public:
+	CMctlCompoundArrayItem() : _movGraphReactObj(0), _motionControllerObj(0) {}
+};
+
 class CMctlCompound : public CMotionController {
-	CMctlCompoundArray motionControllers;
+	CMctlCompoundArray _motionControllers;
+
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class Unk2 {
+  //CObject CObject;
+  int items;
+  int count;
+};
 
+class CMovGraph : public CMotionController {
+  CObList _nodes;
+  CObList _links;
+  int _field_44;
+  int _items;
+  int _itemsCount;
+  int (*_callback1)(int, int, int);
+  Unk2 _unk2;
+};
+
+class ShadowsItemArray : public Common::Array<CObject>, public CObject {
  public:
 	virtual bool load(MfcArchive &file);
 };
 
+class Background {
+	CPtrList list;
+	int stringObj;
+	int x;
+	int y;
+	int16 messageQueueId;
+	int colorMemoryObj;
+	int bigPictureArray1Count;
+	int bigPictureArray2Count;
+	int bigPictureArray;
+};
+
+class Shadows {
+	//CObject obj;
+	int sceneId;
+	int staticAniObjectId;
+	int movementId;
+	ShadowsItemArray items;
+};
+
+class Scene {
+	Background bg;
+	CPtrList staticANIObjectList1;
+	CPtrList staticANIObjectList2;
+	CPtrList messageQueueList;
+	CPtrList faObjectList;
+	Shadows *shadows;
+	int soundList;
+	int16 sceneId;
+	int stringObj;
+	int field_BC;
+	int libHandle;
+};
+
 class Sc2 : public CObject {
 	int16 _sceneId;
 	int16 _field_2;
-	//Scene *_scene;
+	Scene *_scene;
 	CMotionController *_motionController;
 	int _data1;
 	int _count1;
@@ -322,44 +394,6 @@ class InventoryIcon {
 
 typedef Common::Array<InventoryIcon> InventoryIcons;
 
-class Background {
-	CPtrList list;
-	int stringObj;
-	int x;
-	int y;
-	int16 messageQueueId;
-	int colorMemoryObj;
-	int bigPictureArray1Count;
-	int bigPictureArray2Count;
-	int bigPictureArray;
-};
-
-class ShadowsItemArray {
-	CObArray objs;
-};
-
-class Shadows {
-	//CObject obj;
-	int sceneId;
-	int staticAniObjectId;
-	int movementId;
-	ShadowsItemArray items;
-};
-
-class Scene {
-	Background bg;
-	CPtrList staticANIObjectList1;
-	CPtrList staticANIObjectList2;
-	CPtrList messageQueueList;
-	CPtrList faObjectList;
-	Shadows *shadows;
-	int soundList;
-	int16 sceneId;
-	int stringObj;
-	int field_BC;
-	int libHandle;
-};
-
 class Picture {
 	MemoryObject obj;
 	Common::Rect rect;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 9698da8..f242969 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -517,6 +517,12 @@ bool CMctlCompound::load(MfcArchive &file) {
 
 	debug(0, "CMctlCompund::count = %d", count);
 
+	for (int i = 0; i < count; i++) {
+	  CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
+
+	  _motionControllers.push_back(*obj);
+	}
+
 	return true;
 }
 


Commit: 0f9c1281d4e4f0c4e2e942994f9162c88033c01f
    https://github.com/scummvm/scummvm/commit/0f9c1281d4e4f0c4e2e942994f9162c88033c01f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: CMovGraph loader

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 81b172c..50f1bf0 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -214,10 +214,12 @@ class CMctlCompound : public CMotionController {
 	virtual bool load(MfcArchive &file);
 };
 
-class Unk2 {
-  //CObject CObject;
-  int items;
-  int count;
+class Unk2 : public CObject {
+  int _items;
+  int _count;
+
+ public:
+	Unk2() : _items(0), _count(0) {}
 };
 
 class CMovGraph : public CMotionController {
@@ -228,6 +230,10 @@ class CMovGraph : public CMotionController {
   int _itemsCount;
   int (*_callback1)(int, int, int);
   Unk2 _unk2;
+
+ public:
+	CMovGraph();
+	virtual bool load(MfcArchive &file);
 };
 
 class ShadowsItemArray : public Common::Array<CObject>, public CObject {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index f242969..5c68742 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -534,4 +534,19 @@ bool CMctlCompoundArray::load(MfcArchive &file) {
 	return true;
 }
 
+CMovGraph::CMovGraph() {
+  _itemsCount = 0;
+  _items = 0;
+  //_callback1 = CMovGraphCallback1;  // TODO
+  _field_44 = 0;
+  // insertMessageHandler(CMovGraph_messageHandler, getMessageHandlersCount() - 1, 129);
+}
+
+bool CMovGraph::load(MfcArchive &file) {
+  _links.load(file);
+  _nodes.load(file);
+
+  return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 9c9246a..34cf3c5 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -62,7 +62,8 @@ enum {
 	kExCommand,
 	kCObjstateCommand,
 	kCGameVar,
-	kCMctlCompound
+	kCMctlCompound,
+	kCMovGraph
 };
 
 const struct {
@@ -75,6 +76,7 @@ const struct {
 	{ "CObjstateCommand", kCObjstateCommand },
 	{ "CGameVar",		kCGameVar },
 	{ "CMctlCompound",	kCMctlCompound },
+	{ "CMovGraph",		kCMovGraph },
 	{ 0, 0 }
 };
 
@@ -103,6 +105,8 @@ static CObject *createObject(int objectId) {
 		return new CGameVar();
 	case kCMctlCompound:
 		return new CMctlCompound();
+	case kCMovGraph:
+		return new CMovGraph();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: a8d733b2b2c8c110bada0c99ac801ecc1ca0b844
    https://github.com/scummvm/scummvm/commit/a8d733b2b2c8c110bada0c99ac801ecc1ca0b844
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: Split out motion-related classes

Changed paths:
  A engines/fullpipe/motion.cpp
  A engines/fullpipe/motion.h
    engines/fullpipe/module.mk
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 319df8c..a2402e0 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -3,6 +3,7 @@ MODULE := engines/fullpipe
 MODULE_OBJS = \
 	detection.o \
 	fullpipe.o \
+	motion.o \
 	ngiarchive.o \
 	stateloader.o \
 	utils.o
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
new file mode 100644
index 0000000..d3688bd
--- /dev/null
+++ b/engines/fullpipe/motion.cpp
@@ -0,0 +1,79 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "common/file.h"
+#include "common/array.h"
+#include "common/list.h"
+
+#include "fullpipe/utils.h"
+#include "fullpipe/objects.h"
+#include "fullpipe/motion.h"
+
+namespace Fullpipe {
+
+bool CMotionController::load(MfcArchive &file) {
+	// Is originally empty	file.readClass();
+
+
+	return true;
+}
+
+bool CMctlCompound::load(MfcArchive &file) {
+	int count = file.readUint32LE();
+
+	debug(0, "CMctlCompund::count = %d", count);
+
+	for (int i = 0; i < count; i++) {
+	  CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
+
+	  _motionControllers.push_back(*obj);
+	}
+
+	return true;
+}
+
+bool CMctlCompoundArray::load(MfcArchive &file) {
+	int count = file.readUint32LE();
+
+	debug(0, "CMctlCompundArray::count = %d", count);
+
+	return true;
+}
+
+CMovGraph::CMovGraph() {
+  _itemsCount = 0;
+  _items = 0;
+  //_callback1 = CMovGraphCallback1;  // TODO
+  _field_44 = 0;
+  // insertMessageHandler(CMovGraph_messageHandler, getMessageHandlersCount() - 1, 129);
+}
+
+bool CMovGraph::load(MfcArchive &file) {
+  _links.load(file);
+  _nodes.load(file);
+
+  return true;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
new file mode 100644
index 0000000..5bd18f3
--- /dev/null
+++ b/engines/fullpipe/motion.h
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_MOTION_H
+#define FULLPIPE_MOTION_H
+
+namespace Fullpipe {
+
+class CMotionController : public CObject {
+	int _field_4;
+	int _isEnabled;
+
+ public:
+	CMotionController() : _isEnabled(1) {}
+	virtual bool load(MfcArchive &file);
+};
+
+class CMctlCompoundArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class CMctlConnectionPointsArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class CMctlCompoundArrayItem : public CObject {
+  int _motionControllerObj;
+  int _movGraphReactObj;
+  CMctlConnectionPointsArray _connectionPoints;
+  int _field_20;
+  int _field_24;
+  int _field_28;
+
+ public:
+	CMctlCompoundArrayItem() : _movGraphReactObj(0), _motionControllerObj(0) {}
+};
+
+class CMctlCompound : public CMotionController {
+	CMctlCompoundArray _motionControllers;
+
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class Unk2 : public CObject {
+  int _items;
+  int _count;
+
+ public:
+	Unk2() : _items(0), _count(0) {}
+};
+
+class CMovGraphLink : public CObject {
+  int movGraphNode1;
+  int movGraphNode2;
+  int dwordArray1;
+  int field_10;
+  int field_14;
+  int field_18;
+  int field_1C;
+  int dwordArray2;
+  int field_24;
+  int field_28;
+  int field_2C;
+  int field_30;
+  int flags;
+  int field_38;
+  int field_3C;
+  double distance;
+  double angle;
+  int movGraphReact;
+  int name;
+};
+
+class CMovGraph : public CMotionController {
+  CObList _nodes;
+  CObList _links;
+  int _field_44;
+  int _items;
+  int _itemsCount;
+  int (*_callback1)(int, int, int);
+  Unk2 _unk2;
+
+ public:
+	CMovGraph();
+	virtual bool load(MfcArchive &file);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_MOTION_H */
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 50f1bf0..1d41670 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -176,66 +176,6 @@ class CInputController {
 	CInputController();
 };
 
-class CMotionController : public CObject {
-	int _field_4;
-	int _isEnabled;
-
- public:
-	CMotionController() : _isEnabled(1) {}
-	virtual bool load(MfcArchive &file);
-};
-
-class CMctlCompoundArray : public Common::Array<CObject>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-class CMctlConnectionPointsArray : public Common::Array<CObject>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-class CMctlCompoundArrayItem : public CObject {
-  int _motionControllerObj;
-  int _movGraphReactObj;
-  CMctlConnectionPointsArray _connectionPoints;
-  int _field_20;
-  int _field_24;
-  int _field_28;
-
- public:
-	CMctlCompoundArrayItem() : _movGraphReactObj(0), _motionControllerObj(0) {}
-};
-
-class CMctlCompound : public CMotionController {
-	CMctlCompoundArray _motionControllers;
-
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-class Unk2 : public CObject {
-  int _items;
-  int _count;
-
- public:
-	Unk2() : _items(0), _count(0) {}
-};
-
-class CMovGraph : public CMotionController {
-  CObList _nodes;
-  CObList _links;
-  int _field_44;
-  int _items;
-  int _itemsCount;
-  int (*_callback1)(int, int, int);
-  Unk2 _unk2;
-
- public:
-	CMovGraph();
-	virtual bool load(MfcArchive &file);
-};
-
 class ShadowsItemArray : public Common::Array<CObject>, public CObject {
  public:
 	virtual bool load(MfcArchive &file);
@@ -275,6 +215,8 @@ class Scene {
 	int libHandle;
 };
 
+class CMotionController;
+
 class Sc2 : public CObject {
 	int16 _sceneId;
 	int16 _field_2;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 5c68742..75669df 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -504,49 +504,4 @@ bool Sc2::load(MfcArchive &file) {
 	return true;
 }
 
-
-bool CMotionController::load(MfcArchive &file) {
-	// Is originally empty	file.readClass();
-
-
-	return true;
-}
-
-bool CMctlCompound::load(MfcArchive &file) {
-	int count = file.readUint32LE();
-
-	debug(0, "CMctlCompund::count = %d", count);
-
-	for (int i = 0; i < count; i++) {
-	  CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
-
-	  _motionControllers.push_back(*obj);
-	}
-
-	return true;
-}
-
-bool CMctlCompoundArray::load(MfcArchive &file) {
-	int count = file.readUint32LE();
-
-	debug(0, "CMctlCompundArray::count = %d", count);
-
-	return true;
-}
-
-CMovGraph::CMovGraph() {
-  _itemsCount = 0;
-  _items = 0;
-  //_callback1 = CMovGraphCallback1;  // TODO
-  _field_44 = 0;
-  // insertMessageHandler(CMovGraph_messageHandler, getMessageHandlersCount() - 1, 129);
-}
-
-bool CMovGraph::load(MfcArchive &file) {
-  _links.load(file);
-  _nodes.load(file);
-
-  return true;
-}
-
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 34cf3c5..ba014a5 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -26,6 +26,7 @@
 
 #include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
+#include "fullpipe/motion.h"
 
 namespace Fullpipe {
 


Commit: 5ea45699a889cdc15f33f449a4d8c20dd231b8e9
    https://github.com/scummvm/scummvm/commit/5ea45699a889cdc15f33f449a4d8c20dd231b8e9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: Reading CMovGraphNode

Changed paths:
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index d3688bd..815b0c3 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -76,4 +76,44 @@ bool CMovGraph::load(MfcArchive &file) {
   return true;
 }
 
+CMovGraphLink::CMovGraphLink() {
+  _distance = 0;
+  _angle = 0;
+  _flags = 0x10000000;
+  _movGraphNode2 = 0;
+  _movGraphNode1 = 0;
+  _field_3C = 0;
+  _field_38 = 0;
+  _movGraphReact = 0;
+}
+
+bool CMovGraphLink::load(MfcArchive &file) {
+  _dwordArray1.load(file);
+  _dwordArray2.load(file);
+
+  _flags = file.readUint32LE();
+
+  _movGraphNode1 = (CMovGraphNode *)file.readClass();
+  _movGraphNode2 = (CMovGraphNode *)file.readClass();
+
+  _distance = file.readDouble();
+  _angle = file.readDouble();
+
+  debug(0, "distance: %g, angle: %g", _distance, _angle);
+
+  _movGraphReact = (CMovGraphReact *)file.readClass();
+  _name = file.readPascalString();
+
+  return true;
+}
+
+bool CMovGraphNode::load(MfcArchive &file) {
+  _field_14 = file.readUint32LE();
+  _x = file.readUint32LE();
+  _y = file.readUint32LE();
+  _distance = file.readUint32LE();
+
+  return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index 5bd18f3..508a7f7 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -71,26 +71,39 @@ class Unk2 : public CObject {
 	Unk2() : _items(0), _count(0) {}
 };
 
+class CMovGraphNode : public CObject {
+  int _x;
+  int _y;
+  int _distance;
+  int16 _field_10;
+  int16 _field_12;
+  int _field_14;
+
+  public:
+	CMovGraphNode() : _x(0), _y(0), _distance(0), _field_10(0), _field_14(0) {}
+	virtual bool load(MfcArchive &file);
+};
+
+class CMovGraphReact : public CObject {
+    // Empty
+};
+
 class CMovGraphLink : public CObject {
-  int movGraphNode1;
-  int movGraphNode2;
-  int dwordArray1;
-  int field_10;
-  int field_14;
-  int field_18;
-  int field_1C;
-  int dwordArray2;
-  int field_24;
-  int field_28;
-  int field_2C;
-  int field_30;
-  int flags;
-  int field_38;
-  int field_3C;
-  double distance;
-  double angle;
-  int movGraphReact;
-  int name;
+  CMovGraphNode *_movGraphNode1;
+  CMovGraphNode *_movGraphNode2;
+  CDWordArray _dwordArray1;
+  CDWordArray _dwordArray2;
+  int _flags;
+  int _field_38;
+  int _field_3C;
+  double _distance;
+  double _angle;
+  CMovGraphReact *_movGraphReact;
+  char *_name;
+
+  public:
+	CMovGraphLink();
+	virtual bool load(MfcArchive &file);
 };
 
 class CMovGraph : public CMotionController {
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 1d41670..e385acf 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -59,6 +59,11 @@ class CObArray : public Common::Array<CObject>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
+class CDWordArray : public Common::Array<int32>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
 struct CNode {
 	CNode *pNext;
 	CNode *pPrev;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 75669df..d5a9fe2 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -504,4 +504,20 @@ bool Sc2::load(MfcArchive &file) {
 	return true;
 }
 
+bool CDWordArray::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	debug(0, "CDWordArray::count: %d", count);
+
+	resize(count);
+
+	for (int i = 0; i < count; i++) {
+		int32 t = file.readUint32LE();
+
+		push_back(t);
+	}
+
+	return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index ba014a5..4add1ba 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -56,6 +56,23 @@ int MfcArchive::readCount() {
 	return count;
 }
 
+double MfcArchive::readDouble() {
+  // FIXME: This is utterly cruel and unportable
+
+  union {
+    struct {
+      int32 a;
+      int32 b;
+    } i;
+    double d;
+  } tmp;
+
+  tmp.i.a = readUint32LE();
+  tmp.i.b = readUint32LE();
+    
+  return tmp.d;
+}
+
 enum {
 	kNullObject,
 	kCInteraction,
@@ -64,7 +81,9 @@ enum {
 	kCObjstateCommand,
 	kCGameVar,
 	kCMctlCompound,
-	kCMovGraph
+	kCMovGraph,
+	kCMovGraphLink,
+	kCMovGraphNode
 };
 
 const struct {
@@ -78,6 +97,8 @@ const struct {
 	{ "CGameVar",		kCGameVar },
 	{ "CMctlCompound",	kCMctlCompound },
 	{ "CMovGraph",		kCMovGraph },
+	{ "CMovGraphLink",	kCMovGraphLink },
+	{ "CMovGraphNode",	kCMovGraphNode },
 	{ 0, 0 }
 };
 
@@ -108,6 +129,10 @@ static CObject *createObject(int objectId) {
 		return new CMctlCompound();
 	case kCMovGraph:
 		return new CMovGraph();
+	case kCMovGraphLink:
+		return new CMovGraphLink();
+	case kCMovGraphNode:
+		return new CMovGraphNode();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 7b117ef..c46fe38 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -45,6 +45,7 @@ class MfcArchive : public Common::File {
 
 	char *readPascalString(bool twoByte = false);
 	int readCount();
+	double readDouble();
 	CObject *parseClass(bool *isCopyReturned);
 	CObject *readClass();
 


Commit: 630d5526ee9618ac1f84021b2306477e81e343d2
    https://github.com/scummvm/scummvm/commit/630d5526ee9618ac1f84021b2306477e81e343d2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: Implemented CReactParallel loader

Changed paths:
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 815b0c3..a25d475 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -116,4 +116,53 @@ bool CMovGraphNode::load(MfcArchive &file) {
   return true;
 }
 
+CReactParallel::CReactParallel() {
+  _x1 = 0;
+  _x2 = 0;
+  _dy = 0;
+  _dx = 0;
+  _points = 0;
+  _y1 = 0;
+  _y2 = 0;
+}
+
+bool CReactParallel::load(MfcArchive &file) {
+  _x1 = file.readUint32LE();
+  _y1 = file.readUint32LE();
+  _x2 = file.readUint32LE();
+  _y2 = file.readUint32LE();
+  _dx = file.readUint32LE();
+  _dy = file.readUint32LE();
+
+  createRegion();
+
+  return true;
+}
+
+void CReactParallel::createRegion() {
+  _points = (Common::Point **)malloc(sizeof(Common::Point *) * 4);
+
+  for (int i = 0; i < 4; i++)
+    _points[i] = new Common::Point;
+
+  double at = atan2(_x1 - _x2, _y1 - _y2) + 1.570796;
+  double sn = sin(at);
+  double cs = cos(at);
+
+  _points[0]->x = (int16)(_x1 - _dx * cs);
+  _points[0]->y = (int16)(_y1 - _dx * sn);
+
+  _points[1]->x = (int16)(_x2 - _dx * cs);
+  _points[1]->y = (int16)(_y2 - _dx * sn);
+  
+  _points[2]->x = (int16)(_x1 + _dy * cs);
+  _points[2]->y = (int16)(_y2 + _dy * sn);
+
+  _points[3]->x = (int16)(_x1 + _dy * cs);
+  _points[3]->y = (int16)(_y1 + _dy * sn);
+
+  // GdiObject::Attach(_rgn, CreatePolygonRgn(_points, 4, 2);
+}
+
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index 508a7f7..f5e8632 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -88,22 +88,38 @@ class CMovGraphReact : public CObject {
     // Empty
 };
 
+class CReactParallel : public CMovGraphReact {
+    //CRgn _rgn;
+    int _x1;
+    int _y1;
+    int _x2;
+    int _y2;
+    int _dx;
+    int _dy;
+    Common::Point **_points;
+
+  public:
+    CReactParallel();
+    virtual bool load(MfcArchive &file);
+    void createRegion();
+};
+
 class CMovGraphLink : public CObject {
-  CMovGraphNode *_movGraphNode1;
-  CMovGraphNode *_movGraphNode2;
-  CDWordArray _dwordArray1;
-  CDWordArray _dwordArray2;
-  int _flags;
-  int _field_38;
-  int _field_3C;
-  double _distance;
-  double _angle;
-  CMovGraphReact *_movGraphReact;
-  char *_name;
+    CMovGraphNode *_movGraphNode1;
+    CMovGraphNode *_movGraphNode2;
+    CDWordArray _dwordArray1;
+    CDWordArray _dwordArray2;
+    int _flags;
+    int _field_38;
+    int _field_3C;
+    double _distance;
+    double _angle;
+    CMovGraphReact *_movGraphReact;
+    char *_name;
 
   public:
-	CMovGraphLink();
-	virtual bool load(MfcArchive &file);
+    CMovGraphLink();
+    virtual bool load(MfcArchive &file);
 };
 
 class CMovGraph : public CMotionController {
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 4add1ba..df6c869 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -83,7 +83,8 @@ enum {
 	kCMctlCompound,
 	kCMovGraph,
 	kCMovGraphLink,
-	kCMovGraphNode
+	kCMovGraphNode,
+	kCReactParallel
 };
 
 const struct {
@@ -99,6 +100,7 @@ const struct {
 	{ "CMovGraph",		kCMovGraph },
 	{ "CMovGraphLink",	kCMovGraphLink },
 	{ "CMovGraphNode",	kCMovGraphNode },
+	{ "CReactParallel", kCReactParallel },
 	{ 0, 0 }
 };
 
@@ -133,6 +135,8 @@ static CObject *createObject(int objectId) {
 		return new CMovGraphLink();
 	case kCMovGraphNode:
 		return new CMovGraphNode();
+	case kCReactParallel:
+		return new CReactParallel();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: 195d52e625b1d24ea0cbda3bb8d65043d1b5eea5
    https://github.com/scummvm/scummvm/commit/195d52e625b1d24ea0cbda3bb8d65043d1b5eea5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:12-07:00

Commit Message:
FULLPIPE: Implement loading CReactPolygonal. That completes .sc2 loading

Changed paths:
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index a25d475..64fbd08 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -164,5 +164,40 @@ void CReactParallel::createRegion() {
   // GdiObject::Attach(_rgn, CreatePolygonRgn(_points, 4, 2);
 }
 
+CReactPolygonal::CReactPolygonal() {
+  _field_C = 0;
+  _points = 0;
+  _pointCount = 0;
+  _field_10 = 0;
+}
+
+bool CReactPolygonal::load(MfcArchive &file) {
+  _field_C = file.readUint32LE();
+  _field_10 = file.readUint32LE();
+  _pointCount = file.readUint32LE();
+
+  if (_pointCount > 0) {
+	  _points = (Common::Point **)malloc(sizeof(Common::Point *) * _pointCount);
+
+	  for (int i = 0; i < _pointCount; i++) {
+		_points[i] = new Common::Point;
+
+		_points[i]->x = file.readUint32LE();
+		_points[i]->y = file.readUint32LE();
+	  }
+
+  }
+
+  createRegion();
+
+  return true;
+}
+
+void CReactPolygonal::createRegion() {
+  if (_points) {
+
+	// GdiObject::Attach(_rgn, CreatePolygonRgn(_points, _pointCount, 2);
+  }
+}
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index f5e8632..bbb37f4 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -104,6 +104,19 @@ class CReactParallel : public CMovGraphReact {
     void createRegion();
 };
 
+class CReactPolygonal : public CMovGraphReact {
+    //CRgn _rgn;
+    int _field_C;
+    int _field_10;
+    int _pointCount;
+    Common::Point **_points;
+
+  public:
+    CReactPolygonal();
+    virtual bool load(MfcArchive &file);
+    void createRegion();
+};
+
 class CMovGraphLink : public CObject {
     CMovGraphNode *_movGraphNode1;
     CMovGraphNode *_movGraphNode2;
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index df6c869..6a09174 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -84,7 +84,8 @@ enum {
 	kCMovGraph,
 	kCMovGraphLink,
 	kCMovGraphNode,
-	kCReactParallel
+	kCReactParallel,
+	kCReactPolygonal
 };
 
 const struct {
@@ -101,6 +102,7 @@ const struct {
 	{ "CMovGraphLink",	kCMovGraphLink },
 	{ "CMovGraphNode",	kCMovGraphNode },
 	{ "CReactParallel", kCReactParallel },
+	{ "CReactPolygonal", kCReactPolygonal },
 	{ 0, 0 }
 };
 
@@ -137,6 +139,8 @@ static CObject *createObject(int objectId) {
 		return new CMovGraphNode();
 	case kCReactParallel:
 		return new CReactParallel();
+	case kCReactPolygonal:
+		return new CReactPolygonal();
 	default:
 		error("Unknown objectId: %d", objectId);
 	}


Commit: fcf0d240d0266fa89073e12d2a15a045b6bdfe65
    https://github.com/scummvm/scummvm/commit/fcf0d240d0266fa89073e12d2a15a045b6bdfe65
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:13-07:00

Commit Message:
FULLPIPE: Finish reading CMctlCompund

Changed paths:
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 64fbd08..f10388a 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -42,11 +42,26 @@ bool CMotionController::load(MfcArchive &file) {
 bool CMctlCompound::load(MfcArchive &file) {
 	int count = file.readUint32LE();
 
-	debug(0, "CMctlCompund::count = %d", count);
+	debug(0, "CMctlCompound::count = %d", count);
 
 	for (int i = 0; i < count; i++) {
+	  debug(0, "CompoundArray[%d]", i);
 	  CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
 
+	  int count1 = file.readUint32LE();
+
+	  for (int j = 0; j < count1; j++) {
+		debug(0, "ConnectionPoint[%d]", j);
+		CMctlConnectionPoint *obj1 = (CMctlConnectionPoint *)file.readClass();
+
+		obj->_connectionPoints.push_back(*obj1);
+	  }
+
+	  obj->_field_20 = file.readUint32LE();
+	  obj->_field_24 = file.readUint32LE();
+
+	  obj->_movGraphReactObj = (CMovGraphReact *)file.readClass();
+
 	  _motionControllers.push_back(*obj);
 	}
 
@@ -56,7 +71,7 @@ bool CMctlCompound::load(MfcArchive &file) {
 bool CMctlCompoundArray::load(MfcArchive &file) {
 	int count = file.readUint32LE();
 
-	debug(0, "CMctlCompundArray::count = %d", count);
+	debug(0, "CMctlCompoundArray::count = %d", count);
 
 	return true;
 }
@@ -93,7 +108,9 @@ bool CMovGraphLink::load(MfcArchive &file) {
 
   _flags = file.readUint32LE();
 
+  debug(0, "GraphNode1");
   _movGraphNode1 = (CMovGraphNode *)file.readClass();
+  debug(0, "GraphNode2");
   _movGraphNode2 = (CMovGraphNode *)file.readClass();
 
   _distance = file.readDouble();
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index bbb37f4..fb7b454 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -44,18 +44,6 @@ class CMctlConnectionPointsArray : public Common::Array<CObject>, public CObject
 	virtual bool load(MfcArchive &file);
 };
 
-class CMctlCompoundArrayItem : public CObject {
-  int _motionControllerObj;
-  int _movGraphReactObj;
-  CMctlConnectionPointsArray _connectionPoints;
-  int _field_20;
-  int _field_24;
-  int _field_28;
-
- public:
-	CMctlCompoundArrayItem() : _movGraphReactObj(0), _motionControllerObj(0) {}
-};
-
 class CMctlCompound : public CMotionController {
 	CMctlCompoundArray _motionControllers;
 
@@ -88,6 +76,20 @@ class CMovGraphReact : public CObject {
     // Empty
 };
 
+class CMctlCompoundArrayItem : public CMotionController {
+	friend class CMctlCompound;
+
+  protected:
+	CMovGraphReact *_movGraphReactObj;
+	CMctlConnectionPointsArray _connectionPoints;
+	int _field_20;
+	int _field_24;
+	int _field_28;
+
+ public:
+  CMctlCompoundArrayItem() : _movGraphReactObj(0) {}
+};
+
 class CReactParallel : public CMovGraphReact {
     //CRgn _rgn;
     int _x1;
@@ -149,6 +151,17 @@ class CMovGraph : public CMotionController {
 	virtual bool load(MfcArchive &file);
 };
 
+class CMctlConnectionPoint : public CObject {
+	int _connectionX;
+	int _connectionY;
+	int _field_C;
+	int _field_10;
+	int16 _field_14;
+	int16 _field_16;
+	int _messageQueueObj;
+	int _motionControllerObj;
+};
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_MOTION_H */
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index e385acf..34d117b 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -220,6 +220,37 @@ class Scene {
 	int libHandle;
 };
 
+struct PicAniInfo {
+  int32 type;
+  int16 objectId;
+  int16 field_6;
+  int32 field_8;
+  int16 field_C;
+  int16 field_E;
+  int32 ox;
+  int32 oy;
+  int32 priority;
+  int16 staticsId;
+  int16 movementId;
+  int16 dynamicPhaseIndex;
+  int16 flags;
+  int32 field_24;
+  int32 someDynamicPhaseIndex;
+
+  bool load(MfcArchive &file);
+};
+
+struct EntranceInfo
+{
+  int32 sceneId;
+  int32 field_4;
+  int32 messageQueueId;
+  byte gap_C[292]; // FIXME
+  int32 field_130;
+
+  bool load(MfcArchive &file);
+};
+
 class CMotionController;
 
 class Sc2 : public CObject {
@@ -227,14 +258,14 @@ class Sc2 : public CObject {
 	int16 _field_2;
 	Scene *_scene;
 	CMotionController *_motionController;
-	int _data1;
+	int32 *_data1; // FIXME, could be a struct
 	int _count1;
-	int _defPicAniInfos;
+	PicAniInfo **_defPicAniInfos;
 	int _defPicAniInfosCount;
-	int _picAniInfos;
+	PicAniInfo **_picAniInfos;
 	int _picAniInfosCount;
 	int _isLoaded;
-	int _entranceData;
+	EntranceInfo **_entranceData;
 	int _entranceDataCount;
 
  public:
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index d5a9fe2..cda64c4 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -117,6 +117,8 @@ bool CGameLoader::load(MfcArchive &file) {
 		debug(0, "sc: %d", it->_sceneId);
 
 		_sc2array[i].loadFile((const char *)tmp);
+
+		debug(0, "sc: %s", tmp);
 	}
 
 	_preloadItems.load(file);
@@ -258,7 +260,10 @@ bool CInteractionController::load(MfcArchive &file) {
 bool CObList::load(MfcArchive &file) {
 	int count = file.readCount();
 
+	debug(0, "CObList::count: %d:", count);
+
 	for (int i = 0; i < count; i++) {
+		debug(0, "CObList::[%d]", i);
 		CObject *t = file.readClass();
 
 		push_back(*t);
@@ -483,7 +488,7 @@ bool CGameVar::load(MfcArchive &file) {
 Sc2::Sc2() {
 	_sceneId = 0;
 	_field_2 = 0;
-	//_scene = 0;
+	_scene = 0;
 	_motionController = 0;
 	_data1 = 0;
 	_count1 = 0;
@@ -501,6 +506,51 @@ bool Sc2::load(MfcArchive &file) {
 
 	_motionController = (CMotionController *)file.readClass();
 
+	_count1 = file.readUint32LE();
+	debug(0, "count1: %d", _count1);
+	if (_count1 > 0) {
+	  _data1 = (int32 *)malloc(_count1 * sizeof(int32));
+	  
+	  for (int i = 0; i < _count1; i++) {
+		_data1[i] = file.readUint32LE();
+	  }
+	} else {
+	  _data1 = 0;
+	}
+
+	_defPicAniInfosCount = file.readUint32LE();
+	debug(0, "defPicAniInfos: %d", _defPicAniInfosCount);
+	if (_defPicAniInfosCount > 0) {
+	  _defPicAniInfos = (PicAniInfo **)malloc(_defPicAniInfosCount * sizeof(PicAniInfo *));
+
+	  for (int i = 0; i < _defPicAniInfosCount; i++) {
+		_defPicAniInfos[i] = new PicAniInfo();
+
+		_defPicAniInfos[i]->load(file);
+	  }
+	} else {
+	  _defPicAniInfos = 0;
+	}
+
+	_picAniInfos = 0;
+	_picAniInfosCount = 0;
+
+	_entranceDataCount = file.readUint32LE();
+	debug(0, "_entranceData: %d", _entranceDataCount);
+
+	if (_entranceDataCount > 0) {
+	  _entranceData = (EntranceInfo **)malloc(_defPicAniInfosCount * sizeof(EntranceInfo *));
+
+	  for (int i = 0; i < _entranceDataCount; i++) {
+		_entranceData[i] = new EntranceInfo();
+		_entranceData[i]->load(file);
+	  }
+	} else {
+	  _entranceData = 0;
+	}
+
+	debug(0, "pos: %d, 0x%x: %d", file.size(), file.pos(), file.size() - file.pos());
+
 	return true;
 }
 
@@ -520,4 +570,34 @@ bool CDWordArray::load(MfcArchive &file) {
 	return true;
 }
 
+bool PicAniInfo::load(MfcArchive &file) {
+  type = file.readUint32LE();
+  objectId = file.readUint16LE();
+  field_6 = file.readUint16LE();
+  field_8 = file.readUint32LE();
+  field_C = file.readUint16LE();
+  field_E = file.readUint16LE();
+  ox = file.readUint32LE();
+  oy = file.readUint32LE();
+  priority = file.readUint32LE();
+  staticsId = file.readUint16LE();
+  movementId = file.readUint16LE();
+  dynamicPhaseIndex = file.readUint16LE();
+  flags = file.readUint16LE();
+  field_24 = file.readUint32LE();
+  someDynamicPhaseIndex = file.readUint32LE();
+
+  return true;
+}
+
+bool EntranceInfo::load(MfcArchive &file) {
+  sceneId = file.readUint32LE();
+  field_4 = file.readUint32LE();
+  messageQueueId = file.readUint32LE();
+  file.read(gap_C, 292); // FIXME, Ugh
+  field_130 = file.readUint32LE();
+
+  return true;
+}
+
 } // End of namespace Fullpipe


Commit: 2e6bad888e02952e980dfc33978673bda0349030
    https://github.com/scummvm/scummvm/commit/2e6bad888e02952e980dfc33978673bda0349030
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:13-07:00

Commit Message:
FULLPIPE: Put debug output at deeper levels

Changed paths:
    engines/fullpipe/motion.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index f10388a..ec6a8bd 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -42,16 +42,17 @@ bool CMotionController::load(MfcArchive &file) {
 bool CMctlCompound::load(MfcArchive &file) {
 	int count = file.readUint32LE();
 
-	debug(0, "CMctlCompound::count = %d", count);
+	debug(6, "CMctlCompound::count = %d", count);
 
 	for (int i = 0; i < count; i++) {
-	  debug(0, "CompoundArray[%d]", i);
+	  debug(6, "CompoundArray[%d]", i);
 	  CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
 
 	  int count1 = file.readUint32LE();
 
+	  debug(6, "ConnectionPoint::count: %d", count1);
 	  for (int j = 0; j < count1; j++) {
-		debug(0, "ConnectionPoint[%d]", j);
+		debug(6, "ConnectionPoint[%d]", j);
 		CMctlConnectionPoint *obj1 = (CMctlConnectionPoint *)file.readClass();
 
 		obj->_connectionPoints.push_back(*obj1);
@@ -60,6 +61,7 @@ bool CMctlCompound::load(MfcArchive &file) {
 	  obj->_field_20 = file.readUint32LE();
 	  obj->_field_24 = file.readUint32LE();
 
+	  debug(6, "graphReact");
 	  obj->_movGraphReactObj = (CMovGraphReact *)file.readClass();
 
 	  _motionControllers.push_back(*obj);
@@ -73,6 +75,8 @@ bool CMctlCompoundArray::load(MfcArchive &file) {
 
 	debug(0, "CMctlCompoundArray::count = %d", count);
 
+	assert(0);
+
 	return true;
 }
 
@@ -108,15 +112,15 @@ bool CMovGraphLink::load(MfcArchive &file) {
 
   _flags = file.readUint32LE();
 
-  debug(0, "GraphNode1");
+  debug(8, "GraphNode1");
   _movGraphNode1 = (CMovGraphNode *)file.readClass();
-  debug(0, "GraphNode2");
+  debug(8, "GraphNode2");
   _movGraphNode2 = (CMovGraphNode *)file.readClass();
 
   _distance = file.readDouble();
   _angle = file.readDouble();
 
-  debug(0, "distance: %g, angle: %g", _distance, _angle);
+  debug(8, "distance: %g, angle: %g", _distance, _angle);
 
   _movGraphReact = (CMovGraphReact *)file.readClass();
   _name = file.readPascalString();
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index cda64c4..7501f2b 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -114,11 +114,9 @@ bool CGameLoader::load(MfcArchive &file) {
 
 		snprintf(tmp, 11, "%04d.sc2", it->_sceneId);
 
-		debug(0, "sc: %d", it->_sceneId);
+		debug(2, "sc: %s", tmp);
 
 		_sc2array[i].loadFile((const char *)tmp);
-
-		debug(0, "sc: %s", tmp);
 	}
 
 	_preloadItems.load(file);
@@ -260,10 +258,10 @@ bool CInteractionController::load(MfcArchive &file) {
 bool CObList::load(MfcArchive &file) {
 	int count = file.readCount();
 
-	debug(0, "CObList::count: %d:", count);
+	debug(9, "CObList::count: %d:", count);
 
 	for (int i = 0; i < count; i++) {
-		debug(0, "CObList::[%d]", i);
+		debug(9, "CObList::[%d]", i);
 		CObject *t = file.readClass();
 
 		push_back(*t);
@@ -507,7 +505,7 @@ bool Sc2::load(MfcArchive &file) {
 	_motionController = (CMotionController *)file.readClass();
 
 	_count1 = file.readUint32LE();
-	debug(0, "count1: %d", _count1);
+	debug(4, "count1: %d", _count1);
 	if (_count1 > 0) {
 	  _data1 = (int32 *)malloc(_count1 * sizeof(int32));
 	  
@@ -519,7 +517,7 @@ bool Sc2::load(MfcArchive &file) {
 	}
 
 	_defPicAniInfosCount = file.readUint32LE();
-	debug(0, "defPicAniInfos: %d", _defPicAniInfosCount);
+	debug(4, "defPicAniInfos: %d", _defPicAniInfosCount);
 	if (_defPicAniInfosCount > 0) {
 	  _defPicAniInfos = (PicAniInfo **)malloc(_defPicAniInfosCount * sizeof(PicAniInfo *));
 
@@ -536,7 +534,7 @@ bool Sc2::load(MfcArchive &file) {
 	_picAniInfosCount = 0;
 
 	_entranceDataCount = file.readUint32LE();
-	debug(0, "_entranceData: %d", _entranceDataCount);
+	debug(4, "_entranceData: %d", _entranceDataCount);
 
 	if (_entranceDataCount > 0) {
 	  _entranceData = (EntranceInfo **)malloc(_defPicAniInfosCount * sizeof(EntranceInfo *));
@@ -549,7 +547,7 @@ bool Sc2::load(MfcArchive &file) {
 	  _entranceData = 0;
 	}
 
-	debug(0, "pos: %d, 0x%x: %d", file.size(), file.pos(), file.size() - file.pos());
+	debug(4, "pos: %d, 0x%x: %d", file.size(), file.pos(), file.size() - file.pos());
 
 	return true;
 }
@@ -557,7 +555,7 @@ bool Sc2::load(MfcArchive &file) {
 bool CDWordArray::load(MfcArchive &file) {
 	int count = file.readCount();
 
-	debug(0, "CDWordArray::count: %d", count);
+	debug(9, "CDWordArray::count: %d", count);
 
 	resize(count);
 


Commit: 249c4bd118527b33e9bc9ef0ed3eee3bff88a8b7
    https://github.com/scummvm/scummvm/commit/249c4bd118527b33e9bc9ef0ed3eee3bff88a8b7
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:13-07:00

Commit Message:
FULLPIPE: implement initObjectStates()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/objectnames.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index f4d502d..c5099f5 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -29,12 +29,16 @@
 
 #include "fullpipe/fullpipe.h"
 #include "fullpipe/ngiarchive.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/utils.h"
+#include "fullpipe/objects.h"
 
 namespace Fullpipe {
 
 int g_gameProjectVersion = 0;
 int g_gameProjectValue = 0;
 int g_scrollSpeed = 0;
+int g_currSoundListCount = 0;
 
 FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
 	// Setup mixer
@@ -88,4 +92,151 @@ void FullpipeEngine::updateEvents() {
 	}
 }
 
+void FullpipeEngine::initObjectStates() {
+  setLevelStates();
+
+  setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg));
+  setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_NotCrackedEggs));
+  setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken));
+  setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First));
+  setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No));
+  setObjectState(sO_Jar_4, getObjectEnumState(sO_Jar_4, sO_OnTheSpring));
+  setObjectState(sO_GulpedEggs, getObjectEnumState(sO_GulpedEgg, sO_NotPresent));
+
+  setSwallowedEggsState();
+
+  setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses));
+  setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking));
+  setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
+  setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle));
+  setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot));
+  setObjectState(sO_Fly_12, 0);
+  setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable));
+  setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7));
+  setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping));
+  setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty));
+  setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
+  setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
+  setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe));
+  setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
+  setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
+  setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging));
+  setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No));
+  setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted));
+  setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight));
+  setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14));
+  setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent));
+  setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe));
+  setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree));
+  setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom));
+  setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree));
+  setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin));
+  setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe));
+  setObjectState(sO_Fly_17, 1);
+  setObjectState(sO_DudeSwinged, 0);
+  setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging));
+  setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present));
+  setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together));
+  setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen));
+  setObjectState(sO_Grandpa, getObjectEnumState(sO_Grandpa, sO_InSock));
+  setObjectState(sO_CoinSlot_22, getObjectEnumState(sO_CoinSlot_22, sO_Empty));
+  setObjectState(sO_UpperHatch_23, getObjectEnumState(sO_UpperHatch_23, sO_Closed));
+  setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed));
+  setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken));
+  setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool));
+  setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe));
+  setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe));
+  setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed));
+  setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging));
+  setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe));
+  setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened));
+  setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed));
+  setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed));
+  setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed));
+  setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened));
+  setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull));
+  setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs));
+  setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering));
+  setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop));
+  setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe));
+  setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe));
+  setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel));
+  setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe));
+  setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown));
+  setObjectState(sO_Fireman, getObjectEnumState(sO_Fireman, sO_WithHose));
+  setObjectState(sO_Cube, getObjectEnumState(sO_Cube, sO_In_33));
+  setObjectState(sO_MommyOfHandle_32, getObjectEnumState(sO_MommyOfHandle_32, sO_WithoutHandle));
+  setObjectState(sO_Pedestal_33, getObjectEnumState(sO_Pedestal_33, sO_IsFree));
+  setObjectState(sO_Valve_34, getObjectEnumState(sO_Valve_34, sO_WithNothing));
+  setObjectState(sO_Stool_34, getObjectEnumState(sO_Stool_34, sO_WithoutDrawer));
+  setObjectState(sO_Plank_34, getObjectEnumState(sO_Plank_34, sO_Passive));
+  setObjectState(sO_Hatch_34, getObjectEnumState(sO_Hatch_34, sO_Closed));
+  setObjectState(sO_Valve_35, getObjectEnumState(sO_Valve_35, sO_TurnedOff));
+  setObjectState(sO_Carpet_35, getObjectEnumState(sO_Carpet_35, sO_CannotTake));
+  setObjectState(sO_CoinSlot_35, getObjectEnumState(sO_CoinSlot_35, sO_WithCoin));
+  setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork));
+  setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet));
+  setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On));
+  setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On));
+  setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On));
+  setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable));
+  setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer));
+}
+
+void FullpipeEngine::setLevelStates() {
+  CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+
+  if (v) {
+    v->setSubVarAsInt(sO_Level0, 2833);
+    v->setSubVarAsInt(sO_Level1, 2754);
+    v->setSubVarAsInt(sO_Level2, 2757);
+    v->setSubVarAsInt(sO_Level3, 2760);
+    v->setSubVarAsInt(sO_Level4, 2763);
+    v->setSubVarAsInt(sO_Level5, 2766);
+    v->setSubVarAsInt(sO_Level6, 2769);
+    v->setSubVarAsInt(sO_Level7, 2772);
+    v->setSubVarAsInt(sO_Level8, 2775);
+    v->setSubVarAsInt(sO_Level9, 2778);
+  }
+}
+
+void FullpipeEngine::setSwallowedEggsState() {
+  CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+
+  _swallowedEgg1 = v->getSubVarByName(sO_Egg1);
+  _swallowedEgg2 = v->getSubVarByName(sO_Egg2);
+  _swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+
+  _swallowedEgg1->_value.intValue = 0;
+  _swallowedEgg2->_value.intValue = 0;
+  _swallowedEgg3->_value.intValue = 0;
+}
+
+int FullpipeEngine::getObjectEnumState(const char *name, const char *state) {
+  CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
+
+  if (!var) {
+    var = _gameLoader->_gameVar->addSubVarAsInt("OBJSTATES", 0);
+  }
+
+  var = var->getSubVarByName(name);
+  if (var) {
+    var = var->getSubVarByName("ENUMSTATES");
+    if (var)
+      return var->getSubVarAsInt(state);
+  }
+
+  return 0;
+}
+
+void FullpipeEngine::setObjectState(const char *name, int state) {
+  CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
+
+  if (!var) {
+    var = _gameLoader->_gameVar->addSubVarAsInt("OBJSTATES", 0);
+  }
+
+  var->setSubVarAsInt(name, state);
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index a6a58ff..92c0052 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -44,11 +44,12 @@ enum FullpipeGameFeatures {
 };
 
 class CGameLoader;
+class CGameVar;
 
 extern int g_gameProjectVersion;
 extern int g_gameProjectValue;
 extern int g_scrollSpeed;
-
+extern int g_currSoundListCount;
 
 class FullpipeEngine : public ::Engine {
 protected:
@@ -71,15 +72,26 @@ public:
 	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
-    void updateEvents();
+	void updateEvents();
 
-	CGameLoader *g_gameLoader;
+	CGameLoader *_gameLoader;
 	bool loadGam(const char *fname);
 
 	int _gameProjectVersion;
 	int _gameProjectValue;
 	int _scrollSpeed;
 
+	void initObjectStates();
+	void setLevelStates();
+	void setSwallowedEggsState();
+
+	CGameVar *_swallowedEgg1;
+	CGameVar *_swallowedEgg2;
+	CGameVar *_swallowedEgg3;
+
+	void setObjectState(const char *name, int state);
+	int getObjectEnumState(const char *name, const char *state);
+
 public:
 
 	bool _isSaveAllowed;
diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
index 75c382b..39c4e5d 100644
--- a/engines/fullpipe/objectnames.h
+++ b/engines/fullpipe/objectnames.h
@@ -23,6 +23,7 @@
 // This file is used in order to avoid usage of constants in Russian accross the code
 
 #define sO_Grandma "\xc1\xe0\xe1\xf3\xeb\xff"	// "Бабуля"
+#define sO_Jar_4 "\xc1\xe0\xed\xea\xe0_4"	// "Банка_4"
 #define sO_Pool "\xc1\xe0\xf1\xf1\xe5\xe9\xed"	// "Бассейн"
 #define sO_TumyTrampie "\xc1\xe0\xf2\xf3\xf2\xe0"	// "Батута"
 #define sO_WithoutBoot "\xc1\xe5\xe7 \xe1\xee\xf2\xe8\xed\xea\xe0"	// "Без ботинка"
@@ -41,21 +42,24 @@
 #define sO_InSmokeRoom "\xc2 \xea\xf3\xf0\xe8\xeb\xea\xe5"	// "В курилке"
 #define sO_InSock "\xc2 \xed\xee\xf1\xea\xe5"	// "В носке"
 #define sO_InGlasses "\xc2 \xee\xf7\xea\xe0\xf5"	// "В очках"
-#define sO_V_14 "\xc2_14"	// "В_14"
-#define sO_V_32_Lies "\xc2_32 \xeb\xe5\xe6\xe8\xf2"	// "В_32 лежит"
-#define sO_V_32_Stands "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2"	// "В_32 торчит"
-#define sO_V_7 "\xc2_7"	// "В_7"
-#define sO_Valve1_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc1_26"	// "Вентиль1_26"
-#define sO_Valve2_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc2_26"	// "Вентиль2_26"
-#define sO_Valve3_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc3_26"	// "Вентиль3_26"
-#define sO_Valve4_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc4_26"	// "Вентиль4_26"
-#define sO_Valve5_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc5_26"	// "Вентиль5_26"
+#define sO_In_14 "\xc2_14"	// "В_14"
+#define sO_In_32_Lies "\xc2_32 \xeb\xe5\xe6\xe8\xf2"	// "В_32 лежит"
+#define sO_In_32_Stands "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2"	// "В_32 торчит"
+#define sO_In_33 "\xc2_33"	// "В_33"
+#define sO_In_7 "\xc2_7"	// "В_7"
+#define sO_Together "\xc2\xe4\xe2\xee\xe5\xec"	// "Вдвоем"
+#define sO_Valve1_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc\x31_26"	// "Вентиль1_26"
+#define sO_Valve2_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc\x32_26"	// "Вентиль2_26"
+#define sO_Valve3_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc\x33_26"	// "Вентиль3_26"
+#define sO_Valve4_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc\x34_26"	// "Вентиль4_26"
+#define sO_Valve5_26 "\xc2\xe5\xed\xf2\xe8\xeb\xfc\x35_26"	// "Вентиль5_26"
 #define sO_Valve_34 "\xc2\xe5\xed\xf2\xe8\xeb\xfc_34"	// "Вентиль_34"
 #define sO_UpperHatch_23 "\xc2\xe5\xf0\xf5\xed\xe8\xe9 \xeb\xfe\xea_23"	// "Верхний люк_23"
 #define sO_Taken "\xc2\xe7\xff\xf2"	// "Взят"
 #define sO_HangsOnPipe "\xc2\xe8\xf1\xe8\xf2 \xed\xe0 \xf2\xf0\xf3\xe1\xe5"	// "Висит на трубе"
 #define sO_On "\xc2\xea\xeb"	// "Вкл"
 #define sO_TurnedOn "\xc2\xea\xeb\xfe\xf7\xe5\xed"	// "Включен"
+#define sO_Driver "\xc2\xee\xe4\xe8\xeb\xe0"	// "Водила"
 #define sO_HareTheNooksiter "\xc2\xf3\xe3\xeb\xf3\xf1\xe5\xe4"	// "Вуглусед"
 #define sO_Off "\xc2\xfb\xea\xeb"	// "Выкл"
 #define sO_TurnedOff "\xc2\xfb\xea\xeb\xfe\xf7\xe5\xed"	// "Выключен"
@@ -86,6 +90,7 @@
 #define sO_Full "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xf6\xe5\xeb\xe8\xea\xee\xec"	// "Заполнен целиком"
 #define sO_MirroredTo "\xc7\xe5\xf0\xea\xe0\xeb\xfc\xed\xe0\xff \xea"	// "Зеркальная к"
 #define sO_Playing "\xc8\xe3\xf0\xe0\xe5\xf2"	// "Играет"
+#define sO_Tub "\xca\xe0\xe4\xea\xe0"	// "Кадка"
 #define sO_Cactus "\xca\xe0\xea\xf2\xf3\xf1"	// "Кактус"
 #define sO_SwingingWithBoot "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Катается с ботинком"
 #define sO_Swinging "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff"	// "Катается"
@@ -106,7 +111,7 @@
 #define sO_Fliers "\xcb\xe5\xf2\xf3\xed\xfb"	// "Летуны"
 #define sO_Hatch_26 "\xcb\xfe\xea_26"	// "Люк_26"
 #define sO_Hatch_34 "\xcb\xfe\xea_34"	// "Люк_34"
-#define sO_MommyOfHand_32 "\xcc\xe0\xec\xe0 \xf0\xf3\xf7\xea\xe8_32"	// "Мама ручки_32"
+#define sO_MommyOfHandle_32 "\xcc\xe0\xec\xe0 \xf0\xf3\xf7\xea\xe8_32"	// "Мама ручки_32"
 #define sO_BigMumsy "\xcc\xe0\xec\xe0\xf8\xe0"	// "Мамаша"
 #define sO_Bag_22 "\xcc\xe5\xf8\xee\xea_22"	// "Мешок_22"
 #define sO_CoinSlot_1 "\xcc\xee\xed\xe5\xf2\xee\xef\xf0\xe8\xe5\xec\xed\xe8\xea 1"	// "Монетоприемник 1"
@@ -124,6 +129,7 @@
 #define sO_NotHanging "\xcd\xe5 \xe2\xe8\xf1\xe8\xf2"	// "Не висит"
 #define sO_NotGrown "\xcd\xe5 \xe2\xfb\xf0\xee\xf1"	// "Не вырос"
 #define sO_NotCrackedEggs "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee"	// "Не колол яйцо"
+#define sO_NotFallen "\xcd\xe5 \xef\xe0\xe4\xe0\xeb"	// "Не падал"
 #define sO_NotAvailable "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0"	// "Недоступна"
 #define sO_CannotTake "\xcd\xe5\xeb\xfc\xe7\xff \xe2\xe7\xff\xf2\xfc"	// "Нельзя взять"
 #define sO_No "\xcd\xe5\xf2"	// "Нет"
@@ -131,6 +137,7 @@
 #define sO_LowerPipe "\xcd\xe8\xe6\xed\xff\xff \xf2\xf0\xf3\xe1\xe0"	// "Нижняя труба"
 #define sO_LowerPipe_21 "\xcd\xe8\xe6\xed\xff\xff \xf2\xf0\xf3\xe1\xe0_21"	// "Нижняя труба_21"
 #define sO_WantsNothing "\xcd\xe8\xf7\xe5\xe3\xee \xed\xe5 \xf5\xee\xf7\xe5\xf2"	// "Ничего не хочет"
+#define sO_Leg "\xcd\xee\xe3\xe0"	// "Нога"
 #define sO_FriesPit "\xcd\xee\xf0\xea\xe0 \xea\xee\xe7\xff\xe2\xea\xe8"	// "Норка козявки"
 #define sO_Sock_26 "\xcd\xee\xf1\xee\xea_26"	// "Носок_26"
 #define sO_ClockAxis "\xce\xf1\xfc \xf7\xe0\xf1\xee\xe2"	// "Ось часов"
@@ -138,7 +145,7 @@
 #define sO_OpenedWithBoot "\xce\xf2\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec"	// "Открыта с ботинком"
 #define sO_OpenedShe "\xce\xf2\xea\xf0\xfb\xf2\xe0"	// "Открыта"
 #define sO_WeirdWacko "\xce\xf2\xec\xee\xf0\xee\xe6\xe5\xed\xed\xfb\xe9"	// "Отмороженный"
-#define sO_NotFound "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Отсутствует"
+#define sO_NotPresent "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Отсутствует"
 #define sO_Error "\xce\xf8\xe8\xe1\xea\xe0"	// "Ошибка"
 #define sO_Passive "\xcf\xe0\xf1\xf1\xe8\xe2\xed\xe0"	// "Пассивна"
 #define sO_First "\xcf\xe5\xf0\xe2\xfb\xe9"	// "Первый"
@@ -149,7 +156,7 @@
 #define sO_FullPipe "\xcf\xee\xeb\xed\xe0\xff \xd2\xf0\xf3\xe1\xe0"	// "Полная Труба"
 #define sO_RightStairs_9 "\xcf\xf0\xe0\xe2\xe0\xff \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe0_9"	// "Правая лестница_9"
 #define sO_RightPipe_17 "\xcf\xf0\xe0\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_17"	// "Правая труба_17"
-#define sO_Present "\xcf\xf0\xe8\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Присутствует"
+#define sO_Available "\xcf\xf0\xe8\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2"	// "Присутствует"
 #define sO_GulpedEgg "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xee\xe5 \xff\xe9\xf6\xee"	// "Проглоченное яйцо"
 #define sO_GulpedEggs "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xfb\xe5 \xff\xe9\xf6\xe0"	// "Проглоченные яйца"
 #define sO_BellyInflater "\xcf\xf3\xe7\xee\xe4\xf3\xe2"	// "Пузодув"
@@ -184,6 +191,7 @@
 #define sO_WithDrawer "\xd1 \xff\xf9\xe8\xea\xee\xec"	// "С ящиком"
 #define sO_Sugar "\xd1\xe0\xf5\xe0\xf0\xee\xea"	// "Сахарок"
 #define sO_Convoluted "\xd1\xe2\xe5\xf0\xed\xf3\xf2"	// "Свернут"
+#define sO_IsFree "\xd1\xe2\xee\xe1\xee\xe4\xed\xe0"	// "Свободна"
 #define sO_Sitting "\xd1\xe8\xe4\xe8\xf2"	// "Сидит"
 #define sO_Laughing "\xd1\xec\xe5\xe5\xf2\xf1\xff"	// "Смеется"
 #define sO_WithEveryone "\xd1\xee \xe2\xf1\xe5\xec\xe8"	// "Со всеми"
@@ -212,6 +220,7 @@
 #define sO_Gone "\xd3\xe5\xf5\xe0\xeb\xe0"	// "Уехала"
 #define sO_FallenOnce "\xd3\xef\xe0\xeb \xf0\xe0\xe7"	// "Упал раз"
 #define sO_FallenBrush "\xd3\xef\xe0\xeb\xe0 \xf9\xe5\xf2\xea\xe0"	// "Упала щетка"
+#define sO_NotBroken "\xd6\xe5\xeb\xe0"	// "Цела"
 #define sO_ScratchingBelly "\xd7\xe5\xf8\xe5\xf2 \xef\xf3\xe7\xee"	// "Чешет пузо"
 #define sO_Level0 "\xdd\xf2\xe0\xe6 0"	// "Этаж 0"
 #define sO_Level1 "\xdd\xf2\xe0\xe6 1"	// "Этаж 1"
@@ -226,7 +235,7 @@
 #define sO_EggGulperGaveCoin "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2 \xee\xf2\xe4\xe0\xeb \xec\xee\xed\xe5\xf2\xf3"	// "Яйцеглот отдал монету"
 #define sO_EggGulper "\xdf\xe9\xf6\xe5\xe3\xeb\xee\xf2"	// "Яйцеглот"
 #define sO_EggCracker "\xdf\xe9\xf6\xe5\xea\xee\xeb"	// "Яйцекол"
-#define sO_NotLayingEgg "\xdf\xe9\xf6\xee \xed\xe5 \xed\xe5\xf1\xe5\xf2"	// "Яйцо не несет"
-#define sO_Egg1 "\xdf\xe9\xf6\xee1"	// "Яйцо1"
-#define sO_Egg2 "\xdf\xe9\xf6\xee2"	// "Яйцо2"
-#define sO_Egg3 "\xdf\xe9\xf6\xee3"	// "Яйцо3"
+#define sO_NotCarryingEgg "\xdf\xe9\xf6\xee \xed\xe5 \xed\xe5\xf1\xe5\xf2"	// "Яйцо не несет"
+#define sO_Egg1 "\xdf\xe9\xf6\xee\x31"	// "Яйцо1"
+#define sO_Egg2 "\xdf\xe9\xf6\xee\x32"	// "Яйцо2"
+#define sO_Egg3 "\xdf\xe9\xf6\xee\x33"	// "Яйцо3"
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 34d117b..be12424 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -315,7 +315,8 @@ class ExCommand : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
- class CGameVar : public CObject {
+class CGameVar : public CObject {
+ public:
 	CGameVar *_nextVarObj;
 	CGameVar *_prevVarObj;
 	CGameVar *_parentVarObj;
@@ -328,6 +329,12 @@ class ExCommand : public CObject {
  public:
 	CGameVar();
 	virtual bool load(MfcArchive &file);
+	CGameVar *getSubVarByName(const char *name);
+	bool setSubVarAsInt(const char *name, int value);
+	int getSubVarAsInt(const char *name);
+	CGameVar *addSubVarAsInt(const char *name, int value);
+	bool addSubVar(CGameVar *subvar);
+
 };
 
 class InventoryPoolItem {
@@ -435,6 +442,8 @@ class CGameLoader : public CObject {
 
 	virtual bool load(MfcArchive &file);
 
+	CGameVar *_gameVar;
+
  private:
 	GameProject *_gameProject;
 	CInteractionController *_interactionController;
@@ -456,7 +465,6 @@ class CGameLoader : public CObject {
 	int16 _field_F8;
 	int16 _field_FA;
 	PreloadItems _preloadItems;
-	CGameVar *_gameVar;
 	char *_gameName;
 	ExCommand _exCommand;
 	int _updateCounter;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 7501f2b..781fab2 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -32,9 +32,11 @@
 namespace Fullpipe {
 
 bool FullpipeEngine::loadGam(const char *fname) {
-	g_gameLoader = new CGameLoader();
+	_gameLoader = new CGameLoader();
 
-	if (g_gameLoader->loadFile(fname)) {
+	if (_gameLoader->loadFile(fname)) {
+		g_currSoundListCount = 0;
+		initObjectStates();
 		// TODO
 	} else
 		return false;
@@ -45,8 +47,6 @@ bool FullpipeEngine::loadGam(const char *fname) {
 CGameLoader::CGameLoader() {
 	_interactionController = new CInteractionController();
 
-	// g_gameLoader = this;  // FIXME
-
 	_gameProject = 0;
 	//_gameName = "untitled";
 
@@ -483,6 +483,85 @@ bool CGameVar::load(MfcArchive &file) {
 	return true;
 }
 
+CGameVar *CGameVar::getSubVarByName(const char *name) {
+  CGameVar *sv = 0;
+
+  if (_subVars != 0) {
+    sv = _subVars;
+    for (;sv && scumm_stricmp(sv->_stringObj, name); sv = sv->_nextVarObj)
+      ;
+  }
+  return sv;
+}
+
+bool CGameVar::setSubVarAsInt(const char *name, int value) {
+  CGameVar *var = getSubVarByName(name);
+
+  if (var) {
+    if (var->_varType == 0) {
+      var->_value.intValue = value;
+
+      return true;
+    }
+    return false;
+  }
+
+  var = new CGameVar();
+  var->_varType = 0;
+  var->_value.intValue = value;
+  var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
+  strcpy(var->_stringObj, name);
+
+  return addSubVar(var);
+}
+
+int CGameVar::getSubVarAsInt(const char *name) {
+  CGameVar *var = getSubVarByName(name);
+
+  if (var)
+    return var->_value.intValue;
+  else
+    return 0;
+}
+
+CGameVar *CGameVar::addSubVarAsInt(const char *name, int value) {
+  if (getSubVarByName(name)) {
+    return 0;
+  } else {
+    CGameVar *var = new CGameVar();
+
+    var->_varType = 0;
+    var->_value.intValue = value;
+
+    var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
+    strcpy(var->_stringObj, name);
+
+    return (addSubVar(var) != 0) ? var : 0;
+  }
+}
+
+bool CGameVar::addSubVar(CGameVar *subvar) {
+  CGameVar *var = _subVars;
+
+  if (var) {
+    for (CGameVar *i = var->_nextVarObj; i; i = i->_nextVarObj)
+      var = i;
+
+    var->_nextVarObj = subvar;
+    subvar->_prevVarObj = var;
+    subvar->_parentVarObj = var;
+    
+    return true;
+  } else {
+    var->_subVars = subvar;
+    subvar->_parentVarObj = var;
+
+    return true;
+  }
+
+  return false;
+}
+
 Sc2::Sc2() {
 	_sceneId = 0;
 	_field_2 = 0;
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index c46fe38..9af7d14 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -25,6 +25,7 @@
 
 #include "common/hash-str.h"
 #include "common/array.h"
+#include "common/file.h"
 
 namespace Fullpipe {
 


Commit: 3e948052f7a0775d3b4d04e1eaef533951f1a719
    https://github.com/scummvm/scummvm/commit/3e948052f7a0775d3b4d04e1eaef533951f1a719
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:13-07:00

Commit Message:
FULLPIPE: Make Inventory2 inherit from Inventory

Changed paths:
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index be12424..49349f6 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -405,8 +405,7 @@ class BigPicture {
 	Picture pic;
 };
 
-class CInventory2 : public CObject {
-	CInventory _inventory;
+class CInventory2 : public CInventory {
 	InventoryItems _inventoryItems;
 	InventoryIcons _inventoryIcons;
 	int _selectedId;
@@ -420,7 +419,6 @@ class CInventory2 : public CObject {
  public:
 	CInventory2();
 	bool loadPartial(MfcArchive &file);
-	virtual bool load(MfcArchive &file);
 };
 
 struct PreloadItem {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 781fab2..99f25d4 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -234,10 +234,6 @@ CInventory2::CInventory2() {
 	_topOffset = -65;
 }
 
-bool CInventory2::load(MfcArchive &file) {
-	return _inventory.load(file);
-}
-
 bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartially
 	int numInvs = file.readUint32LE();
 


Commit: 8de8a901cb7946f5506e990224b78bdfb4ca737e
    https://github.com/scummvm/scummvm/commit/8de8a901cb7946f5506e990224b78bdfb4ca737e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:13-07:00

Commit Message:
FULLPIPE: Put all inventory-related classes into separate file

Changed paths:
  A engines/fullpipe/inventory.cpp
  A engines/fullpipe/inventory.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/module.mk
    engines/fullpipe/motion.cpp
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index c5099f5..406a6fd 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -30,7 +30,6 @@
 #include "fullpipe/fullpipe.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/objectnames.h"
-#include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
 
 namespace Fullpipe {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
new file mode 100644
index 0000000..03b7cbf
--- /dev/null
+++ b/engines/fullpipe/inventory.cpp
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+
+namespace Fullpipe {
+
+bool CInventory::load(MfcArchive &file) {
+	_sceneId = file.readUint16LE();
+	int numInvs = file.readUint32LE();
+
+	for (int i = 0; i < numInvs; i++) {
+		InventoryPoolItem *t = new InventoryPoolItem();
+		t->_id = file.readUint16LE();
+		t->_pictureObjectNormalId = file.readUint16LE();
+		t->_pictureObjectId1 = file.readUint16LE();
+		t->_pictureObjectMouseInsideId = file.readUint16LE();
+		t->_pictureObjectId3 = file.readUint16LE();
+		t->_flags = file.readUint32LE();
+		t->_field_C = 0;
+		t->_field_A = -536;
+		_itemsPool.push_back(*t);
+	}
+
+	return true;
+}
+
+CInventory2::CInventory2() {
+	_selectedId = -1;
+	_field_48 = -1;
+	_sceneObj = 0;
+	_picture = 0;
+	_isInventoryOut = 0;
+	_isLocked = 0;
+	_topOffset = -65;
+}
+
+bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartially
+	int numInvs = file.readUint32LE();
+
+	for (int i = 0; i < numInvs; i++) {
+		InventoryItem *t = new InventoryItem();
+		t->itemId = file.readUint16LE();
+		t->count = file.readUint16LE();
+		_inventoryItems.push_back(*t);
+	}
+
+	return true;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
new file mode 100644
index 0000000..8b6271a
--- /dev/null
+++ b/engines/fullpipe/inventory.h
@@ -0,0 +1,97 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_INVENTORY_H
+#define FULLPIPE_INVENTORY_H
+
+namespace Fullpipe {
+
+class Scene;
+class BigPicture;
+
+class InventoryPoolItem {
+ public:
+	int16 _id;
+	int16 _pictureObjectNormalId;
+	int16 _pictureObjectId1;
+	int16 _pictureObjectMouseInsideId;
+	int16 _pictureObjectId3;
+	int16 _field_A;
+	int _field_C;
+	int _obj;
+	int _flags;
+};
+
+typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
+
+class CInventory : public CObject {
+	int16 _sceneId;
+	int16 _field_6;
+	InventoryPoolItems _itemsPool;
+
+ public:
+	CInventory() { _sceneId = 0; }
+	virtual bool load(MfcArchive &file);
+};
+
+struct InventoryItem {
+	int16 itemId;
+	int16 count;
+};
+
+typedef Common::Array<InventoryItem> InventoryItems;
+
+class InventoryIcon {
+	int pictureObjectNormal;
+	int pictureObjectMouseInside;
+	int pictureObject3;
+	int x1;
+	int y1;
+	int x2;
+	int y2;
+	int16 inventoryItemId;
+	int16 field_1E;
+	int isSelected;
+	int isMouseInside;
+};
+
+typedef Common::Array<InventoryIcon> InventoryIcons;
+
+class CInventory2 : public CInventory {
+	InventoryItems _inventoryItems;
+	InventoryIcons _inventoryIcons;
+	int _selectedId;
+	int _field_48;
+	int _isInventoryOut;
+	int _isLocked;
+	int _topOffset;
+	Scene *_sceneObj;
+	BigPicture *_picture;
+
+ public:
+	CInventory2();
+	bool loadPartial(MfcArchive &file);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_INVENTORY_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index a2402e0..e5a7952 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -3,6 +3,7 @@ MODULE := engines/fullpipe
 MODULE_OBJS = \
 	detection.o \
 	fullpipe.o \
+	inventory.o \
 	motion.o \
 	ngiarchive.o \
 	stateloader.o \
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index ec6a8bd..3ff6181 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -26,7 +26,6 @@
 #include "common/array.h"
 #include "common/list.h"
 
-#include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
 #include "fullpipe/motion.h"
 
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 49349f6..9ef2dfe 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -23,54 +23,10 @@
 #ifndef FULLPIPE_OBJECTS_H
 #define FULLPIPE_OBJECTS_H
 
-namespace Fullpipe {
-
-class CObject {
- public:
-	virtual bool load(MfcArchive &in) { return true; }
-	virtual ~CObject() {}
-
-	bool loadFile(const char *fname);
-};
-
-class CObList : public Common::List<CObject>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-class MemoryObject {
-	//CObject obj;
-	int filename;
-	int field_8;
-	int field_C;
-	int field_10;
-	char field_14;
-	char field_15;
-	char field_16;
-	char field_17;
-	int data;
-	int dataSize;
-	int flags;
-	int libHandle;
-};
-
-class CObArray : public Common::Array<CObject>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-class CDWordArray : public Common::Array<int32>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-struct CNode {
-	CNode *pNext;
-	CNode *pPrev;
-	void *data;
-};
+#include "fullpipe/utils.h"
+#include "fullpipe/inventory.h"
 
-typedef Common::Array<void *> CPtrList;
+namespace Fullpipe {
 
 class SceneTag : public CObject {
  public:
@@ -337,54 +293,6 @@ class CGameVar : public CObject {
 
 };
 
-class InventoryPoolItem {
- public:
-	int16 _id;
-	int16 _pictureObjectNormalId;
-	int16 _pictureObjectId1;
-	int16 _pictureObjectMouseInsideId;
-	int16 _pictureObjectId3;
-	int16 _field_A;
-	int _field_C;
-	int _obj;
-	int _flags;
-};
-
-typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
-
-class CInventory : public CObject {
-	int16 _sceneId;
-	int16 _field_6;
-	InventoryPoolItems _itemsPool;
-
- public:
-	CInventory() { _sceneId = 0; }
-	virtual bool load(MfcArchive &file);
-};
-
-struct InventoryItem {
-	int16 itemId;
-	int16 count;
-};
-
-typedef Common::Array<InventoryItem> InventoryItems;
-
-class InventoryIcon {
-	int pictureObjectNormal;
-	int pictureObjectMouseInside;
-	int pictureObject3;
-	int x1;
-	int y1;
-	int x2;
-	int y2;
-	int16 inventoryItemId;
-	int16 field_1E;
-	int isSelected;
-	int isMouseInside;
-};
-
-typedef Common::Array<InventoryIcon> InventoryIcons;
-
 class Picture {
 	MemoryObject obj;
 	Common::Rect rect;
@@ -405,22 +313,6 @@ class BigPicture {
 	Picture pic;
 };
 
-class CInventory2 : public CInventory {
-	InventoryItems _inventoryItems;
-	InventoryIcons _inventoryIcons;
-	int _selectedId;
-	int _field_48;
-	int _isInventoryOut;
-	int _isLocked;
-	int _topOffset;
-	Scene *_sceneObj;
-	BigPicture *_picture;
-
- public:
-	CInventory2();
-	bool loadPartial(MfcArchive &file);
-};
-
 struct PreloadItem {
 	int preloadId1;
 	int preloadId2;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 99f25d4..d02d6f6 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -26,7 +26,6 @@
 #include "common/array.h"
 #include "common/list.h"
 
-#include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
 
 namespace Fullpipe {
@@ -76,15 +75,6 @@ CGameLoader::~CGameLoader() {
 	delete _gameProject;
 }
 
-bool CObject::loadFile(const char *fname) {
-	MfcArchive file;
-
-	if (!file.open(fname))
-		return false;
-
-	return load(file);
-}
-
 bool CGameLoader::load(MfcArchive &file) {
 	_gameName = file.readPascalString();
 	debug(6, "_gameName: %s", _gameName);
@@ -204,68 +194,10 @@ SceneTag::~SceneTag() {
 	free(_tag);
 }
 
-bool CInventory::load(MfcArchive &file) {
-	_sceneId = file.readUint16LE();
-	int numInvs = file.readUint32LE();
-
-	for (int i = 0; i < numInvs; i++) {
-		InventoryPoolItem *t = new InventoryPoolItem();
-		t->_id = file.readUint16LE();
-		t->_pictureObjectNormalId = file.readUint16LE();
-		t->_pictureObjectId1 = file.readUint16LE();
-		t->_pictureObjectMouseInsideId = file.readUint16LE();
-		t->_pictureObjectId3 = file.readUint16LE();
-		t->_flags = file.readUint32LE();
-		t->_field_C = 0;
-		t->_field_A = -536;
-		_itemsPool.push_back(*t);
-	}
-
-	return true;
-}
-
-CInventory2::CInventory2() {
-	_selectedId = -1;
-	_field_48 = -1;
-	_sceneObj = 0;
-	_picture = 0;
-	_isInventoryOut = 0;
-	_isLocked = 0;
-	_topOffset = -65;
-}
-
-bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartially
-	int numInvs = file.readUint32LE();
-
-	for (int i = 0; i < numInvs; i++) {
-		InventoryItem *t = new InventoryItem();
-		t->itemId = file.readUint16LE();
-		t->count = file.readUint16LE();
-		_inventoryItems.push_back(*t);
-	}
-
-	return true;
-}
-
 bool CInteractionController::load(MfcArchive &file) {
 	return _interactions.load(file);
 }
 
-bool CObList::load(MfcArchive &file) {
-	int count = file.readCount();
-
-	debug(9, "CObList::count: %d:", count);
-
-	for (int i = 0; i < count; i++) {
-		debug(9, "CObList::[%d]", i);
-		CObject *t = file.readClass();
-
-		push_back(*t);
-	}
-
-	return true;
-}
-
 CInputController::CInputController() {
 	// TODO
 }
@@ -399,20 +331,6 @@ bool CObjstateCommand::load(MfcArchive &file) {
 	return true;
 }
 
-bool CObArray::load(MfcArchive &file) {
-	int count = file.readCount();
-
-	resize(count);
-
-	for (int i = 0; i < count; i++) {
-		CObject *t = file.readClass();
-
-		push_back(*t);
-	}
-
-	return true;
-}
-
 bool PreloadItems::load(MfcArchive &file) {
 	int count = file.readCount();
 
@@ -627,22 +545,6 @@ bool Sc2::load(MfcArchive &file) {
 	return true;
 }
 
-bool CDWordArray::load(MfcArchive &file) {
-	int count = file.readCount();
-
-	debug(9, "CDWordArray::count: %d", count);
-
-	resize(count);
-
-	for (int i = 0; i < count; i++) {
-		int32 t = file.readUint32LE();
-
-		push_back(t);
-	}
-
-	return true;
-}
-
 bool PicAniInfo::load(MfcArchive &file) {
   type = file.readUint32LE();
   objectId = file.readUint16LE();
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 6a09174..b3d035b 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -24,12 +24,65 @@
 
 #include "common/file.h"
 
-#include "fullpipe/utils.h"
 #include "fullpipe/objects.h"
 #include "fullpipe/motion.h"
 
 namespace Fullpipe {
 
+bool CObject::loadFile(const char *fname) {
+	MfcArchive file;
+
+	if (!file.open(fname))
+		return false;
+
+	return load(file);
+}
+
+bool CObList::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	debug(9, "CObList::count: %d:", count);
+
+	for (int i = 0; i < count; i++) {
+		debug(9, "CObList::[%d]", i);
+		CObject *t = file.readClass();
+
+		push_back(*t);
+	}
+
+	return true;
+}
+
+bool CObArray::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	resize(count);
+
+	for (int i = 0; i < count; i++) {
+		CObject *t = file.readClass();
+
+		push_back(*t);
+	}
+
+	return true;
+}
+
+bool CDWordArray::load(MfcArchive &file) {
+	int count = file.readCount();
+
+	debug(9, "CDWordArray::count: %d", count);
+
+	resize(count);
+
+	for (int i = 0; i < count; i++) {
+		int32 t = file.readUint32LE();
+
+		push_back(t);
+	}
+
+	return true;
+}
+
 char *MfcArchive::readPascalString(bool twoByte) {
 	char *tmp;
 	int len;
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 9af7d14..88a0641 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -55,6 +55,53 @@ class MfcArchive : public Common::File {
 	int getLevel() { return _level; }
 };
 
+class CObject {
+ public:
+	virtual bool load(MfcArchive &in) { return true; }
+	virtual ~CObject() {}
+
+	bool loadFile(const char *fname);
+};
+
+class CObList : public Common::List<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class MemoryObject {
+	//CObject obj;
+	int filename;
+	int field_8;
+	int field_C;
+	int field_10;
+	char field_14;
+	char field_15;
+	char field_16;
+	char field_17;
+	int data;
+	int dataSize;
+	int flags;
+	int libHandle;
+};
+
+class CObArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class CDWordArray : public Common::Array<int32>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+struct CNode {
+	CNode *pNext;
+	CNode *pPrev;
+	void *data;
+};
+
+typedef Common::Array<void *> CPtrList;
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_UTILS_H */


Commit: dac4f23f8464a3a5df3feebb2b74297df6a01c11
    https://github.com/scummvm/scummvm/commit/dac4f23f8464a3a5df3feebb2b74297df6a01c11
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:13-07:00

Commit Message:
FULLPIPE: Turned InventoryPoolItem into struct

Changed paths:
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h



diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 03b7cbf..588b465 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -32,20 +32,29 @@ bool CInventory::load(MfcArchive &file) {
 
 	for (int i = 0; i < numInvs; i++) {
 		InventoryPoolItem *t = new InventoryPoolItem();
-		t->_id = file.readUint16LE();
-		t->_pictureObjectNormalId = file.readUint16LE();
-		t->_pictureObjectId1 = file.readUint16LE();
-		t->_pictureObjectMouseInsideId = file.readUint16LE();
-		t->_pictureObjectId3 = file.readUint16LE();
-		t->_flags = file.readUint32LE();
-		t->_field_C = 0;
-		t->_field_A = -536;
+		t->id = file.readUint16LE();
+		t->pictureObjectNormalId = file.readUint16LE();
+		t->pictureObjectId1 = file.readUint16LE();
+		t->pictureObjectMouseInsideId = file.readUint16LE();
+		t->pictureObjectId3 = file.readUint16LE();
+		t->flags = file.readUint32LE();
+		t->field_C = 0;
+		t->field_A = -536;
 		_itemsPool.push_back(*t);
 	}
 
 	return true;
 }
 
+int CInventory::getInventoryPoolItemIndexById(int itemId) {
+	for (int i = 0; i < _itemsPool.size(); i++) {
+		if (_itemsPool[i].id == itemId)
+			return i;
+	}
+
+	return 0;
+}
+
 CInventory2::CInventory2() {
 	_selectedId = -1;
 	_field_48 = -1;
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 8b6271a..30b23c3 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -28,17 +28,17 @@ namespace Fullpipe {
 class Scene;
 class BigPicture;
 
-class InventoryPoolItem {
+struct InventoryPoolItem {
  public:
-	int16 _id;
-	int16 _pictureObjectNormalId;
-	int16 _pictureObjectId1;
-	int16 _pictureObjectMouseInsideId;
-	int16 _pictureObjectId3;
-	int16 _field_A;
-	int _field_C;
-	int _obj;
-	int _flags;
+	int16 id;
+	int16 pictureObjectNormalId;
+	int16 pictureObjectId1;
+	int16 pictureObjectMouseInsideId;
+	int16 pictureObjectId3;
+	int16 field_A;
+	int field_C;
+	int obj;
+	int flags;
 };
 
 typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
@@ -51,6 +51,8 @@ class CInventory : public CObject {
  public:
 	CInventory() { _sceneId = 0; }
 	virtual bool load(MfcArchive &file);
+
+	int getInventoryPoolItemIndexById(int itemId);
 };
 
 struct InventoryItem {


Commit: 569b794bfec9b25e1f6a8bb64009840b2cc85d7f
    https://github.com/scummvm/scummvm/commit/569b794bfec9b25e1f6a8bb64009840b2cc85d7f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:14-07:00

Commit Message:
FULLPIPE: Continued work on Inventory

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 406a6fd..1aa4f6c 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -38,6 +38,7 @@ int g_gameProjectVersion = 0;
 int g_gameProjectValue = 0;
 int g_scrollSpeed = 0;
 int g_currSoundListCount = 0;
+FullpipeEngine *g_fullpipe = 0;
 
 FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
 	// Setup mixer
@@ -50,6 +51,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 
 	_rnd = new Common::RandomSource("fullpipe");
 
+	g_fullpipe = this;
 }
 
 FullpipeEngine::~FullpipeEngine() {
@@ -238,4 +240,7 @@ void FullpipeEngine::setObjectState(const char *name, int state) {
   var->setSubVarAsInt(name, state);
 }
 
+void FullpipeEngine::accessScene(int sceneId) {
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 92c0052..52c0fd8 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -45,6 +45,7 @@ enum FullpipeGameFeatures {
 
 class CGameLoader;
 class CGameVar;
+class CInventory2;
 
 extern int g_gameProjectVersion;
 extern int g_gameProjectValue;
@@ -89,9 +90,13 @@ public:
 	CGameVar *_swallowedEgg2;
 	CGameVar *_swallowedEgg3;
 
+	CInventory2 *_inventory;
+
 	void setObjectState(const char *name, int state);
 	int getObjectEnumState(const char *name, const char *state);
 
+	void accessScene(int sceneId);
+
 public:
 
 	bool _isSaveAllowed;
@@ -101,6 +106,8 @@ public:
 
 };
 
+extern FullpipeEngine *g_fullpipe;
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_H */
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 588b465..877f260 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -47,7 +47,10 @@ bool CInventory::load(MfcArchive &file) {
 }
 
 int CInventory::getInventoryPoolItemIndexById(int itemId) {
-	for (int i = 0; i < _itemsPool.size(); i++) {
+	if (_itemsPool.size() <= 0)
+		return -1;
+
+	for (uint i = 0; i < _itemsPool.size(); i++) {
 		if (_itemsPool[i].id == itemId)
 			return i;
 	}
@@ -55,6 +58,17 @@ int CInventory::getInventoryPoolItemIndexById(int itemId) {
 	return 0;
 }
 
+bool CInventory::setItemFlags(int itemId, int flags) {
+	int idx = getInventoryPoolItemIndexById(itemId);
+
+	if (idx < 0)
+		return false;
+	else
+		_itemsPool[idx].flags = flags;
+
+	return true;
+}
+
 CInventory2::CInventory2() {
 	_selectedId = -1;
 	_field_48 = -1;
@@ -78,4 +92,12 @@ bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartia
 	return true;
 }
 
+void CInventory2::addItem(int itemId, int value) {
+	warning("STUB: CInventory2::addItem");
+}
+
+void CInventory2::rebuildItemRects() {
+	g_fullpipe->accessScene(_sceneId);
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 30b23c3..5f0131b 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -44,6 +44,8 @@ struct InventoryPoolItem {
 typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
 
 class CInventory : public CObject {
+	friend class CInventory2;
+
 	int16 _sceneId;
 	int16 _field_6;
 	InventoryPoolItems _itemsPool;
@@ -53,6 +55,7 @@ class CInventory : public CObject {
 	virtual bool load(MfcArchive &file);
 
 	int getInventoryPoolItemIndexById(int itemId);
+	bool setItemFlags(int itemId, int flags);
 };
 
 struct InventoryItem {
@@ -92,6 +95,8 @@ class CInventory2 : public CInventory {
  public:
 	CInventory2();
 	bool loadPartial(MfcArchive &file);
+	void addItem(int itemId, int value);
+	void rebuildItemRects();
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 9ef2dfe..d6f46f7 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -333,6 +333,7 @@ class CGameLoader : public CObject {
 	virtual bool load(MfcArchive &file);
 
 	CGameVar *_gameVar;
+	CInventory2 _inventory;
 
  private:
 	GameProject *_gameProject;
@@ -347,7 +348,6 @@ class CGameLoader : public CObject {
 	int _field_28;
 	int _field_2C;
 	CInputController _inputController;
-	CInventory2 _inventory;
 	Sc2Array _sc2array;
 	void *_sceneSwitcher;
 	void *_preloadCallback;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index d02d6f6..4e9d929 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -27,6 +27,7 @@
 #include "common/list.h"
 
 #include "fullpipe/objects.h"
+#include "fullpipe/gameobj.h"
 
 namespace Fullpipe {
 
@@ -36,6 +37,13 @@ bool FullpipeEngine::loadGam(const char *fname) {
 	if (_gameLoader->loadFile(fname)) {
 		g_currSoundListCount = 0;
 		initObjectStates();
+
+		//set_g_messageQueueCallback1(messageQueueCallback1);
+		//addMessageHandler2(global_messageHandler, 0, 4);
+		_inventory = &_gameLoader->_inventory;
+		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
+		_inventory->addItem(ANI_INV_MAP, 1);
+		_inventory->rebuildItemRects();
 		// TODO
 	} else
 		return false;


Commit: 2412eb23ad7bc0efe143ca19caad8d0d01deb784
    https://github.com/scummvm/scummvm/commit/2412eb23ad7bc0efe143ca19caad8d0d01deb784
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:14-07:00

Commit Message:
FULLPIPE: Further refactoring classes into separate files

Changed paths:
  A engines/fullpipe/gfx.h
  A engines/fullpipe/scene.cpp
  A engines/fullpipe/scene.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/module.mk
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 1aa4f6c..6df26af 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -240,7 +240,4 @@ void FullpipeEngine::setObjectState(const char *name, int state) {
   var->setSubVarAsInt(name, state);
 }
 
-void FullpipeEngine::accessScene(int sceneId) {
-}
-
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
new file mode 100644
index 0000000..7ecd4a5
--- /dev/null
+++ b/engines/fullpipe/gfx.h
@@ -0,0 +1,75 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_GFX_H
+#define FULLPIPE_GFX_H
+
+namespace Fullpipe {
+
+class ShadowsItemArray : public Common::Array<CObject>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class Background {
+	CPtrList list;
+	int stringObj;
+	int x;
+	int y;
+	int16 messageQueueId;
+	int colorMemoryObj;
+	int bigPictureArray1Count;
+	int bigPictureArray2Count;
+	int bigPictureArray;
+};
+
+class Shadows {
+	//CObject obj;
+	int sceneId;
+	int staticAniObjectId;
+	int movementId;
+	ShadowsItemArray items;
+};
+
+class Picture {
+	MemoryObject obj;
+	Common::Rect rect;
+	int convertedBitmap;
+	int x;
+	int y;
+	int field_44;
+	int width;
+	int height;
+	int bitmap;
+	int field_54;
+	int memoryObject2;
+	int alpha;
+	int paletteData;
+};
+
+class BigPicture {
+	Picture pic;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_GFX_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index e5a7952..fde81f1 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS = \
 	inventory.o \
 	motion.o \
 	ngiarchive.o \
+	scene.o \
 	stateloader.o \
 	utils.o
 
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index d6f46f7..c39e0d0 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -25,29 +25,11 @@
 
 #include "fullpipe/utils.h"
 #include "fullpipe/inventory.h"
+#include "fullpipe/gfx.h"
+#include "fullpipe/scene.h"
 
 namespace Fullpipe {
 
-class SceneTag : public CObject {
- public:
-	int _field_4;
-	char *_tag;
-	int _scene;
-	int16 _sceneId;
-	int16 _field_12;
-
- public:
-	SceneTag();
-	~SceneTag();
-
-	virtual bool load(MfcArchive &file);
-};
-
-class SceneTagList : public Common::List<SceneTag>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
 class GameProject : public CObject {
  public:
 	int _field_4;
@@ -137,45 +119,6 @@ class CInputController {
 	CInputController();
 };
 
-class ShadowsItemArray : public Common::Array<CObject>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
-};
-
-class Background {
-	CPtrList list;
-	int stringObj;
-	int x;
-	int y;
-	int16 messageQueueId;
-	int colorMemoryObj;
-	int bigPictureArray1Count;
-	int bigPictureArray2Count;
-	int bigPictureArray;
-};
-
-class Shadows {
-	//CObject obj;
-	int sceneId;
-	int staticAniObjectId;
-	int movementId;
-	ShadowsItemArray items;
-};
-
-class Scene {
-	Background bg;
-	CPtrList staticANIObjectList1;
-	CPtrList staticANIObjectList2;
-	CPtrList messageQueueList;
-	CPtrList faObjectList;
-	Shadows *shadows;
-	int soundList;
-	int16 sceneId;
-	int stringObj;
-	int field_BC;
-	int libHandle;
-};
-
 struct PicAniInfo {
   int32 type;
   int16 objectId;
@@ -196,8 +139,7 @@ struct PicAniInfo {
   bool load(MfcArchive &file);
 };
 
-struct EntranceInfo
-{
+struct EntranceInfo {
   int32 sceneId;
   int32 field_4;
   int32 messageQueueId;
@@ -293,26 +235,6 @@ class CGameVar : public CObject {
 
 };
 
-class Picture {
-	MemoryObject obj;
-	Common::Rect rect;
-	int convertedBitmap;
-	int x;
-	int y;
-	int field_44;
-	int width;
-	int height;
-	int bitmap;
-	int field_54;
-	int memoryObject2;
-	int alpha;
-	int paletteData;
-};
-
-class BigPicture {
-	Picture pic;
-};
-
 struct PreloadItem {
 	int preloadId1;
 	int preloadId2;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
new file mode 100644
index 0000000..3b4b308
--- /dev/null
+++ b/engines/fullpipe/scene.cpp
@@ -0,0 +1,66 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+
+namespace Fullpipe {
+
+void FullpipeEngine::accessScene(int sceneId) {
+}
+
+bool SceneTagList::load(MfcArchive &file) {
+	int numEntries = file.readUint16LE();
+
+	for (int i = 0; i < numEntries; i++) {
+		SceneTag *t = new SceneTag();
+		t->load(file);
+		push_back(*t);
+	}
+
+	return true;
+}
+
+SceneTag::SceneTag() {
+	_field_4 = 0;
+	_scene = 0;
+}
+
+bool SceneTag::load(MfcArchive &file) {
+	_field_4 = 0;
+	_scene = 0;
+
+	_sceneId = file.readUint16LE();
+
+	_tag = file.readPascalString();
+
+	debug(6, "sceneId: %d  tag: %s", _sceneId, _tag);
+
+	return true;
+}
+
+SceneTag::~SceneTag() {
+	free(_tag);
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
new file mode 100644
index 0000000..ee2ddd9
--- /dev/null
+++ b/engines/fullpipe/scene.h
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_SCENE_H
+#define FULLPIPE_SCENE_H
+
+namespace Fullpipe {
+
+class SceneTag : public CObject {
+ public:
+	int _field_4;
+	char *_tag;
+	int _scene;
+	int16 _sceneId;
+	int16 _field_12;
+
+ public:
+	SceneTag();
+	~SceneTag();
+
+	virtual bool load(MfcArchive &file);
+};
+
+class SceneTagList : public Common::List<SceneTag>, public CObject {
+ public:
+	virtual bool load(MfcArchive &file);
+};
+
+class Scene {
+	Background bg;
+	CPtrList staticANIObjectList1;
+	CPtrList staticANIObjectList2;
+	CPtrList messageQueueList;
+	CPtrList faObjectList;
+	Shadows *shadows;
+	int soundList;
+	int16 sceneId;
+	int stringObj;
+	int field_BC;
+	int libHandle;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_SCENE_H */
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 4e9d929..a85e7f3 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -168,40 +168,6 @@ GameProject::~GameProject() {
 	free(_headerFilename);
 }
 
-bool SceneTagList::load(MfcArchive &file) {
-	int numEntries = file.readUint16LE();
-
-	for (int i = 0; i < numEntries; i++) {
-		SceneTag *t = new SceneTag();
-		t->load(file);
-		push_back(*t);
-	}
-
-	return true;
-}
-
-SceneTag::SceneTag() {
-	_field_4 = 0;
-	_scene = 0;
-}
-
-bool SceneTag::load(MfcArchive &file) {
-	_field_4 = 0;
-	_scene = 0;
-
-	_sceneId = file.readUint16LE();
-
-	_tag = file.readPascalString();
-
-	debug(6, "sceneId: %d  tag: %s", _sceneId, _tag);
-
-	return true;
-}
-
-SceneTag::~SceneTag() {
-	free(_tag);
-}
-
 bool CInteractionController::load(MfcArchive &file) {
 	return _interactions.load(file);
 }


Commit: bb4ea153ffa5eaf5be3e912e206566f7c9278a87
    https://github.com/scummvm/scummvm/commit/bb4ea153ffa5eaf5be3e912e206566f7c9278a87
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:14-07:00

Commit Message:
FULLPIPE: Started scene loading

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 6df26af..d49fe9a 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -28,7 +28,6 @@
 #include "engines/util.h"
 
 #include "fullpipe/fullpipe.h"
-#include "fullpipe/ngiarchive.h"
 #include "fullpipe/objectnames.h"
 #include "fullpipe/objects.h"
 
@@ -66,8 +65,6 @@ Common::Error FullpipeEngine::run() {
 
 	loadGam("fullpipe.gam");
 
-	Common::Archive *arch = makeNGIArchive("3896.nl");
-
 	return Common::kNoError;
 }
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 52c0fd8..ce6935c 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -44,8 +44,10 @@ enum FullpipeGameFeatures {
 };
 
 class CGameLoader;
+class GameProject;
 class CGameVar;
 class CInventory2;
+class Scene;
 
 extern int g_gameProjectVersion;
 extern int g_gameProjectValue;
@@ -76,6 +78,7 @@ public:
 	void updateEvents();
 
 	CGameLoader *_gameLoader;
+	GameProject *_gameProject;
 	bool loadGam(const char *fname);
 
 	int _gameProjectVersion;
@@ -95,7 +98,7 @@ public:
 	void setObjectState(const char *name, int state);
 	int getObjectEnumState(const char *name, const char *state);
 
-	void accessScene(int sceneId);
+	Scene *accessScene(int sceneId);
 
 public:
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 3b4b308..96ca7c0 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -23,10 +23,28 @@
 #include "fullpipe/fullpipe.h"
 
 #include "fullpipe/objects.h"
+#include "fullpipe/ngiarchive.h"
 
 namespace Fullpipe {
 
-void FullpipeEngine::accessScene(int sceneId) {
+Scene *FullpipeEngine::accessScene(int sceneId) {
+	SceneTag *t = 0;
+
+	for (SceneTagList::iterator s = _gameProject->_sceneTagList->begin(); s != _gameProject->_sceneTagList->end(); ++s) {
+		if (s->_sceneId == sceneId) {
+			t = &(*s);
+			break;
+		}
+	}
+
+	if (!t)
+		return 0;
+
+	if (!t->_scene) {
+		t->loadScene();
+	}
+
+	return t->_scene;
 }
 
 bool SceneTagList::load(MfcArchive &file) {
@@ -63,4 +81,31 @@ SceneTag::~SceneTag() {
 	free(_tag);
 }
 
+void SceneTag::loadScene() {
+	char *archname = genFileName(0, _sceneId, "nl");
+
+	Common::Archive *arch = makeNGIArchive(archname);
+
+	char *fname = genFileName(0, _sceneId, "sc");
+
+	Common::SeekableReadStream *file = arch->createReadStreamForMember(fname);
+
+	_scene = new Scene();
+
+	//_scene->load(*file);
+
+	delete file;
+
+	free(fname);
+	free(archname);
+
+}
+
+Scene::Scene() {
+}
+
+bool Scene::load(MfcArchive &file) {
+	return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index ee2ddd9..d049267 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -25,11 +25,29 @@
 
 namespace Fullpipe {
 
+class Scene : public CObject {
+	Background bg;
+	CPtrList staticANIObjectList1;
+	CPtrList staticANIObjectList2;
+	CPtrList messageQueueList;
+	CPtrList faObjectList;
+	Shadows *shadows;
+	int soundList;
+	int16 sceneId;
+	int stringObj;
+	int field_BC;
+	int libHandle;
+
+  public:
+	Scene();
+	virtual bool load(MfcArchive &file);
+};
+
 class SceneTag : public CObject {
  public:
 	int _field_4;
 	char *_tag;
-	int _scene;
+	Scene *_scene;
 	int16 _sceneId;
 	int16 _field_12;
 
@@ -38,6 +56,7 @@ class SceneTag : public CObject {
 	~SceneTag();
 
 	virtual bool load(MfcArchive &file);
+	void loadScene();
 };
 
 class SceneTagList : public Common::List<SceneTag>, public CObject {
@@ -45,20 +64,6 @@ class SceneTagList : public Common::List<SceneTag>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class Scene {
-	Background bg;
-	CPtrList staticANIObjectList1;
-	CPtrList staticANIObjectList2;
-	CPtrList messageQueueList;
-	CPtrList faObjectList;
-	Shadows *shadows;
-	int soundList;
-	int16 sceneId;
-	int stringObj;
-	int field_BC;
-	int libHandle;
-};
-
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_SCENE_H */
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index a85e7f3..ea3655e 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -91,6 +91,8 @@ bool CGameLoader::load(MfcArchive &file) {
 
 	_gameProject->load(file);
 
+	g_fullpipe->_gameProject = _gameProject;
+
 	if (g_gameProjectVersion < 12) {
 		error("Old gameProjectVersion: %d", g_gameProjectVersion);
 	}
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index b3d035b..26c03ce 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -285,4 +285,16 @@ CObject *MfcArchive::parseClass(bool *isCopyReturned) {
 	return res;
 }
 
+char *genFileName(int superId, int sceneId, const char *ext) {
+	char *s = (char *)calloc(256, 1);
+
+	if (superId) {
+		snprintf(s, 255, "%04d%04d.%s", superId, sceneId, ext);
+	} else {
+		snprintf(s, 255, "%04d.%s", sceneId, ext);
+	}
+
+	return s;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 88a0641..409c5de 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -102,6 +102,8 @@ struct CNode {
 
 typedef Common::Array<void *> CPtrList;
 
+char *genFileName(int superId, int sceneId, const char *ext);
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_UTILS_H */


Commit: 925f41b9c4055d39498c61c8f22388176ee25cce
    https://github.com/scummvm/scummvm/commit/925f41b9c4055d39498c61c8f22388176ee25cce
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:14-07:00

Commit Message:
FULLPIPE: Made MfcArchive work with both files and archives

Changed paths:
    engines/fullpipe/scene.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 96ca7c0..887647d 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -92,19 +92,22 @@ void SceneTag::loadScene() {
 
 	_scene = new Scene();
 
-	//_scene->load(*file);
+	MfcArchive archive(file);
+
+	_scene->load(archive);
 
 	delete file;
 
 	free(fname);
 	free(archname);
-
 }
 
 Scene::Scene() {
 }
 
 bool Scene::load(MfcArchive &file) {
+	debug(0, "Scene::load");
+
 	return true;
 }
 
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 26c03ce..468d03b 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -30,12 +30,14 @@
 namespace Fullpipe {
 
 bool CObject::loadFile(const char *fname) {
-	MfcArchive file;
+	Common::File file;
 
 	if (!file.open(fname))
 		return false;
 
-	return load(file);
+	MfcArchive archive(&file);
+
+	return load(archive);
 }
 
 bool CObList::load(MfcArchive &file) {
@@ -201,7 +203,7 @@ static CObject *createObject(int objectId) {
 	return 0;
 }
 
-MfcArchive::MfcArchive() {
+MfcArchive::MfcArchive(Common::SeekableReadStream *stream) {
 	for (int i = 0; classMap[i].name; i++) {
 		_classMap[classMap[i].name] = classMap[i].id;
 	}
@@ -209,6 +211,8 @@ MfcArchive::MfcArchive() {
 	_lastIndex = 1;
 	_level = 0;
 
+	_stream = stream;
+
 	_objectMap.push_back(0);
 	_objectIdMap.push_back(kNullObject);
 }
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 409c5de..b349fc3 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -33,7 +33,7 @@ class CObject;
 
 typedef Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ClassMap;
 
-class MfcArchive : public Common::File {
+class MfcArchive : public Common::SeekableReadStream {
 	ClassMap _classMap;
 	Common::Array<CObject *> _objectMap;
 	Common::Array<int> _objectIdMap;
@@ -41,8 +41,10 @@ class MfcArchive : public Common::File {
 	int _lastIndex;
 	int _level;
 
+	Common::SeekableReadStream *_stream;
+
  public:
-	MfcArchive();
+	MfcArchive(Common::SeekableReadStream *file);
 
 	char *readPascalString(bool twoByte = false);
 	int readCount();
@@ -53,6 +55,12 @@ class MfcArchive : public Common::File {
 	void incLevel() { _level++; }
 	void decLevel() { _level--; }
 	int getLevel() { return _level; }
+
+	virtual bool eos() const { return _stream->eos(); }
+	virtual uint32 read(void *dataPtr, uint32 dataSize) { return _stream->read(dataPtr, dataSize); }
+	virtual int32 pos() const { return _stream->pos(); }
+	virtual int32 size() const { return _stream->size(); }
+	virtual bool seek(int32 offset, int whence = SEEK_SET) { return _stream->seek(offset, whence); }
 };
 
 class CObject {


Commit: 77ab4241d99df808b081a30163870ffa0d5688d6
    https://github.com/scummvm/scummvm/commit/77ab4241d99df808b081a30163870ffa0d5688d6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:14-07:00

Commit Message:
FULLPIPE: Continued work on Scene loading. Pictures

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.h
    engines/fullpipe/module.mk
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index d49fe9a..c43e14b 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -33,10 +33,6 @@
 
 namespace Fullpipe {
 
-int g_gameProjectVersion = 0;
-int g_gameProjectValue = 0;
-int g_scrollSpeed = 0;
-int g_currSoundListCount = 0;
 FullpipeEngine *g_fullpipe = 0;
 
 FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index ce6935c..034fda3 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -49,11 +49,6 @@ class CGameVar;
 class CInventory2;
 class Scene;
 
-extern int g_gameProjectVersion;
-extern int g_gameProjectValue;
-extern int g_scrollSpeed;
-extern int g_currSoundListCount;
-
 class FullpipeEngine : public ::Engine {
 protected:
 
@@ -84,6 +79,7 @@ public:
 	int _gameProjectVersion;
 	int _gameProjectValue;
 	int _scrollSpeed;
+	int _currSoundListCount;
 
 	void initObjectStates();
 	void setLevelStates();
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 7ecd4a5..e52d9b7 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -30,16 +30,70 @@ class ShadowsItemArray : public Common::Array<CObject>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class Background {
-	CPtrList list;
-	int stringObj;
-	int x;
-	int y;
-	int16 messageQueueId;
-	int colorMemoryObj;
-	int bigPictureArray1Count;
-	int bigPictureArray2Count;
-	int bigPictureArray;
+class Picture : public MemoryObject {
+	Common::Rect _rect;
+	int _convertedBitmap;
+	int _x;
+	int _y;
+	int _field_44;
+	int _width;
+	int _height;
+	int _bitmap;
+	int _field_54;
+	int _memoryObject2;
+	int _alpha;
+	int _paletteData;
+};
+
+class BigPicture : public Picture {
+
+};
+
+class GameObject : public CObject {
+	friend class PictureObject;
+
+	int16 _field_4;
+	int16 _field_6;
+	int _field_8;
+	int16 _flags;
+	int16 _id;
+	char *_stringObj;
+	int _ox;
+	int _oy;
+	int _priority;
+	int _field_20;
+
+  public:
+	GameObject();
+	virtual bool load(MfcArchive &file);
+};
+
+class PictureObject : public GameObject {
+	Picture *_picture;
+	CPtrList *_pictureObject2List;
+	int _ox2;
+	int _oy2;
+
+  public:
+	PictureObject();
+	bool load(MfcArchive &file, bool bigPicture);
+};
+
+class Background : public CObject {
+	CPtrList _list;
+	char *_stringObj;
+	int _x;
+	int _y;
+	int16 _messageQueueId;
+	int _colorMemoryObj;
+	int _bigPictureArray1Count;
+	int _bigPictureArray2Count;
+	int _bigPictureArray;
+
+  public:
+	Background();
+	virtual bool load(MfcArchive &file);
+	void addPictureObject(PictureObject *pct);
 };
 
 class Shadows {
@@ -50,26 +104,6 @@ class Shadows {
 	ShadowsItemArray items;
 };
 
-class Picture {
-	MemoryObject obj;
-	Common::Rect rect;
-	int convertedBitmap;
-	int x;
-	int y;
-	int field_44;
-	int width;
-	int height;
-	int bitmap;
-	int field_54;
-	int memoryObject2;
-	int alpha;
-	int paletteData;
-};
-
-class BigPicture {
-	Picture pic;
-};
-
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_GFX_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index fde81f1..a64727a 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -3,6 +3,7 @@ MODULE := engines/fullpipe
 MODULE_OBJS = \
 	detection.o \
 	fullpipe.o \
+	gfx.o \
 	inventory.o \
 	motion.o \
 	ngiarchive.o \
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 887647d..fb0a771 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -103,10 +103,16 @@ void SceneTag::loadScene() {
 }
 
 Scene::Scene() {
+	_sceneId = 0;
+	_field_BC = 0;
+	_shadows = 0;
+	_soundList = 0;
 }
 
 bool Scene::load(MfcArchive &file) {
-	debug(0, "Scene::load");
+	warning("STUB: Scene::load");
+
+	_bg.load(file);
 
 	return true;
 }
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index d049267..df532b2 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -26,17 +26,17 @@
 namespace Fullpipe {
 
 class Scene : public CObject {
-	Background bg;
-	CPtrList staticANIObjectList1;
-	CPtrList staticANIObjectList2;
-	CPtrList messageQueueList;
-	CPtrList faObjectList;
-	Shadows *shadows;
-	int soundList;
-	int16 sceneId;
-	int stringObj;
-	int field_BC;
-	int libHandle;
+	Background _bg;
+	CPtrList _staticANIObjectList1;
+	CPtrList _staticANIObjectList2;
+	CPtrList _messageQueueList;
+	CPtrList _faObjectList;
+	Shadows *_shadows;
+	int _soundList;
+	int16 _sceneId;
+	int _stringObj;
+	int _field_BC;
+	int _libHandle;
 
   public:
 	Scene();
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index ea3655e..d7cc9cf 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -35,7 +35,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 	_gameLoader = new CGameLoader();
 
 	if (_gameLoader->loadFile(fname)) {
-		g_currSoundListCount = 0;
+		g_fullpipe->_currSoundListCount = 0;
 		initObjectStates();
 
 		//set_g_messageQueueCallback1(messageQueueCallback1);
@@ -93,8 +93,8 @@ bool CGameLoader::load(MfcArchive &file) {
 
 	g_fullpipe->_gameProject = _gameProject;
 
-	if (g_gameProjectVersion < 12) {
-		error("Old gameProjectVersion: %d", g_gameProjectVersion);
+	if (g_fullpipe->_gameProjectVersion < 12) {
+		error("Old gameProjectVersion: %d", g_fullpipe->_gameProjectVersion);
 	}
 
 	_gameName = file.readPascalString();
@@ -140,25 +140,25 @@ bool GameProject::load(MfcArchive &file) {
 	_headerFilename = 0;
 	_field_10 = 12;
 
-	g_gameProjectVersion = file.readUint32LE();
-	g_gameProjectValue = file.readUint16LE();
-	g_scrollSpeed = file.readUint32LE();
+	g_fullpipe->_gameProjectVersion = file.readUint32LE();
+	g_fullpipe->_gameProjectValue = file.readUint16LE();
+	g_fullpipe->_scrollSpeed = file.readUint32LE();
 
 	_headerFilename = file.readPascalString();
 
-	debug(1, "_gameProjectVersion = %d", g_gameProjectVersion);
-	debug(1, "_gameProjectValue = %d", g_gameProjectValue);
-	debug(1, "_scrollSpeed = %d", g_scrollSpeed);
+	debug(1, "_gameProjectVersion = %d", g_fullpipe->_gameProjectVersion);
+	debug(1, "_gameProjectValue = %d", g_fullpipe->_gameProjectValue);
+	debug(1, "_scrollSpeed = %d", g_fullpipe->_scrollSpeed);
 	debug(1, "_headerFilename = %s", _headerFilename);
 
 	_sceneTagList = new SceneTagList();
 
 	_sceneTagList->load(file);
 
-	if (g_gameProjectVersion >= 3)
+	if (g_fullpipe->_gameProjectVersion >= 3)
 		_field_4 = file.readUint32LE();
 
-	if (g_gameProjectVersion >= 5) {
+	if (g_fullpipe->_gameProjectVersion >= 5) {
 		file.readUint32LE();
 		file.readUint32LE();
 	}
@@ -269,7 +269,7 @@ bool ExCommand::load(MfcArchive &file) {
 
 	_field_3C = 0;
 
-	if (g_gameProjectVersion >= 12) {
+	if (g_fullpipe->_gameProjectVersion >= 12) {
 		_flags = file.readUint32LE();
 		_parId = file.readUint32LE();
 	}


Commit: 47faa885015f619b730d8716c8527ae5819cb35f
    https://github.com/scummvm/scummvm/commit/47faa885015f619b730d8716c8527ae5819cb35f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:14-07:00

Commit Message:
FULLPIPE: Furhter work on picture loading

Changed paths:
    engines/fullpipe/gfx.h
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index e52d9b7..4ecf4f4 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -43,10 +43,16 @@ class Picture : public MemoryObject {
 	int _memoryObject2;
 	int _alpha;
 	int _paletteData;
+
+  public:
+	Picture();
+	virtual bool load(MfcArchive &file);
 };
 
 class BigPicture : public Picture {
-
+  public:
+	BigPicture();
+	virtual bool load(MfcArchive &file);
 };
 
 class GameObject : public CObject {
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index b349fc3..f1e4080 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -76,8 +76,7 @@ class CObList : public Common::List<CObject>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class MemoryObject {
-	//CObject obj;
+class MemoryObject : CObject {
 	int filename;
 	int field_8;
 	int field_C;


Commit: 29f323fd27d67aede4668e07984eabd69180aee5
    https://github.com/scummvm/scummvm/commit/29f323fd27d67aede4668e07984eabd69180aee5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Completed Background loading

Changed paths:
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.h
    engines/fullpipe/ngiarchive.cpp
    engines/fullpipe/ngiarchive.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 034fda3..013303d 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -48,6 +48,7 @@ class GameProject;
 class CGameVar;
 class CInventory2;
 class Scene;
+class NGIArchive;
 
 class FullpipeEngine : public ::Engine {
 protected:
@@ -96,6 +97,8 @@ public:
 
 	Scene *accessScene(int sceneId);
 
+	NGIArchive *_currArchive;
+
 public:
 
 	bool _isSaveAllowed;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 4ecf4f4..6df8e7b 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -40,13 +40,14 @@ class Picture : public MemoryObject {
 	int _height;
 	int _bitmap;
 	int _field_54;
-	int _memoryObject2;
+	MemoryObject2 *_memoryObject2;
 	int _alpha;
-	int _paletteData;
+	byte *_paletteData;
 
   public:
 	Picture();
 	virtual bool load(MfcArchive &file);
+	void setAOIDs();
 };
 
 class BigPicture : public Picture {
@@ -94,7 +95,7 @@ class Background : public CObject {
 	int _colorMemoryObj;
 	int _bigPictureArray1Count;
 	int _bigPictureArray2Count;
-	int _bigPictureArray;
+	BigPicture ***_bigPictureArray;
 
   public:
 	Background();
diff --git a/engines/fullpipe/ngiarchive.cpp b/engines/fullpipe/ngiarchive.cpp
index 801d020..5d895c1 100644
--- a/engines/fullpipe/ngiarchive.cpp
+++ b/engines/fullpipe/ngiarchive.cpp
@@ -33,33 +33,6 @@
 
 namespace Fullpipe {
 
-#define NGI_FILENAME_MAX 13
-
-struct NgiHeader {
-	int32 pos;
-	int32 extVal;
-	int32 flags;
-	int32 size;
-	char  filename[NGI_FILENAME_MAX];
-};
-
-typedef Common::HashMap<Common::String, NgiHeader*, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> NgiHeadersMap;
-
-class NGIArchive : public Common::Archive {
-	NgiHeadersMap _headers;
-	Common::String _ngiFilename;
-
-public:
-	NGIArchive(const Common::String &name);
-	virtual ~NGIArchive();
-
-	// Archive implementation
-	virtual bool hasFile(const Common::String &name) const;
-	virtual int listMembers(Common::ArchiveMemberList &list) const;
-	virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
-	virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
-};
-
 NGIArchive::NGIArchive(const Common::String &filename) : _ngiFilename(filename) {
 	Common::File ngiFile;
 
@@ -118,6 +91,8 @@ NGIArchive::NGIArchive(const Common::String &filename) : _ngiFilename(filename)
 
 	free(fat);
 
+	g_fullpipe->_currArchive = this;
+
 	debug(0, "NGIArchive::NGIArchive(%s): Located %d files", filename.c_str(), _headers.size());
 }
 
@@ -127,6 +102,8 @@ NGIArchive::~NGIArchive() {
 	for ( ; it != _headers.end(); ++it) {
 		delete it->_value;
 	}
+
+	g_fullpipe->_currArchive = 0;
 }
 
 bool NGIArchive::hasFile(const Common::String &name) const {
@@ -163,8 +140,6 @@ Common::SeekableReadStream *NGIArchive::createReadStreamForMember(const Common::
 	archiveFile.open(_ngiFilename);
 	archiveFile.seek(hdr->pos, SEEK_SET);
 
-	// TODO: It would be good if ArjFile could decompress files in a streaming
-	// mode, so it would not need to pre-allocate the entire output.
 	byte *data = (byte *)malloc(hdr->size);
 	assert(data);
 
diff --git a/engines/fullpipe/ngiarchive.h b/engines/fullpipe/ngiarchive.h
index ee977c6..a5b05a2 100644
--- a/engines/fullpipe/ngiarchive.h
+++ b/engines/fullpipe/ngiarchive.h
@@ -29,6 +29,33 @@ namespace Fullpipe {
 
 class Archive;
 
+#define NGI_FILENAME_MAX 13
+
+struct NgiHeader {
+	int32 pos;
+	int32 extVal;
+	int32 flags;
+	int32 size;
+	char  filename[NGI_FILENAME_MAX];
+};
+
+typedef Common::HashMap<Common::String, NgiHeader*, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> NgiHeadersMap;
+
+class NGIArchive : public Common::Archive {
+	NgiHeadersMap _headers;
+	Common::String _ngiFilename;
+
+public:
+	NGIArchive(const Common::String &name);
+	virtual ~NGIArchive();
+
+	// Archive implementation
+	virtual bool hasFile(const Common::String &name) const;
+	virtual int listMembers(Common::ArchiveMemberList &list) const;
+	virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
+	virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
+};
+
 /**
  * This factory method creates an Archive instance corresponding to the content
  * of the NGI compressed file with the given name.
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index fb0a771..4f17230 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -98,6 +98,8 @@ void SceneTag::loadScene() {
 
 	delete file;
 
+	g_fullpipe->_currArchive = 0;
+
 	free(fname);
 	free(archname);
 }
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 468d03b..0462c4e 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -23,9 +23,11 @@
 #include "fullpipe/fullpipe.h"
 
 #include "common/file.h"
+#include "common/memstream.h"
 
 #include "fullpipe/objects.h"
 #include "fullpipe/motion.h"
+#include "fullpipe/ngiarchive.h"
 
 namespace Fullpipe {
 
@@ -102,6 +104,64 @@ char *MfcArchive::readPascalString(bool twoByte) {
 	return tmp;
 }
 
+MemoryObject::MemoryObject() {
+  	_filename = 0;
+	_field_8 = 0;
+	_field_C = 0;
+	_field_10 = -1;
+	_field_14 = 1;
+	_dataSize = 0;
+	_flags = 0;
+	_libHandle = 0;
+	_data = 0;
+}
+
+bool MemoryObject::load(MfcArchive &file) {
+	_filename = file.readPascalString();
+
+	if (g_fullpipe->_currArchive) {
+		_field_14 = 0;
+		_libHandle = g_fullpipe->_currArchive;
+	}
+
+	return true;
+}
+
+void MemoryObject::loadFile(char *filename) {
+	if (!_data) {
+		if (g_fullpipe->_currArchive != _libHandle) {
+			assert(0);
+		}
+
+		Common::SeekableReadStream *s = _libHandle->createReadStreamForMember(filename);
+
+		if (s) {
+			debug(0, "Reading %s", filename);
+			assert(s->size() > 0);
+			_data = calloc(s->size(), 1);
+			s->read(_data, s->size());
+
+			delete s;
+		}
+	}
+}
+
+MemoryObject2::MemoryObject2() {
+	_data2 = 0;
+}
+
+bool MemoryObject2::load(MfcArchive &file) {
+	MemoryObject::load(file);
+
+	_flags |= 1;
+
+	if (_filename) {
+		MemoryObject::loadFile(_filename);
+	}
+
+	return true;
+}
+
 int MfcArchive::readCount() {
 	int count = readUint16LE();
 
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index f1e4080..bb9ed89 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -30,6 +30,7 @@
 namespace Fullpipe {
 
 class CObject;
+class NGIArchive;
 
 typedef Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ClassMap;
 
@@ -77,18 +78,34 @@ class CObList : public Common::List<CObject>, public CObject {
 };
 
 class MemoryObject : CObject {
-	int filename;
-	int field_8;
-	int field_C;
-	int field_10;
-	char field_14;
-	char field_15;
-	char field_16;
-	char field_17;
-	int data;
-	int dataSize;
-	int flags;
-	int libHandle;
+	friend class MemoryObject2;
+	friend class Picture;
+
+	char *_filename;
+	int _field_8;
+	int _field_C;
+	int _field_10;
+	char _field_14;
+	char _field_15;
+	char _field_16;
+	char _field_17;
+	void *_data;
+	int _dataSize;
+	int _flags;
+	NGIArchive *_libHandle;
+
+ public:
+	MemoryObject();
+	virtual bool load(MfcArchive &file);
+	void loadFile(char *filename);
+};
+
+class MemoryObject2 : public MemoryObject {
+	void *_data2;
+
+ public:
+	MemoryObject2();
+	virtual bool load(MfcArchive &file);
 };
 
 class CObArray : public Common::Array<CObject>, public CObject {


Commit: 751f435df0ef424293e5bb44e205e898897aea6a
    https://github.com/scummvm/scummvm/commit/751f435df0ef424293e5bb44e205e898897aea6a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Continued on scene loading

Changed paths:
  A engines/fullpipe/statics.h
    engines/fullpipe/objects.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index c39e0d0..c12905e 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -120,33 +120,33 @@ class CInputController {
 };
 
 struct PicAniInfo {
-  int32 type;
-  int16 objectId;
-  int16 field_6;
-  int32 field_8;
-  int16 field_C;
-  int16 field_E;
-  int32 ox;
-  int32 oy;
-  int32 priority;
-  int16 staticsId;
-  int16 movementId;
-  int16 dynamicPhaseIndex;
-  int16 flags;
-  int32 field_24;
-  int32 someDynamicPhaseIndex;
-
-  bool load(MfcArchive &file);
+	int32 type;
+	int16 objectId;
+	int16 field_6;
+	int32 field_8;
+	int16 field_C;
+	int16 field_E;
+	int32 ox;
+	int32 oy;
+	int32 priority;
+	int16 staticsId;
+	int16 movementId;
+	int16 dynamicPhaseIndex;
+	int16 flags;
+	int32 field_24;
+	int32 someDynamicPhaseIndex;
+
+	bool load(MfcArchive &file);
 };
 
 struct EntranceInfo {
-  int32 sceneId;
-  int32 field_4;
-  int32 messageQueueId;
-  byte gap_C[292]; // FIXME
-  int32 field_130;
+	int32 sceneId;
+	int32 field_4;
+	int32 messageQueueId;
+	byte gap_C[292]; // FIXME
+	int32 field_130;
 
-  bool load(MfcArchive &file);
+	bool load(MfcArchive &file);
 };
 
 class CMotionController;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 4f17230..7b74c18 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -24,6 +24,7 @@
 
 #include "fullpipe/objects.h"
 #include "fullpipe/ngiarchive.h"
+#include "fullpipe/statics.h"
 
 namespace Fullpipe {
 
@@ -116,6 +117,33 @@ bool Scene::load(MfcArchive &file) {
 
 	_bg.load(file);
 
+	_sceneId = file.readUint16LE();
+	
+	_stringObj = file.readPascalString();
+	debug(0, "scene: <%s>", _stringObj);
+
+	int count = file.readUint16LE();
+
+	for (int i = 0; i < count; i++) {
+		int aniNum = file.readUint16LE();
+		char *aniname = genFileName(0, aniNum, "ani");
+
+		Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(aniname);
+
+		StaticANIObject *ani = new StaticANIObject();
+
+		MfcArchive archive(f);
+
+		ani->load(archive);
+		ani->_sceneId = _sceneId;
+
+		_staticANIObjectList1.push_back(ani);
+
+		delete f;
+		free(aniname);
+
+
+	}
 	return true;
 }
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index df532b2..1c7a9fd 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -34,7 +34,7 @@ class Scene : public CObject {
 	Shadows *_shadows;
 	int _soundList;
 	int16 _sceneId;
-	int _stringObj;
+	char *_stringObj;
 	int _field_BC;
 	int _libHandle;
 
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
new file mode 100644
index 0000000..ef4f2a5
--- /dev/null
+++ b/engines/fullpipe/statics.h
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_STATICS_H
+#define FULLPIPE_STATICS_H
+
+namespace Fullpipe {
+
+class CStepArray : public CObject {
+	int _currPointIndex;
+	int _points;
+	int _maxPointIndex;
+	int _pointsCount;
+	int _isEos;
+};
+
+class StaticPhase : public Picture {
+	int16 _initialCountdown;
+	int16 _countdown;
+	int16 _field_68;
+	int16 _field_6A;
+	int _exCommand;
+};
+
+class DynamicPhase : public StaticPhase {
+	int _someX;
+	int _someY;
+	Common::Rect *_rectPtr;
+	int16 _field_7C;
+	int16 _field_7E;
+	int _flags;
+};
+
+class Statics : public DynamicPhase {
+ 	int16 _staticsId;
+	int16 _field_86;
+	char *_stringObj;
+	int _picture;
+};
+
+class Movement : public GameObject {
+	int _field_24;
+	int _field_28;
+	int _lastFrameSpecialFlag;
+	int _flipFlag;
+	int _updateFlag1;
+	Statics *_staticsObj1;
+	Statics *_staticsObj2;
+	int _mx;
+	int _my;
+	int _m2x;
+	int _m2y;
+	int _field_50;
+	int _counterMax;
+	int _counter;
+	CPtrList _dynamicPhases;
+	int _field_78;
+	int _framePosOffsets;
+	int _currMovementObj;
+	int _field_84;
+	DynamicPhase *_currDynamicPhase;
+	int _field_8C;
+	int _currDynamicPhaseIndex;
+	int _field_94;
+};
+
+class StaticANIObject : public GameObject {
+	Movement *_movementObj;
+	Statics *_staticsObj;
+	int _shadowsOn;
+	int16 _field_30;
+	int16 _field_32;
+	int _field_34;
+	int _initialCounter;
+	int _callback1;
+	int _callback2;
+	CPtrList _movements;
+	CPtrList _staticsList;
+	CStepArray _stepArray;
+	int16 _field_96;
+	int _messageQueueId;
+	int _messageNum;
+	int _animExFlag;
+	int _counter;
+	int _someDynamicPhaseIndex;
+
+  public:
+	int16 _sceneId;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_STATICS_H */


Commit: 0b6591e4912117e730f4227975e83285583933e0
    https://github.com/scummvm/scummvm/commit/0b6591e4912117e730f4227975e83285583933e0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Continued work on scene loading

Changed paths:
  A engines/fullpipe/gfx.cpp
  A engines/fullpipe/statics.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.h
    engines/fullpipe/module.mk
    engines/fullpipe/motion.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/statics.h
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
new file mode 100644
index 0000000..26f7f3e
--- /dev/null
+++ b/engines/fullpipe/gfx.cpp
@@ -0,0 +1,200 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+
+namespace Fullpipe {
+
+Background::Background() {
+	_x = 0;
+	_y = 0;
+	_messageQueueId = 0;
+	_bigPictureArray1Count = 0;
+	_bigPictureArray2Count = 0;
+	_bigPictureArray = 0;
+}
+
+bool Background::load(MfcArchive &file) {
+	_stringObj = file.readPascalString();
+
+	int count = file.readUint16LE();
+
+	for (int i = 0; i < count; i++) {
+		PictureObject *pct = new PictureObject();
+
+		pct->load(file, i == 0);
+		addPictureObject(pct);
+	}
+
+	assert(g_fullpipe->_gameProjectVersion >= 4);
+
+	_bigPictureArray1Count = file.readUint32LE();
+
+	assert(g_fullpipe->_gameProjectVersion >= 5);
+
+	_bigPictureArray2Count = file.readUint32LE();
+
+	_bigPictureArray = (BigPicture ***)calloc(_bigPictureArray1Count, sizeof(BigPicture **));
+
+	debug(0, "bigPictureArray[%d][%d]", _bigPictureArray1Count, _bigPictureArray2Count);
+
+	for (int i = 0; i < _bigPictureArray1Count; i++) {
+		_bigPictureArray[i] = (BigPicture **)calloc(_bigPictureArray2Count, sizeof(BigPicture *));
+		for (int j = 0; j < _bigPictureArray2Count; j++) {
+		  _bigPictureArray[i][j] = new BigPicture();
+
+		  _bigPictureArray[i][j]->load(file);
+		}
+	}
+
+	return true;
+}
+
+void Background::addPictureObject(PictureObject *pct) {
+	warning("STUB: Background::addPictureObject");
+}
+
+PictureObject::PictureObject() {
+	_ox = 0;
+	_oy = 0;
+	_picture = 0;
+}
+
+bool PictureObject::load(MfcArchive &file, bool bigPicture) {
+	GameObject::load(file);
+
+	if (bigPicture)
+		_picture = new BigPicture();
+	else
+		_picture = new Picture();
+
+	_picture->load(file);
+
+	_pictureObject2List = new CPtrList();
+
+	int count = file.readUint16LE();
+
+	if (count > 0) {
+		GameObject *o = new GameObject();
+		
+		o->load(file);
+		_pictureObject2List->push_back(o);
+	}
+
+	_ox2 = _ox;
+	_oy2 = _oy;
+
+	return true;
+}
+
+GameObject::GameObject() {
+	_field_4 = 0;
+	_flags = 0;
+	_id = 0;
+	_ox = 0;
+	_oy = 0;
+	_priority = 0;
+	_field_20 = 0;
+	_field_8 = 0;
+}
+
+bool GameObject::load(MfcArchive &file) {
+	_field_4 = 0;
+	_flags = 0;
+	_field_20 = 0;
+	
+	_id = file.readUint16LE();
+	
+	_stringObj = file.readPascalString();
+	_ox = file.readUint32LE();
+	_oy = file.readUint32LE();
+	_priority = file.readUint16LE();
+
+	if (g_fullpipe->_gameProjectVersion >= 11) {
+	  _field_8 = file.readUint32LE();
+	}
+
+	return true;
+}
+
+Picture::Picture() {
+	_x = 0;
+	_y = 0;
+	_field_44 = 0;
+	_field_54 = 0;
+	_bitmap = 0;
+	_alpha = -1;
+	_paletteData = 0;
+	_convertedBitmap = 0;
+}
+
+bool Picture::load(MfcArchive &file) {
+	MemoryObject::load(file);
+
+	_x = file.readUint32LE();
+	_y = file.readUint32LE();
+	_field_44 = file.readUint16LE();
+	
+	assert(g_fullpipe->_gameProjectVersion >= 2);
+
+	_width = file.readUint32LE();
+	_height = file.readUint32LE();
+
+	_flags |= 1;
+
+	_memoryObject2 = new MemoryObject2;
+	_memoryObject2->load(file);
+
+	if (_memoryObject2->_data) {
+		setAOIDs();
+	}
+
+	assert (g_fullpipe->_gameProjectVersion >= 12);
+
+	_alpha = file.readUint32LE();
+
+	int havePal = file.readUint32LE();
+
+	if (havePal > 0) {
+		_paletteData = (byte *)calloc(1024, 1);
+		file.read(_paletteData, 1024);
+	}
+
+	return true;
+}
+
+void Picture::setAOIDs() {
+	warning("STUB: Picture::setAOIDs()");
+}
+
+BigPicture::BigPicture() {
+}
+
+bool BigPicture::load(MfcArchive &file) {
+	Picture::load(file);
+
+	return true;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 6df8e7b..ae06910 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -57,8 +57,7 @@ class BigPicture : public Picture {
 };
 
 class GameObject : public CObject {
-	friend class PictureObject;
-
+  protected:
 	int16 _field_4;
 	int16 _field_6;
 	int _field_8;
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 5f0131b..fadadd5 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -44,8 +44,7 @@ struct InventoryPoolItem {
 typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
 
 class CInventory : public CObject {
-	friend class CInventory2;
-
+ protected:
 	int16 _sceneId;
 	int16 _field_6;
 	InventoryPoolItems _itemsPool;
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index a64727a..77dcfaa 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -9,6 +9,7 @@ MODULE_OBJS = \
 	ngiarchive.o \
 	scene.o \
 	stateloader.o \
+	statics.o \
 	utils.o
 
 # This module can be built as a plugin
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index fb7b454..39fadbe 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -52,20 +52,20 @@ class CMctlCompound : public CMotionController {
 };
 
 class Unk2 : public CObject {
-  int _items;
-  int _count;
+	int _items;
+	int _count;
 
  public:
 	Unk2() : _items(0), _count(0) {}
 };
 
 class CMovGraphNode : public CObject {
-  int _x;
-  int _y;
-  int _distance;
-  int16 _field_10;
-  int16 _field_12;
-  int _field_14;
+	int _x;
+	int _y;
+	int _distance;
+	int16 _field_10;
+	int16 _field_12;
+	int _field_14;
 
   public:
 	CMovGraphNode() : _x(0), _y(0), _distance(0), _field_10(0), _field_14(0) {}
@@ -73,7 +73,7 @@ class CMovGraphNode : public CObject {
 };
 
 class CMovGraphReact : public CObject {
-    // Empty
+	// Empty
 };
 
 class CMctlCompoundArrayItem : public CMotionController {
@@ -87,64 +87,64 @@ class CMctlCompoundArrayItem : public CMotionController {
 	int _field_28;
 
  public:
-  CMctlCompoundArrayItem() : _movGraphReactObj(0) {}
+	CMctlCompoundArrayItem() : _movGraphReactObj(0) {}
 };
 
 class CReactParallel : public CMovGraphReact {
-    //CRgn _rgn;
-    int _x1;
-    int _y1;
-    int _x2;
-    int _y2;
-    int _dx;
-    int _dy;
-    Common::Point **_points;
+	//CRgn _rgn;
+	int _x1;
+	int _y1;
+	int _x2;
+	int _y2;
+	int _dx;
+	int _dy;
+	Common::Point **_points;
 
   public:
-    CReactParallel();
-    virtual bool load(MfcArchive &file);
-    void createRegion();
+	CReactParallel();
+	virtual bool load(MfcArchive &file);
+	void createRegion();
 };
 
 class CReactPolygonal : public CMovGraphReact {
-    //CRgn _rgn;
-    int _field_C;
-    int _field_10;
-    int _pointCount;
-    Common::Point **_points;
+	//CRgn _rgn;
+	int _field_C;
+	int _field_10;
+	int _pointCount;
+	Common::Point **_points;
 
   public:
-    CReactPolygonal();
-    virtual bool load(MfcArchive &file);
-    void createRegion();
+	CReactPolygonal();
+	virtual bool load(MfcArchive &file);
+	void createRegion();
 };
 
 class CMovGraphLink : public CObject {
-    CMovGraphNode *_movGraphNode1;
-    CMovGraphNode *_movGraphNode2;
-    CDWordArray _dwordArray1;
-    CDWordArray _dwordArray2;
-    int _flags;
-    int _field_38;
-    int _field_3C;
-    double _distance;
-    double _angle;
-    CMovGraphReact *_movGraphReact;
-    char *_name;
+	CMovGraphNode *_movGraphNode1;
+	CMovGraphNode *_movGraphNode2;
+	CDWordArray _dwordArray1;
+	CDWordArray _dwordArray2;
+	int _flags;
+	int _field_38;
+	int _field_3C;
+	double _distance;
+	double _angle;
+	CMovGraphReact *_movGraphReact;
+	char *_name;
 
   public:
-    CMovGraphLink();
-    virtual bool load(MfcArchive &file);
+	CMovGraphLink();
+	virtual bool load(MfcArchive &file);
 };
 
 class CMovGraph : public CMotionController {
-  CObList _nodes;
-  CObList _links;
-  int _field_44;
-  int _items;
-  int _itemsCount;
-  int (*_callback1)(int, int, int);
-  Unk2 _unk2;
+	CObList _nodes;
+	CObList _links;
+	int _field_44;
+	int _items;
+	int _itemsCount;
+	int (*_callback1)(int, int, int);
+	Unk2 _unk2;
 
  public:
 	CMovGraph();
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 7b74c18..238d605 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -113,8 +113,6 @@ Scene::Scene() {
 }
 
 bool Scene::load(MfcArchive &file) {
-	warning("STUB: Scene::load");
-
 	_bg.load(file);
 
 	_sceneId = file.readUint16LE();
@@ -141,9 +139,10 @@ bool Scene::load(MfcArchive &file) {
 
 		delete f;
 		free(aniname);
+	}
 
+	warning("STUB: Scene::load");
 
-	}
 	return true;
 }
 
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
new file mode 100644
index 0000000..5db1154
--- /dev/null
+++ b/engines/fullpipe/statics.cpp
@@ -0,0 +1,114 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/ngiarchive.h"
+#include "fullpipe/statics.h"
+
+namespace Fullpipe {
+
+StaticANIObject::StaticANIObject() {
+	_shadowsOn = 1;
+	_field_30 = 0;
+	_field_34 = 1;
+	_initialCounter = 0;
+	_messageQueueId = 0;
+	_animExFlag = 0;
+	_counter = 0;
+	_movementObj = 0;
+	_staticsObj = 0;
+	_flags = 0;
+	_callback1 = 0;
+	_callback2 = 0;
+	_sceneId = -1;
+	_someDynamicPhaseIndex = -1;
+}
+
+bool StaticANIObject::load(MfcArchive &file) {
+	GameObject::load(file);
+
+	int count = file.readUint16LE();
+
+	for (int i = 0; i < count; i++) {
+		Statics *st = new Statics();
+	  
+		st->load(file);
+		_staticsList.push_back(st);
+	}
+
+	count = file.readUint16LE();
+
+	for (int i = 0; i < count; i++) {
+	  	int movNum = file.readUint16LE();
+
+		char *movname = genFileName(_id, movNum, "mov");
+
+		Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(movname);
+
+		Movement *mov = new Movement();
+
+		MfcArchive archive(f);
+
+		mov->load(archive, this);
+
+		_movements.push_back(mov);
+
+		delete f;
+		free(movname);
+	}
+
+	Common::Point pt;
+	if (count) { // We have movements
+		((Movement *)_movements[0])->getCurrDynamicPhaseXY(pt);
+	} else {
+		pt.x = pt.y = 100;
+	}
+
+	setOXY(pt.x, pt.y);
+
+	return true;
+}
+
+void StaticANIObject::setOXY(int x, int y) {
+}
+
+Movement::Movement() {
+}
+
+bool Movement::load(MfcArchive &file) {
+	warning("STUB: Movement::load");
+	return true;
+}
+bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
+	return true;
+}
+
+Common::Point *Movement::getCurrDynamicPhaseXY(Common::Point &p) {
+	p.x = _currDynamicPhase->_x;
+	p.y = _currDynamicPhase->_y;
+
+	return &p;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index ef4f2a5..82c24eb 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -42,8 +42,10 @@ class StaticPhase : public Picture {
 };
 
 class DynamicPhase : public StaticPhase {
-	int _someX;
-	int _someY;
+	friend class Movement;
+
+	int _x;
+	int _y;
 	Common::Rect *_rectPtr;
 	int16 _field_7C;
 	int16 _field_7E;
@@ -57,6 +59,8 @@ class Statics : public DynamicPhase {
 	int _picture;
 };
 
+class StaticANIObject;
+
 class Movement : public GameObject {
 	int _field_24;
 	int _field_28;
@@ -74,13 +78,20 @@ class Movement : public GameObject {
 	int _counter;
 	CPtrList _dynamicPhases;
 	int _field_78;
-	int _framePosOffsets;
+	Common::Point *_framePosOffsets;
 	int _currMovementObj;
 	int _field_84;
 	DynamicPhase *_currDynamicPhase;
 	int _field_8C;
 	int _currDynamicPhaseIndex;
 	int _field_94;
+
+  public:
+	Movement();
+	virtual bool load(MfcArchive &file);
+	bool load(MfcArchive &file, StaticANIObject *ani);
+
+	Common::Point *getCurrDynamicPhaseXY(Common::Point &p);
 };
 
 class StaticANIObject : public GameObject {
@@ -105,6 +116,11 @@ class StaticANIObject : public GameObject {
 
   public:
 	int16 _sceneId;
+
+  public:
+	StaticANIObject();
+	virtual bool load(MfcArchive &file);
+	void setOXY(int x, int y);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index bb9ed89..94fdf4b 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -78,9 +78,9 @@ class CObList : public Common::List<CObject>, public CObject {
 };
 
 class MemoryObject : CObject {
-	friend class MemoryObject2;
 	friend class Picture;
 
+ protected:
 	char *_filename;
 	int _field_8;
 	int _field_C;


Commit: 1c1d8db613fccbab568efd1e57a86a419dc813c9
    https://github.com/scummvm/scummvm/commit/1c1d8db613fccbab568efd1e57a86a419dc813c9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Now StaticANIObject is loaded fully

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 26f7f3e..8b801a7 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -57,7 +57,7 @@ bool Background::load(MfcArchive &file) {
 
 	_bigPictureArray = (BigPicture ***)calloc(_bigPictureArray1Count, sizeof(BigPicture **));
 
-	debug(0, "bigPictureArray[%d][%d]", _bigPictureArray1Count, _bigPictureArray2Count);
+	debug(6, "bigPictureArray[%d][%d]", _bigPictureArray1Count, _bigPictureArray2Count);
 
 	for (int i = 0; i < _bigPictureArray1Count; i++) {
 		_bigPictureArray[i] = (BigPicture **)calloc(_bigPictureArray2Count, sizeof(BigPicture *));
@@ -138,6 +138,11 @@ bool GameObject::load(MfcArchive &file) {
 	return true;
 }
 
+void GameObject::setOXY(int x, int y) {
+	_ox = x;
+	_oy = y;
+}
+
 Picture::Picture() {
 	_x = 0;
 	_y = 0;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index ae06910..7b304ea 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -31,6 +31,8 @@ class ShadowsItemArray : public Common::Array<CObject>, public CObject {
 };
 
 class Picture : public MemoryObject {
+	friend class Movement;
+
 	Common::Rect _rect;
 	int _convertedBitmap;
 	int _x;
@@ -57,7 +59,7 @@ class BigPicture : public Picture {
 };
 
 class GameObject : public CObject {
-  protected:
+  public:
 	int16 _field_4;
 	int16 _field_6;
 	int _field_8;
@@ -72,6 +74,7 @@ class GameObject : public CObject {
   public:
 	GameObject();
 	virtual bool load(MfcArchive &file);
+	void setOXY(int x, int y);
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 5db1154..04aa8cf 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -25,6 +25,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/gameobj.h"
 
 namespace Fullpipe {
 
@@ -58,6 +59,7 @@ bool StaticANIObject::load(MfcArchive &file) {
 	}
 
 	count = file.readUint16LE();
+	debug(7, "Movements: %d", count);
 
 	for (int i = 0; i < count; i++) {
 	  	int movNum = file.readUint16LE();
@@ -91,9 +93,75 @@ bool StaticANIObject::load(MfcArchive &file) {
 }
 
 void StaticANIObject::setOXY(int x, int y) {
+	_ox = x;
+	_oy = y;
+	
+	if (_movementObj)
+		_movementObj->setOXY(x, y);
+}
+
+Statics *StaticANIObject::getStaticsById(int itemId) {
+	for (uint i = 0; i < _staticsList.size(); i++)
+		if (((Statics *)_staticsList[i])->_staticsId == itemId)
+			return (Statics *)_staticsList[i];
+
+	return 0;
+}
+
+Movement *StaticANIObject::getMovementById(int itemId) {
+	for (uint i = 0; i < _movements.size(); i++)
+		if (((Movement *)_movements[i])->_id == itemId)
+			return (Movement *)_movements[i];
+
+	return 0;
+}
+
+Statics *StaticANIObject::addStatics(Statics *ani) {
+	warning("STUB: StaticANIObject::addStatics");
+
+	return 0;
+}
+
+Statics::Statics() {
+	_staticsId = 0;
+	_picture = 0;
+}
+
+bool Statics::load(MfcArchive &file) {
+	DynamicPhase::load(file);
+
+	_staticsId = file.readUint16LE();
+
+	_stringObj = file.readPascalString();
+	debug(7, "statics: <%s>", _stringObj);
+
+	_picture = new Picture();
+	_picture->load(file);
+
+	return true;
 }
 
 Movement::Movement() {
+	_lastFrameSpecialFlag = 0;
+	_flipFlag = 0;
+	_updateFlag1 = 0;
+	_staticsObj1 = 0;
+	_staticsObj2 = 0;
+	_mx = 0;
+	_my = 0;
+	_m2x = 0;
+	_m2y = 0;
+	_field_50 = 1;
+	_field_78 = 0;
+	_framePosOffsets = 0;
+	_field_84 = 0;
+	_currDynamicPhase = 0;
+	_field_8C = 0;
+	_currDynamicPhaseIndex = 0;
+	_field_94 = 0;
+	_currMovementObj = 0;
+	_counter = 0;
+	_counterMax = 83;
 }
 
 bool Movement::load(MfcArchive &file) {
@@ -101,6 +169,84 @@ bool Movement::load(MfcArchive &file) {
 	return true;
 }
 bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
+	GameObject::load(file);
+
+	int dynCount = file.readUint16LE();
+
+	debug(7, "dynCount: %d  _id: %d", dynCount, _id);
+	if (dynCount != 0xffff || _id == MV_MAN_TURN_LU) {
+		_framePosOffsets = (Common::Point **)calloc(dynCount + 2, sizeof(Common::Point *));
+
+		for (int i = 0; i < dynCount + 2; i++)
+			_framePosOffsets[i] = new Common::Point();
+
+		for (int i = 0; i < dynCount; i++) {
+			DynamicPhase *ph = new DynamicPhase();
+			ph->load(file);
+
+			_dynamicPhases.push_back(ph);
+
+			_framePosOffsets[i]->x = ph->_x;
+			_framePosOffsets[i]->y = ph->_y;
+		}
+
+		int staticsid = file.readUint16LE();
+
+		_staticsObj1 = ani->getStaticsById(staticsid);
+
+		if (!_staticsObj1 && (staticsid & 0x4000)) {
+			Statics *s = ani->getStaticsById(staticsid ^ 0x4000);
+			_staticsObj1 = ani->addStatics(s);
+		}
+
+		_mx = file.readUint32LE();
+		_my = file.readUint32LE();
+
+		staticsid = file.readUint16LE();
+
+		_staticsObj2 = ani->getStaticsById(staticsid);
+
+		if (!_staticsObj2 && (staticsid & 0x4000)) {
+			Statics *s = ani->getStaticsById(staticsid ^ 0x4000);
+			_staticsObj2 = ani->addStatics(s);
+		}
+
+		_m2x = file.readUint32LE();
+		_m2y = file.readUint32LE();
+
+		if (_staticsObj2) {
+			_dynamicPhases.push_back(_staticsObj2);
+
+			_framePosOffsets[_dynamicPhases.size() - 1]->x = _m2x;
+			_framePosOffsets[_dynamicPhases.size() - 1]->y = _m2y;
+		}
+
+	} else {
+		int movid = file.readUint16LE();
+
+		_currMovementObj = ani->getMovementById(movid);
+		_staticsObj1 = 0;
+		_staticsObj2 = 0;
+
+		initStatics(ani);
+	}
+
+	if (_staticsObj1 && _staticsObj2) {
+		if ((_staticsObj1->_staticsId ^ _staticsObj2->_staticsId) & 0x4000)
+			_flipFlag = 1;
+	}
+
+	if (g_fullpipe->_gameProjectVersion >= 8)
+		_field_50 = file.readUint32LE();
+
+	if (g_fullpipe->_gameProjectVersion < 12)
+		_counterMax = 83;
+	else
+		_counterMax = file.readUint32LE();
+
+	_counter = 0;
+	updateCurrDynamicPhase();
+
 	return true;
 }
 
@@ -111,4 +257,72 @@ Common::Point *Movement::getCurrDynamicPhaseXY(Common::Point &p) {
 	return &p;
 }
 
+void Movement::initStatics(StaticANIObject *ani) {
+	warning("STUB: Movement::initStatics");
+}
+
+void Movement::updateCurrDynamicPhase() {
+	if (_dynamicPhases.size() == 0)
+		return;
+
+	if (_dynamicPhases[_currDynamicPhaseIndex]) {
+		_currDynamicPhase = (DynamicPhase *)_dynamicPhases[_currDynamicPhaseIndex];
+	}
+}
+
+DynamicPhase::DynamicPhase() {
+	_someX = 0;
+	_rect = 0;
+	_field_7C = 0;
+	_flags = 0;
+	_someY = 0;
+}
+
+bool DynamicPhase::load(MfcArchive &file) {
+	StaticPhase::load(file);
+
+	_field_7C = file.readUint16LE();
+	_rect = new Common::Rect();
+	_rect->left = file.readUint32LE();
+	_rect->top = file.readUint32LE();
+	_rect->right = file.readUint32LE();
+	_rect->bottom = file.readUint32LE();
+
+	assert (g_fullpipe->_gameProjectVersion >= 1);
+
+	_someX = file.readUint32LE();
+	_someY = file.readUint32LE();
+
+	assert (g_fullpipe->_gameProjectVersion >= 12);
+
+	_flags = file.readUint32LE();
+
+	return true;
+}
+
+StaticPhase::StaticPhase() {
+	_field_6A = 1;
+	_initialCountdown = 0;
+	_countdown = 0;
+	_field_68 = 0;
+	_exCommand = 0;
+}
+
+bool StaticPhase::load(MfcArchive &file) {
+	Picture::load(file);
+
+	_initialCountdown = file.readUint16LE();
+	_field_6A = file.readUint16LE();
+	
+	if (g_fullpipe->_gameProjectVersion >= 12) {
+		_exCommand = (ExCommand *)file.readClass();
+
+		return true;
+	}
+
+	assert (g_fullpipe->_gameProjectVersion >= 12);
+
+	return true;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 82c24eb..7c52e18 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -38,25 +38,41 @@ class StaticPhase : public Picture {
 	int16 _countdown;
 	int16 _field_68;
 	int16 _field_6A;
-	int _exCommand;
+	ExCommand *_exCommand;
+
+  public:
+	StaticPhase();
+	virtual bool load(MfcArchive &file);
 };
 
 class DynamicPhase : public StaticPhase {
 	friend class Movement;
 
-	int _x;
-	int _y;
-	Common::Rect *_rectPtr;
+	int _someX;
+	int _someY;
+	Common::Rect *_rect;
 	int16 _field_7C;
 	int16 _field_7E;
 	int _flags;
+
+  public:
+	DynamicPhase();
+	virtual bool load(MfcArchive &file);
 };
 
 class Statics : public DynamicPhase {
+	friend class StaticANIObject;
+	friend class Movement;
+
  	int16 _staticsId;
 	int16 _field_86;
 	char *_stringObj;
-	int _picture;
+	Picture *_picture;
+
+  public:
+	Statics();
+	virtual bool load(MfcArchive &file);
+	Statics *getStaticsById(int itemId);
 };
 
 class StaticANIObject;
@@ -78,8 +94,8 @@ class Movement : public GameObject {
 	int _counter;
 	CPtrList _dynamicPhases;
 	int _field_78;
-	Common::Point *_framePosOffsets;
-	int _currMovementObj;
+	Common::Point **_framePosOffsets;
+	Movement *_currMovementObj;
 	int _field_84;
 	DynamicPhase *_currDynamicPhase;
 	int _field_8C;
@@ -92,6 +108,9 @@ class Movement : public GameObject {
 	bool load(MfcArchive &file, StaticANIObject *ani);
 
 	Common::Point *getCurrDynamicPhaseXY(Common::Point &p);
+
+	void initStatics(StaticANIObject *ani);
+	void updateCurrDynamicPhase();
 };
 
 class StaticANIObject : public GameObject {
@@ -120,7 +139,12 @@ class StaticANIObject : public GameObject {
   public:
 	StaticANIObject();
 	virtual bool load(MfcArchive &file);
+
 	void setOXY(int x, int y);
+	Statics *getStaticsById(int id);
+	Movement *getMovementById(int id);
+
+	Statics *addStatics(Statics *ani);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 0462c4e..5b6c972 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -358,6 +358,8 @@ char *genFileName(int superId, int sceneId, const char *ext) {
 		snprintf(s, 255, "%04d.%s", sceneId, ext);
 	}
 
+	debug(7, "genFileName: %s", s);
+
 	return s;
 }
 


Commit: 68c5cfdf2c35d82b506dd4fc0c4335608a22a404
    https://github.com/scummvm/scummvm/commit/68c5cfdf2c35d82b506dd4fc0c4335608a22a404
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Continued Scene loading

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 8b801a7..0305a00 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -33,6 +33,8 @@ Background::Background() {
 	_bigPictureArray1Count = 0;
 	_bigPictureArray2Count = 0;
 	_bigPictureArray = 0;
+	_stringObj = 0;
+	_colorMemoryObj = 0;
 }
 
 bool Background::load(MfcArchive &file) {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 7b304ea..53c10ee 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -89,12 +89,13 @@ class PictureObject : public GameObject {
 };
 
 class Background : public CObject {
+  protected:
 	CPtrList _list;
 	char *_stringObj;
 	int _x;
 	int _y;
 	int16 _messageQueueId;
-	int _colorMemoryObj;
+	MemoryObject *_colorMemoryObj;
 	int _bigPictureArray1Count;
 	int _bigPictureArray2Count;
 	BigPicture ***_bigPictureArray;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 238d605..af031db 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -113,14 +113,15 @@ Scene::Scene() {
 }
 
 bool Scene::load(MfcArchive &file) {
-	_bg.load(file);
+	Background::load(file);
 
 	_sceneId = file.readUint16LE();
 	
-	_stringObj = file.readPascalString();
-	debug(0, "scene: <%s>", _stringObj);
+	_scstringObj = file.readPascalString();
+	debug(0, "scene: <%s>", _scstringObj);
 
 	int count = file.readUint16LE();
+	debug(7, "scene.ani: %d", count);
 
 	for (int i = 0; i < count; i++) {
 		int aniNum = file.readUint16LE();
@@ -141,7 +142,52 @@ bool Scene::load(MfcArchive &file) {
 		free(aniname);
 	}
 
-	warning("STUB: Scene::load");
+	count = file.readUint16LE();
+	debug(7, "scene.mq: %d", count);
+
+	for (int i = 0; i < count; i++) {
+		int qNum = file.readUint16LE();
+		char *qname = genFileName(0, qNum, "qu");
+
+		Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(qname);
+		MfcArchive archive(f);
+
+		MessageQueue *mq = new MessageQueue();
+
+		mq->load(archive);
+
+		_messageQueueList.push_back(mq);
+
+		delete f;
+		free(qname);
+	}
+
+	count = file.readUint16LE();
+	debug(7, "scene.fa: %d", count);
+
+	for (int i = 0; i < count; i++) {
+		// There are no .FA files
+		assert(0);
+	}
+
+	_libHandle = g_fullpipe->_currArchive;
+
+	if (_list.size() > 0 && _stringObj && strlen(_stringObj) > 1) {
+		char fname[260];
+
+		strcpy(fname, _stringObj);
+		strcpy(strrchr(fname, '.') + 1, "col");
+
+		MemoryObject *col =  new MemoryObject();
+		col->loadFile(fname);
+
+		_colorMemoryObj = col;
+	  
+	}
+
+	char *shdname = genFileName(0, _sceneId, "shd");
+
+	warning("STUB: Scene::load  (%d bytes left)", file.size() - file.pos());
 
 	return true;
 }
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 1c7a9fd..31af782 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -25,7 +25,7 @@
 
 namespace Fullpipe {
 
-class Scene : public CObject {
+class Scene : public Background {
 	Background _bg;
 	CPtrList _staticANIObjectList1;
 	CPtrList _staticANIObjectList2;
@@ -34,9 +34,9 @@ class Scene : public CObject {
 	Shadows *_shadows;
 	int _soundList;
 	int16 _sceneId;
-	char *_stringObj;
+	char *_scstringObj;
 	int _field_BC;
-	int _libHandle;
+	NGIArchive *_libHandle;
 
   public:
 	Scene();
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 5b6c972..ff3cd71 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -136,7 +136,6 @@ void MemoryObject::loadFile(char *filename) {
 		Common::SeekableReadStream *s = _libHandle->createReadStreamForMember(filename);
 
 		if (s) {
-			debug(0, "Reading %s", filename);
 			assert(s->size() > 0);
 			_data = calloc(s->size(), 1);
 			s->read(_data, s->size());


Commit: 00971bf2092c5e9c33d5475bb91075d2bcc32557
    https://github.com/scummvm/scummvm/commit/00971bf2092c5e9c33d5475bb91075d2bcc32557
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Shadows loading

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 0305a00..79a1e1d 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -204,4 +204,19 @@ bool BigPicture::load(MfcArchive &file) {
 	return true;
 }
 
+Shadows::Shadows() {
+	_staticAniObjectId = 0;
+	_movementId = 0;
+	_sceneId = 0;
+}
+
+bool Shadows::load(MfcArchive &file) {
+	_sceneId = file.readUint32LE();
+	_staticAniObjectId = file.readUint32LE();
+	_movementId = file.readUint32LE();
+
+	return true;
+}
+
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 53c10ee..edf884d 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -25,9 +25,8 @@
 
 namespace Fullpipe {
 
-class ShadowsItemArray : public Common::Array<CObject>, public CObject {
- public:
-	virtual bool load(MfcArchive &file);
+class ShadowsItemArray : public CObArray {
+	// empty
 };
 
 class Picture : public MemoryObject {
@@ -106,12 +105,15 @@ class Background : public CObject {
 	void addPictureObject(PictureObject *pct);
 };
 
-class Shadows {
-	//CObject obj;
-	int sceneId;
-	int staticAniObjectId;
-	int movementId;
-	ShadowsItemArray items;
+class Shadows : public CObject {
+	int _sceneId;
+	int _staticAniObjectId;
+	int _movementId;
+	ShadowsItemArray _items;
+
+  public:
+	Shadows();
+	virtual bool load(MfcArchive &file);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index af031db..0a79ef5 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -187,6 +187,11 @@ bool Scene::load(MfcArchive &file) {
 
 	char *shdname = genFileName(0, _sceneId, "shd");
 
+	Shadows *shd = new Shadows();
+
+	if (shd->loadFile(shdname))
+		_shadows = shd;
+
 	warning("STUB: Scene::load  (%d bytes left)", file.size() - file.pos());
 
 	return true;


Commit: 5f7cf0131c95c165db8ce5b1933917e4da037845
    https://github.com/scummvm/scummvm/commit/5f7cf0131c95c165db8ce5b1933917e4da037845
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:15-07:00

Commit Message:
FULLPIPE: Started sound loading

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/module.mk
    engines/fullpipe/objects.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index c43e14b..a6a52bb 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -46,6 +46,14 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 
 	_rnd = new Common::RandomSource("fullpipe");
 
+	_gameProjectVersion = 0;
+	_gameProjectValue = 0;
+	_scrollSpeed = 0;
+	_currSoundListCount = 0;
+
+	_soundEnabled = true;
+	_flgSoundList = true;
+
 	g_fullpipe = this;
 }
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 013303d..d6b38f2 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -81,6 +81,8 @@ public:
 	int _gameProjectValue;
 	int _scrollSpeed;
 	int _currSoundListCount;
+	bool _soundEnabled;
+	bool _flgSoundList;
 
 	void initObjectStates();
 	void setLevelStates();
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 77dcfaa..1b115a3 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -8,6 +8,7 @@ MODULE_OBJS = \
 	motion.o \
 	ngiarchive.o \
 	scene.o \
+	sound.o \
 	stateloader.o \
 	statics.o \
 	utils.o
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index c12905e..52383cc 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -26,6 +26,7 @@
 #include "fullpipe/utils.h"
 #include "fullpipe/inventory.h"
 #include "fullpipe/gfx.h"
+#include "fullpipe/sound.h"
 #include "fullpipe/scene.h"
 
 namespace Fullpipe {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 0a79ef5..3dc98bf 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -192,9 +192,35 @@ bool Scene::load(MfcArchive &file) {
 	if (shd->loadFile(shdname))
 		_shadows = shd;
 
+	free(shdname);
+
+	char *slsname = genFileName(0, _sceneId, "sls");
+
+	if (g_fullpipe->_soundEnabled) {
+		_soundList = new SoundList();
+
+		if (g_fullpipe->_flgSoundList) {
+			char *nlname = genFileName(17, _sceneId, "nl");
+		  
+			_soundList->loadFile(slsname, nlname);
+
+			free(nlname);
+		} else {
+			_soundList->loadFile(slsname, 0);
+		}
+	}
+
+	free(slsname);
+
+	initStaticANIObjects();
+
 	warning("STUB: Scene::load  (%d bytes left)", file.size() - file.pos());
 
 	return true;
 }
 
+void Scene::initStaticANIObjects() {
+	warning("STUB: Scene::initStaticANIObjects");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 31af782..a797c69 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -32,7 +32,7 @@ class Scene : public Background {
 	CPtrList _messageQueueList;
 	CPtrList _faObjectList;
 	Shadows *_shadows;
-	int _soundList;
+	SoundList *_soundList;
 	int16 _sceneId;
 	char *_scstringObj;
 	int _field_BC;
@@ -41,6 +41,7 @@ class Scene : public Background {
   public:
 	Scene();
 	virtual bool load(MfcArchive &file);
+	void initStaticANIObjects();
 };
 
 class SceneTag : public CObject {


Commit: 679c46a5bff2234b234190ecb6ed34c483c74420
    https://github.com/scummvm/scummvm/commit/679c46a5bff2234b234190ecb6ed34c483c74420
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:16-07:00

Commit Message:
FULLPIPE: Finished sound loading

Changed paths:
  A engines/fullpipe/sound.cpp
  A engines/fullpipe/sound.h



diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
new file mode 100644
index 0000000..bdbc8da
--- /dev/null
+++ b/engines/fullpipe/sound.cpp
@@ -0,0 +1,100 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/ngiarchive.h"
+
+namespace Fullpipe {
+
+SoundList::SoundList() {
+	_soundItems = 0;
+	_soundItemsCount = 0;
+	_libHandle = 0;
+}
+
+bool SoundList::load(MfcArchive &file, char *fname) {
+	_soundItemsCount = file.readUint32LE();
+	_soundItems = (Sound **)calloc(_soundItemsCount, sizeof(Sound *));
+
+	if (fname) {
+	  _libHandle = (NGIArchive *)makeNGIArchive(fname);
+	} else {
+		_libHandle = 0;
+	}
+
+	for (int i = 0; i < _soundItemsCount; i++) {
+		Sound *snd = new Sound();
+
+		_soundItems[i] = 0;
+		snd->load(file, _libHandle);
+	}
+
+	return true;
+	
+}
+
+bool SoundList::loadFile(const char *fname, char *libname) {
+	Common::File file;
+
+	if (!file.open(fname))
+		return false;
+
+	MfcArchive archive(&file);
+
+	return load(archive, libname);
+}
+
+Sound::Sound() {
+	_id = 0;
+	_directSoundBuffer = 0;
+	_soundData = 0;
+	_objectId = 0;
+	 memset(_directSoundBuffers, 0, sizeof(_directSoundBuffers));
+}
+
+
+bool Sound::load(MfcArchive &file, NGIArchive *archive) {
+	MemoryObject::load(file);
+
+	_id = file.readUint32LE();
+	_description = file.readPascalString();
+
+	assert(g_fullpipe->_gameProjectVersion >= 6);
+
+	_objectId = file.readUint16LE();
+
+	if (archive && archive->hasFile(_filename)) {
+		Common::SeekableReadStream *s = archive->createReadStreamForMember(_filename);
+
+		_soundData = (byte *)calloc(s->size(), 1);
+
+		s->read(_soundData, s->size());
+
+		delete s;
+	}
+
+	return true;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.h b/engines/fullpipe/sound.h
new file mode 100644
index 0000000..4585aa7
--- /dev/null
+++ b/engines/fullpipe/sound.h
@@ -0,0 +1,55 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_SOUND_H
+#define FULLPIPE_SOUND_H
+
+namespace Fullpipe {
+
+class Sound : public MemoryObject {
+	int _id;
+	char *_description;
+	int16 _objectId;
+	int16 _field_32;
+	int _directSoundBuffer;
+	int _directSoundBuffers[7];
+	byte *_soundData;
+
+  public:
+	Sound();
+	bool load(MfcArchive &file, NGIArchive *archive);
+};
+
+class SoundList : public CObject {
+	Sound **_soundItems;
+	int _soundItemsCount;
+	NGIArchive *_libHandle;
+
+ public:
+	SoundList();
+	bool load(MfcArchive &file, char *fname);
+	bool loadFile(const char *fname, char *libname);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_SOUND_H */


Commit: 8b50154626212d5f857701b01511ef942766d007
    https://github.com/scummvm/scummvm/commit/8b50154626212d5f857701b01511ef942766d007
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:16-07:00

Commit Message:
FULLPIPE: Fix loading .qu files

Checked with all scenes. Everything loads fine.

Changed paths:
    engines/fullpipe/scene.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 3dc98bf..3a9b96c 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -152,6 +152,8 @@ bool Scene::load(MfcArchive &file) {
 		Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(qname);
 		MfcArchive archive(f);
 
+		archive.readUint16LE(); // Skip 2 bytes
+
 		MessageQueue *mq = new MessageQueue();
 
 		mq->load(archive);
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index d7cc9cf..eab8bef 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -227,6 +227,8 @@ bool MessageQueue::load(MfcArchive &file) {
 
 	int count = file.readUint16LE();
 
+	assert(g_fullpipe->_gameProjectVersion >= 12);
+
 	_stringObj = file.readPascalString();
 
 	for (int i = 0; i < count; i++) {


Commit: 88b3e2744038f23d3f7d3944f4a1ead6fba69763
    https://github.com/scummvm/scummvm/commit/88b3e2744038f23d3f7d3944f4a1ead6fba69763
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:16-07:00

Commit Message:
FULLPIPE: Load all scenes for debugging purposes

Changed paths:
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index eab8bef..3c5a442 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -43,6 +43,62 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory = &_gameLoader->_inventory;
 		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
 		_inventory->addItem(ANI_INV_MAP, 1);
+
+#if 1
+		g_fullpipe->accessScene(301);
+		g_fullpipe->accessScene(302);
+		g_fullpipe->accessScene(303);
+		g_fullpipe->accessScene(304);
+		g_fullpipe->accessScene(305);
+		g_fullpipe->accessScene(321);
+		g_fullpipe->accessScene(635);
+		g_fullpipe->accessScene(649);
+		g_fullpipe->accessScene(650);
+		g_fullpipe->accessScene(651);
+		g_fullpipe->accessScene(652);
+		g_fullpipe->accessScene(653);
+		g_fullpipe->accessScene(654);
+		g_fullpipe->accessScene(655);
+		g_fullpipe->accessScene(726);
+		g_fullpipe->accessScene(858);
+		g_fullpipe->accessScene(903);
+		g_fullpipe->accessScene(1137);
+		g_fullpipe->accessScene(1138);
+		g_fullpipe->accessScene(1139);
+		g_fullpipe->accessScene(1140);
+		g_fullpipe->accessScene(1141);
+		g_fullpipe->accessScene(1142);
+		g_fullpipe->accessScene(1143);
+		g_fullpipe->accessScene(1144);
+		g_fullpipe->accessScene(1546);
+		g_fullpipe->accessScene(1547);
+		g_fullpipe->accessScene(1548);
+		g_fullpipe->accessScene(1549);
+		g_fullpipe->accessScene(1550);
+		g_fullpipe->accessScene(1551);
+		g_fullpipe->accessScene(1552);
+		g_fullpipe->accessScene(2062);
+		g_fullpipe->accessScene(2063);
+		g_fullpipe->accessScene(2064);
+		g_fullpipe->accessScene(2065);
+		g_fullpipe->accessScene(2066);
+		g_fullpipe->accessScene(2067);
+		g_fullpipe->accessScene(2068);
+		g_fullpipe->accessScene(2069);
+		g_fullpipe->accessScene(2070);
+		g_fullpipe->accessScene(2071);
+		g_fullpipe->accessScene(2072);
+		g_fullpipe->accessScene(2460);
+		g_fullpipe->accessScene(3896);
+		g_fullpipe->accessScene(3907);
+		g_fullpipe->accessScene(4620);
+		g_fullpipe->accessScene(4999);
+		g_fullpipe->accessScene(5000);
+		g_fullpipe->accessScene(5001);
+		g_fullpipe->accessScene(5166);
+		g_fullpipe->accessScene(5222);
+#endif
+
 		_inventory->rebuildItemRects();
 		// TODO
 	} else


Commit: 305692fefe567228441e6edea5225d0b4853a9f8
    https://github.com/scummvm/scummvm/commit/305692fefe567228441e6edea5225d0b4853a9f8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:16-07:00

Commit Message:
FULLPIPE: Fix MemoryObject loading

Changed paths:
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index ff3cd71..14388f7 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -129,14 +129,12 @@ bool MemoryObject::load(MfcArchive &file) {
 
 void MemoryObject::loadFile(char *filename) {
 	if (!_data) {
-		if (g_fullpipe->_currArchive != _libHandle) {
-			assert(0);
-		}
-
-		Common::SeekableReadStream *s = _libHandle->createReadStreamForMember(filename);
+		Common::SeekableReadStream *s = g_fullpipe->_currArchive->createReadStreamForMember(filename);
 
 		if (s) {
 			assert(s->size() > 0);
+
+			debug(0, "Loading %s", filename);
 			_data = calloc(s->size(), 1);
 			s->read(_data, s->size());
 


Commit: ee5dc16eaa138bfeca7f914b4314ef03bcfd7352
    https://github.com/scummvm/scummvm/commit/ee5dc16eaa138bfeca7f914b4314ef03bcfd7352
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:16-07:00

Commit Message:
FULLPIPE: Implement Background::addPictureObject

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index a6a52bb..9db96ae 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -51,6 +51,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_scrollSpeed = 0;
 	_currSoundListCount = 0;
 
+	_currArchive = 0;
+
 	_soundEnabled = true;
 	_flgSoundList = true;
 
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 79a1e1d..531bfd9 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -74,7 +74,25 @@ bool Background::load(MfcArchive &file) {
 }
 
 void Background::addPictureObject(PictureObject *pct) {
-	warning("STUB: Background::addPictureObject");
+	if (pct->_field_4)
+		renumPictures(pct);
+
+	bool inserted = false;
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		if (((PictureObject *)_picObjList[i])->_priority == pct->_priority) {
+	  		_picObjList.insert_at(i, pct);
+			inserted = true;
+			break;
+		}
+	}
+
+	if (!inserted) {
+		_picObjList.push_back(pct);
+	}
+}
+
+void Background::renumPictures(PictureObject *pct) {
+	warning("STUB: Background::renumPictures");
 }
 
 PictureObject::PictureObject() {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index edf884d..b8f6194 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -89,7 +89,7 @@ class PictureObject : public GameObject {
 
 class Background : public CObject {
   protected:
-	CPtrList _list;
+	CPtrList _picObjList;
 	char *_stringObj;
 	int _x;
 	int _y;
@@ -103,6 +103,7 @@ class Background : public CObject {
 	Background();
 	virtual bool load(MfcArchive &file);
 	void addPictureObject(PictureObject *pct);
+	void renumPictures(PictureObject *pct);
 };
 
 class Shadows : public CObject {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 3a9b96c..ee7a4dd 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -174,7 +174,7 @@ bool Scene::load(MfcArchive &file) {
 
 	_libHandle = g_fullpipe->_currArchive;
 
-	if (_list.size() > 0 && _stringObj && strlen(_stringObj) > 1) {
+	if (_picObjList.size() > 0 && _stringObj && strlen(_stringObj) > 1) {
 		char fname[260];
 
 		strcpy(fname, _stringObj);


Commit: d4e572843df01ce2307ca696ebc1db2775701205
    https://github.com/scummvm/scummvm/commit/d4e572843df01ce2307ca696ebc1db2775701205
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:16-07:00

Commit Message:
FULLPIPE: Transcode Cyrillic into UTF-8 for debugging convenience

Changed paths:
    engines/fullpipe/scene.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index ee7a4dd..fb51b3b 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -118,7 +118,7 @@ bool Scene::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 	
 	_scstringObj = file.readPascalString();
-	debug(0, "scene: <%s>", _scstringObj);
+	debug(0, "scene: <%s>", transCyrillic((byte *)_scstringObj));
 
 	int count = file.readUint16LE();
 	debug(7, "scene.ani: %d", count);
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 3c5a442..1f9b090 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -401,7 +401,7 @@ bool CGameVar::load(MfcArchive &file) {
 	for (int i = 0; i < file.getLevel(); i++)
 		debugN(6, " ");
 
-	debugN(6, "<%s>: ", _stringObj);
+	debugN(6, "<%s>: ", transCyrillic((byte *)_stringObj));
 
 	switch (_varType) {
 	case 0:
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 14388f7..0b75ab5 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -99,7 +99,7 @@ char *MfcArchive::readPascalString(bool twoByte) {
 	tmp = (char *)calloc(len + 1, 1);
 	read(tmp, len);
 
-	debug(9, "readPascalString: %d <%s>", len, tmp);
+	debug(9, "readPascalString: %d <%s>", len, transCyrillic((byte *)tmp));
 
 	return tmp;
 }
@@ -360,4 +360,50 @@ char *genFileName(int superId, int sceneId, const char *ext) {
 	return s;
 }
 
+// Translates cp-1251..utf-8
+byte *transCyrillic(byte *s) {
+	static byte tmp[1024];
+
+	static int trans[] = { 0xa8, 0xd081, 0xb8, 0xd191, 0xc0, 0xd090,
+		0xc1, 0xd091, 0xc2, 0xd092, 0xc3, 0xd093, 0xc4, 0xd094,
+		0xc5, 0xd095, 0xc6, 0xd096, 0xc7, 0xd097, 0xc8, 0xd098,
+		0xc9, 0xd099, 0xca, 0xd09a, 0xcb, 0xd09b, 0xcc, 0xd09c,
+		0xcd, 0xd09d, 0xce, 0xd09e, 0xcf, 0xd09f, 0xd0, 0xd0a0,
+		0xd1, 0xd0a1, 0xd2, 0xd0a2, 0xd3, 0xd0a3, 0xd4, 0xd0a4,
+		0xd5, 0xd0a5, 0xd6, 0xd0a6, 0xd7, 0xd0a7, 0xd8, 0xd0a8,
+		0xd9, 0xd0a9, 0xda, 0xd0aa, 0xdb, 0xd0ab, 0xdc, 0xd0ac,
+		0xdd, 0xd0ad, 0xde, 0xd0ae, 0xdf, 0xd0af, 0xe0, 0xd0b0,
+		0xe1, 0xd0b1, 0xe2, 0xd0b2, 0xe3, 0xd0b3, 0xe4, 0xd0b4,
+		0xe5, 0xd0b5, 0xe6, 0xd0b6, 0xe7, 0xd0b7, 0xe8, 0xd0b8,
+		0xe9, 0xd0b9, 0xea, 0xd0ba, 0xeb, 0xd0bb, 0xec, 0xd0bc,
+		0xed, 0xd0bd, 0xee, 0xd0be, 0xef, 0xd0bf, 0xf0, 0xd180,
+		0xf1, 0xd181, 0xf2, 0xd182, 0xf3, 0xd183, 0xf4, 0xd184,
+		0xf5, 0xd185, 0xf6, 0xd186, 0xf7, 0xd187, 0xf8, 0xd188,
+		0xf9, 0xd189, 0xfa, 0xd18a, 0xfb, 0xd18b, 0xfc, 0xd18c,
+       	  	0xfd, 0xd18d, 0xfe, 0xd18e, 0xff, 0xd18f };
+
+	int i = 0;
+
+	for (byte *p = s; *p; p++) {
+		if (*p < 128) {
+			tmp[i++] = *p;
+		} else {
+			int j;
+			for (j = 0; trans[j]; j += 2) {
+				if (trans[j] == *p) {
+					tmp[i++] = (trans[j + 1] >> 8) & 0xff;
+					tmp[i++] = trans[j + 1] & 0xff;
+					break;
+				}
+			}
+
+			assert(trans[j]);
+		}
+	}
+
+	tmp[i] = 0;
+
+	return tmp;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 94fdf4b..4588541 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -127,6 +127,7 @@ struct CNode {
 typedef Common::Array<void *> CPtrList;
 
 char *genFileName(int superId, int sceneId, const char *ext);
+byte *transCyrillic(byte *s);
 
 } // End of namespace Fullpipe
 


Commit: cb38892ce8dbb3841b5731554e63214803109b08
    https://github.com/scummvm/scummvm/commit/cb38892ce8dbb3841b5731554e63214803109b08
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Continued on scene loading

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/objects.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 531bfd9..74037da 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -92,7 +92,21 @@ void Background::addPictureObject(PictureObject *pct) {
 }
 
 void Background::renumPictures(PictureObject *pct) {
-	warning("STUB: Background::renumPictures");
+  int *buf = (int *)calloc(_picObjList.size() + 2, sizeof(int));
+
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		if (pct->_id == ((PictureObject *)_picObjList[i])->_id)
+			buf[((PictureObject *)_picObjList[i])->_field_4] = 1;
+	}
+	
+	if (buf[pct->_field_4]) {
+		uint count;
+		for (count = 1; buf[count] && count < _picObjList.size() + 2; count++)
+			;
+		pct->_field_4 = count;
+	}
+
+	free(buf);
 }
 
 PictureObject::PictureObject() {
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 52383cc..0258ed4 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -153,6 +153,7 @@ struct EntranceInfo {
 class CMotionController;
 
 class Sc2 : public CObject {
+ public:
 	int16 _sceneId;
 	int16 _field_2;
 	Scene *_scene;
@@ -254,6 +255,10 @@ class CGameLoader : public CObject {
 	virtual ~CGameLoader();
 
 	virtual bool load(MfcArchive &file);
+	bool loadScene(int num);
+
+	int getSceneTagBySceneId(int num, SceneTag **st);
+	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
 
 	CGameVar *_gameVar;
 	CInventory2 _inventory;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index fb51b3b..7a5d663 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -225,4 +225,8 @@ void Scene::initStaticANIObjects() {
 	warning("STUB: Scene::initStaticANIObjects");
 }
 
+void Scene::init() {
+	warning("STUB: Scene::init()");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index a797c69..e2bda17 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -42,6 +42,7 @@ class Scene : public Background {
 	Scene();
 	virtual bool load(MfcArchive &file);
 	void initStaticANIObjects();
+	void init();
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 1f9b090..17faba4 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -100,7 +100,8 @@ bool FullpipeEngine::loadGam(const char *fname) {
 #endif
 
 		_inventory->rebuildItemRects();
-		// TODO
+		
+		warning("STUB: loadGam()");
 	} else
 		return false;
 
@@ -185,6 +186,39 @@ bool CGameLoader::load(MfcArchive &file) {
 	return true;
 }
 
+bool CGameLoader::loadScene(int num) {
+	SceneTag *st;
+
+	int idx = getSceneTagBySceneId(num, &st);
+
+	if (st->_scene)
+		st->loadScene();
+
+	if (st->_scene) {
+		st->_scene->init();
+
+		applyPicAniInfos(st->_scene, _sc2array[idx]._defPicAniInfos, _sc2array[idx]._defPicAniInfosCount);
+		applyPicAniInfos(st->_scene, _sc2array[idx]._picAniInfos, _sc2array[idx]._picAniInfosCount);
+
+		_sc2array[idx]._scene = st->_scene;
+		_sc2array[idx]._isLoaded = 1;
+
+		return true;
+	}
+
+	return false;
+}
+
+int CGameLoader::getSceneTagBySceneId(int num, SceneTag **st) {
+	warning("STUB: CGameLoader::getSceneTagBySceneId()");
+
+	return 0;
+}
+
+void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount) {
+	warning("STUB: CGameLoader::applyPicAniInfo()");
+}
+
 GameProject::GameProject() {
 	_field_4 = 0;
 	_headerFilename = 0;


Commit: 69946ce96355e5e07ad7a21ab3eb2f2831dfc002
    https://github.com/scummvm/scummvm/commit/69946ce96355e5e07ad7a21ab3eb2f2831dfc002
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Continued scene loading

Changed paths:
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index b8f6194..6e1a3a1 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -88,8 +88,10 @@ class PictureObject : public GameObject {
 };
 
 class Background : public CObject {
-  protected:
+  public:
 	CPtrList _picObjList;
+
+  protected:
 	char *_stringObj;
 	int _x;
 	int _y;
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 877f260..47f3b0d 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -72,7 +72,7 @@ bool CInventory::setItemFlags(int itemId, int flags) {
 CInventory2::CInventory2() {
 	_selectedId = -1;
 	_field_48 = -1;
-	_sceneObj = 0;
+	_scene = 0;
 	_picture = 0;
 	_isInventoryOut = 0;
 	_isLocked = 0;
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index fadadd5..93f4755 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -88,7 +88,7 @@ class CInventory2 : public CInventory {
 	int _isInventoryOut;
 	int _isLocked;
 	int _topOffset;
-	Scene *_sceneObj;
+	Scene *_scene;
 	BigPicture *_picture;
 
  public:
@@ -96,6 +96,9 @@ class CInventory2 : public CInventory {
 	bool loadPartial(MfcArchive &file);
 	void addItem(int itemId, int value);
 	void rebuildItemRects();
+
+	Scene *getScene() { return _scene; }
+
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 17faba4..57e3921 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -44,7 +44,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
 		_inventory->addItem(ANI_INV_MAP, 1);
 
-#if 1
+#if 0
 		g_fullpipe->accessScene(301);
 		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(303);
@@ -100,6 +100,9 @@ bool FullpipeEngine::loadGam(const char *fname) {
 #endif
 
 		_inventory->rebuildItemRects();
+
+		for (CPtrList::iterator s = _inventory->getScene()->_picObjList.begin(); s != _inventory->getScene()->_picObjList.end(); ++s) {
+		}
 		
 		warning("STUB: loadGam()");
 	} else


Commit: c2103bb9cd4b8b2958ea99c7797df2cd4f0905d5
    https://github.com/scummvm/scummvm/commit/c2103bb9cd4b8b2958ea99c7797df2cd4f0905d5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Fix indentation

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/motion.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 9db96ae..23a93cf 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -97,150 +97,150 @@ void FullpipeEngine::updateEvents() {
 }
 
 void FullpipeEngine::initObjectStates() {
-  setLevelStates();
-
-  setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg));
-  setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_NotCrackedEggs));
-  setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken));
-  setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First));
-  setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No));
-  setObjectState(sO_Jar_4, getObjectEnumState(sO_Jar_4, sO_OnTheSpring));
-  setObjectState(sO_GulpedEggs, getObjectEnumState(sO_GulpedEgg, sO_NotPresent));
-
-  setSwallowedEggsState();
-
-  setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses));
-  setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking));
-  setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
-  setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle));
-  setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot));
-  setObjectState(sO_Fly_12, 0);
-  setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable));
-  setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7));
-  setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping));
-  setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty));
-  setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
-  setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
-  setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe));
-  setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
-  setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
-  setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging));
-  setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No));
-  setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted));
-  setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight));
-  setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14));
-  setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent));
-  setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe));
-  setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree));
-  setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom));
-  setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree));
-  setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin));
-  setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe));
-  setObjectState(sO_Fly_17, 1);
-  setObjectState(sO_DudeSwinged, 0);
-  setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging));
-  setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present));
-  setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together));
-  setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen));
-  setObjectState(sO_Grandpa, getObjectEnumState(sO_Grandpa, sO_InSock));
-  setObjectState(sO_CoinSlot_22, getObjectEnumState(sO_CoinSlot_22, sO_Empty));
-  setObjectState(sO_UpperHatch_23, getObjectEnumState(sO_UpperHatch_23, sO_Closed));
-  setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed));
-  setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken));
-  setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool));
-  setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe));
-  setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe));
-  setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed));
-  setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging));
-  setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe));
-  setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened));
-  setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed));
-  setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed));
-  setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed));
-  setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened));
-  setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull));
-  setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs));
-  setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering));
-  setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop));
-  setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe));
-  setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe));
-  setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel));
-  setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe));
-  setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown));
-  setObjectState(sO_Fireman, getObjectEnumState(sO_Fireman, sO_WithHose));
-  setObjectState(sO_Cube, getObjectEnumState(sO_Cube, sO_In_33));
-  setObjectState(sO_MommyOfHandle_32, getObjectEnumState(sO_MommyOfHandle_32, sO_WithoutHandle));
-  setObjectState(sO_Pedestal_33, getObjectEnumState(sO_Pedestal_33, sO_IsFree));
-  setObjectState(sO_Valve_34, getObjectEnumState(sO_Valve_34, sO_WithNothing));
-  setObjectState(sO_Stool_34, getObjectEnumState(sO_Stool_34, sO_WithoutDrawer));
-  setObjectState(sO_Plank_34, getObjectEnumState(sO_Plank_34, sO_Passive));
-  setObjectState(sO_Hatch_34, getObjectEnumState(sO_Hatch_34, sO_Closed));
-  setObjectState(sO_Valve_35, getObjectEnumState(sO_Valve_35, sO_TurnedOff));
-  setObjectState(sO_Carpet_35, getObjectEnumState(sO_Carpet_35, sO_CannotTake));
-  setObjectState(sO_CoinSlot_35, getObjectEnumState(sO_CoinSlot_35, sO_WithCoin));
-  setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork));
-  setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet));
-  setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On));
-  setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On));
-  setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On));
-  setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable));
-  setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer));
+	setLevelStates();
+
+	setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg));
+	setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_NotCrackedEggs));
+	setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken));
+	setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First));
+	setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No));
+	setObjectState(sO_Jar_4, getObjectEnumState(sO_Jar_4, sO_OnTheSpring));
+	setObjectState(sO_GulpedEggs, getObjectEnumState(sO_GulpedEgg, sO_NotPresent));
+
+	setSwallowedEggsState();
+
+	setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses));
+	setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking));
+	setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
+	setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle));
+	setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot));
+	setObjectState(sO_Fly_12, 0);
+	setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable));
+	setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7));
+	setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping));
+	setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty));
+	setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
+	setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
+	setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe));
+	setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
+	setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
+	setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging));
+	setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No));
+	setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted));
+	setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight));
+	setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14));
+	setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent));
+	setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe));
+	setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree));
+	setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom));
+	setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree));
+	setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin));
+	setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe));
+	setObjectState(sO_Fly_17, 1);
+	setObjectState(sO_DudeSwinged, 0);
+	setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging));
+	setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present));
+	setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together));
+	setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen));
+	setObjectState(sO_Grandpa, getObjectEnumState(sO_Grandpa, sO_InSock));
+	setObjectState(sO_CoinSlot_22, getObjectEnumState(sO_CoinSlot_22, sO_Empty));
+	setObjectState(sO_UpperHatch_23, getObjectEnumState(sO_UpperHatch_23, sO_Closed));
+	setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed));
+	setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken));
+	setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool));
+	setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe));
+	setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe));
+	setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed));
+	setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging));
+	setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe));
+	setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened));
+	setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed));
+	setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed));
+	setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed));
+	setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened));
+	setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull));
+	setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs));
+	setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering));
+	setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop));
+	setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe));
+	setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe));
+	setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel));
+	setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe));
+	setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown));
+	setObjectState(sO_Fireman, getObjectEnumState(sO_Fireman, sO_WithHose));
+	setObjectState(sO_Cube, getObjectEnumState(sO_Cube, sO_In_33));
+	setObjectState(sO_MommyOfHandle_32, getObjectEnumState(sO_MommyOfHandle_32, sO_WithoutHandle));
+	setObjectState(sO_Pedestal_33, getObjectEnumState(sO_Pedestal_33, sO_IsFree));
+	setObjectState(sO_Valve_34, getObjectEnumState(sO_Valve_34, sO_WithNothing));
+	setObjectState(sO_Stool_34, getObjectEnumState(sO_Stool_34, sO_WithoutDrawer));
+	setObjectState(sO_Plank_34, getObjectEnumState(sO_Plank_34, sO_Passive));
+	setObjectState(sO_Hatch_34, getObjectEnumState(sO_Hatch_34, sO_Closed));
+	setObjectState(sO_Valve_35, getObjectEnumState(sO_Valve_35, sO_TurnedOff));
+	setObjectState(sO_Carpet_35, getObjectEnumState(sO_Carpet_35, sO_CannotTake));
+	setObjectState(sO_CoinSlot_35, getObjectEnumState(sO_CoinSlot_35, sO_WithCoin));
+	setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork));
+	setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet));
+	setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On));
+	setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On));
+	setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On));
+	setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable));
+	setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer));
 }
 
 void FullpipeEngine::setLevelStates() {
-  CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
-
-  if (v) {
-    v->setSubVarAsInt(sO_Level0, 2833);
-    v->setSubVarAsInt(sO_Level1, 2754);
-    v->setSubVarAsInt(sO_Level2, 2757);
-    v->setSubVarAsInt(sO_Level3, 2760);
-    v->setSubVarAsInt(sO_Level4, 2763);
-    v->setSubVarAsInt(sO_Level5, 2766);
-    v->setSubVarAsInt(sO_Level6, 2769);
-    v->setSubVarAsInt(sO_Level7, 2772);
-    v->setSubVarAsInt(sO_Level8, 2775);
-    v->setSubVarAsInt(sO_Level9, 2778);
-  }
+	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+
+	if (v) {
+		v->setSubVarAsInt(sO_Level0, 2833);
+		v->setSubVarAsInt(sO_Level1, 2754);
+		v->setSubVarAsInt(sO_Level2, 2757);
+		v->setSubVarAsInt(sO_Level3, 2760);
+		v->setSubVarAsInt(sO_Level4, 2763);
+		v->setSubVarAsInt(sO_Level5, 2766);
+		v->setSubVarAsInt(sO_Level6, 2769);
+		v->setSubVarAsInt(sO_Level7, 2772);
+		v->setSubVarAsInt(sO_Level8, 2775);
+		v->setSubVarAsInt(sO_Level9, 2778);
+	}
 }
 
 void FullpipeEngine::setSwallowedEggsState() {
-  CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
 
-  _swallowedEgg1 = v->getSubVarByName(sO_Egg1);
-  _swallowedEgg2 = v->getSubVarByName(sO_Egg2);
-  _swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+	_swallowedEgg1 = v->getSubVarByName(sO_Egg1);
+	_swallowedEgg2 = v->getSubVarByName(sO_Egg2);
+	_swallowedEgg3 = v->getSubVarByName(sO_Egg3);
 
-  _swallowedEgg1->_value.intValue = 0;
-  _swallowedEgg2->_value.intValue = 0;
-  _swallowedEgg3->_value.intValue = 0;
+	_swallowedEgg1->_value.intValue = 0;
+	_swallowedEgg2->_value.intValue = 0;
+	_swallowedEgg3->_value.intValue = 0;
 }
 
 int FullpipeEngine::getObjectEnumState(const char *name, const char *state) {
-  CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
+	CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
 
-  if (!var) {
-    var = _gameLoader->_gameVar->addSubVarAsInt("OBJSTATES", 0);
-  }
+	if (!var) {
+		var = _gameLoader->_gameVar->addSubVarAsInt("OBJSTATES", 0);
+	}
 
-  var = var->getSubVarByName(name);
-  if (var) {
-    var = var->getSubVarByName("ENUMSTATES");
-    if (var)
-      return var->getSubVarAsInt(state);
-  }
+	var = var->getSubVarByName(name);
+	if (var) {
+		var = var->getSubVarByName("ENUMSTATES");
+		if (var)
+			return var->getSubVarAsInt(state);
+	}
 
-  return 0;
+	return 0;
 }
 
 void FullpipeEngine::setObjectState(const char *name, int state) {
-  CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
+	CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
 
-  if (!var) {
-    var = _gameLoader->_gameVar->addSubVarAsInt("OBJSTATES", 0);
-  }
+	if (!var) {
+		var = _gameLoader->_gameVar->addSubVarAsInt("OBJSTATES", 0);
+	}
 
-  var->setSubVarAsInt(name, state);
+	var->setSubVarAsInt(name, state);
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 74037da..15a3def 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -64,9 +64,9 @@ bool Background::load(MfcArchive &file) {
 	for (int i = 0; i < _bigPictureArray1Count; i++) {
 		_bigPictureArray[i] = (BigPicture **)calloc(_bigPictureArray2Count, sizeof(BigPicture *));
 		for (int j = 0; j < _bigPictureArray2Count; j++) {
-		  _bigPictureArray[i][j] = new BigPicture();
+			_bigPictureArray[i][j] = new BigPicture();
 
-		  _bigPictureArray[i][j]->load(file);
+			_bigPictureArray[i][j]->load(file);
 		}
 	}
 
@@ -80,7 +80,7 @@ void Background::addPictureObject(PictureObject *pct) {
 	bool inserted = false;
 	for (uint i = 0; i < _picObjList.size(); i++) {
 		if (((PictureObject *)_picObjList[i])->_priority == pct->_priority) {
-	  		_picObjList.insert_at(i, pct);
+			_picObjList.insert_at(i, pct);
 			inserted = true;
 			break;
 		}
@@ -92,7 +92,7 @@ void Background::addPictureObject(PictureObject *pct) {
 }
 
 void Background::renumPictures(PictureObject *pct) {
-  int *buf = (int *)calloc(_picObjList.size() + 2, sizeof(int));
+	int *buf = (int *)calloc(_picObjList.size() + 2, sizeof(int));
 
 	for (uint i = 0; i < _picObjList.size(); i++) {
 		if (pct->_id == ((PictureObject *)_picObjList[i])->_id)
@@ -166,7 +166,7 @@ bool GameObject::load(MfcArchive &file) {
 	_priority = file.readUint16LE();
 
 	if (g_fullpipe->_gameProjectVersion >= 11) {
-	  _field_8 = file.readUint32LE();
+		_field_8 = file.readUint32LE();
 	}
 
 	return true;
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 3ff6181..4acf568 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -44,26 +44,26 @@ bool CMctlCompound::load(MfcArchive &file) {
 	debug(6, "CMctlCompound::count = %d", count);
 
 	for (int i = 0; i < count; i++) {
-	  debug(6, "CompoundArray[%d]", i);
-	  CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
+		debug(6, "CompoundArray[%d]", i);
+		CMctlCompoundArrayItem *obj = (CMctlCompoundArrayItem *)file.readClass();
 
-	  int count1 = file.readUint32LE();
+		int count1 = file.readUint32LE();
 
-	  debug(6, "ConnectionPoint::count: %d", count1);
-	  for (int j = 0; j < count1; j++) {
-		debug(6, "ConnectionPoint[%d]", j);
-		CMctlConnectionPoint *obj1 = (CMctlConnectionPoint *)file.readClass();
+		debug(6, "ConnectionPoint::count: %d", count1);
+		for (int j = 0; j < count1; j++) {
+			debug(6, "ConnectionPoint[%d]", j);
+			CMctlConnectionPoint *obj1 = (CMctlConnectionPoint *)file.readClass();
 
-		obj->_connectionPoints.push_back(*obj1);
-	  }
+			obj->_connectionPoints.push_back(*obj1);
+		}
 
-	  obj->_field_20 = file.readUint32LE();
-	  obj->_field_24 = file.readUint32LE();
+		obj->_field_20 = file.readUint32LE();
+		obj->_field_24 = file.readUint32LE();
 
-	  debug(6, "graphReact");
-	  obj->_movGraphReactObj = (CMovGraphReact *)file.readClass();
+		debug(6, "graphReact");
+		obj->_movGraphReactObj = (CMovGraphReact *)file.readClass();
 
-	  _motionControllers.push_back(*obj);
+		_motionControllers.push_back(*obj);
 	}
 
 	return true;
@@ -80,144 +80,144 @@ bool CMctlCompoundArray::load(MfcArchive &file) {
 }
 
 CMovGraph::CMovGraph() {
-  _itemsCount = 0;
-  _items = 0;
-  //_callback1 = CMovGraphCallback1;  // TODO
-  _field_44 = 0;
-  // insertMessageHandler(CMovGraph_messageHandler, getMessageHandlersCount() - 1, 129);
+	_itemsCount = 0;
+	_items = 0;
+	//_callback1 = CMovGraphCallback1;  // TODO
+	_field_44 = 0;
+	// insertMessageHandler(CMovGraph_messageHandler, getMessageHandlersCount() - 1, 129);
 }
 
 bool CMovGraph::load(MfcArchive &file) {
-  _links.load(file);
-  _nodes.load(file);
+	_links.load(file);
+	_nodes.load(file);
 
-  return true;
+	return true;
 }
 
 CMovGraphLink::CMovGraphLink() {
-  _distance = 0;
-  _angle = 0;
-  _flags = 0x10000000;
-  _movGraphNode2 = 0;
-  _movGraphNode1 = 0;
-  _field_3C = 0;
-  _field_38 = 0;
-  _movGraphReact = 0;
+	_distance = 0;
+	_angle = 0;
+	_flags = 0x10000000;
+	_movGraphNode2 = 0;
+	_movGraphNode1 = 0;
+	_field_3C = 0;
+	_field_38 = 0;
+	_movGraphReact = 0;
 }
 
 bool CMovGraphLink::load(MfcArchive &file) {
-  _dwordArray1.load(file);
-  _dwordArray2.load(file);
+	_dwordArray1.load(file);
+	_dwordArray2.load(file);
 
-  _flags = file.readUint32LE();
+	_flags = file.readUint32LE();
 
-  debug(8, "GraphNode1");
-  _movGraphNode1 = (CMovGraphNode *)file.readClass();
-  debug(8, "GraphNode2");
-  _movGraphNode2 = (CMovGraphNode *)file.readClass();
+	debug(8, "GraphNode1");
+	_movGraphNode1 = (CMovGraphNode *)file.readClass();
+	debug(8, "GraphNode2");
+	_movGraphNode2 = (CMovGraphNode *)file.readClass();
 
-  _distance = file.readDouble();
-  _angle = file.readDouble();
+	_distance = file.readDouble();
+	_angle = file.readDouble();
 
-  debug(8, "distance: %g, angle: %g", _distance, _angle);
+	debug(8, "distance: %g, angle: %g", _distance, _angle);
 
-  _movGraphReact = (CMovGraphReact *)file.readClass();
-  _name = file.readPascalString();
+	_movGraphReact = (CMovGraphReact *)file.readClass();
+	_name = file.readPascalString();
 
-  return true;
+	return true;
 }
 
 bool CMovGraphNode::load(MfcArchive &file) {
-  _field_14 = file.readUint32LE();
-  _x = file.readUint32LE();
-  _y = file.readUint32LE();
-  _distance = file.readUint32LE();
+	_field_14 = file.readUint32LE();
+	_x = file.readUint32LE();
+	_y = file.readUint32LE();
+	_distance = file.readUint32LE();
 
-  return true;
+	return true;
 }
 
 CReactParallel::CReactParallel() {
-  _x1 = 0;
-  _x2 = 0;
-  _dy = 0;
-  _dx = 0;
-  _points = 0;
-  _y1 = 0;
-  _y2 = 0;
+	_x1 = 0;
+	_x2 = 0;
+	_dy = 0;
+	_dx = 0;
+	_points = 0;
+	_y1 = 0;
+	_y2 = 0;
 }
 
 bool CReactParallel::load(MfcArchive &file) {
-  _x1 = file.readUint32LE();
-  _y1 = file.readUint32LE();
-  _x2 = file.readUint32LE();
-  _y2 = file.readUint32LE();
-  _dx = file.readUint32LE();
-  _dy = file.readUint32LE();
+	_x1 = file.readUint32LE();
+	_y1 = file.readUint32LE();
+	_x2 = file.readUint32LE();
+	_y2 = file.readUint32LE();
+	_dx = file.readUint32LE();
+	_dy = file.readUint32LE();
 
-  createRegion();
+	createRegion();
 
-  return true;
+	return true;
 }
 
 void CReactParallel::createRegion() {
-  _points = (Common::Point **)malloc(sizeof(Common::Point *) * 4);
+	_points = (Common::Point **)malloc(sizeof(Common::Point *) * 4);
+
+	for (int i = 0; i < 4; i++)
+		_points[i] = new Common::Point;
 
-  for (int i = 0; i < 4; i++)
-    _points[i] = new Common::Point;
+	double at = atan2(_x1 - _x2, _y1 - _y2) + 1.570796;
+	double sn = sin(at);
+	double cs = cos(at);
 
-  double at = atan2(_x1 - _x2, _y1 - _y2) + 1.570796;
-  double sn = sin(at);
-  double cs = cos(at);
+	_points[0]->x = (int16)(_x1 - _dx * cs);
+	_points[0]->y = (int16)(_y1 - _dx * sn);
 
-  _points[0]->x = (int16)(_x1 - _dx * cs);
-  _points[0]->y = (int16)(_y1 - _dx * sn);
+	_points[1]->x = (int16)(_x2 - _dx * cs);
+	_points[1]->y = (int16)(_y2 - _dx * sn);
 
-  _points[1]->x = (int16)(_x2 - _dx * cs);
-  _points[1]->y = (int16)(_y2 - _dx * sn);
-  
-  _points[2]->x = (int16)(_x1 + _dy * cs);
-  _points[2]->y = (int16)(_y2 + _dy * sn);
+	_points[2]->x = (int16)(_x1 + _dy * cs);
+	_points[2]->y = (int16)(_y2 + _dy * sn);
 
-  _points[3]->x = (int16)(_x1 + _dy * cs);
-  _points[3]->y = (int16)(_y1 + _dy * sn);
+	_points[3]->x = (int16)(_x1 + _dy * cs);
+	_points[3]->y = (int16)(_y1 + _dy * sn);
 
-  // GdiObject::Attach(_rgn, CreatePolygonRgn(_points, 4, 2);
+	// GdiObject::Attach(_rgn, CreatePolygonRgn(_points, 4, 2);
 }
 
 CReactPolygonal::CReactPolygonal() {
-  _field_C = 0;
-  _points = 0;
-  _pointCount = 0;
-  _field_10 = 0;
+	_field_C = 0;
+	_points = 0;
+	_pointCount = 0;
+	_field_10 = 0;
 }
 
 bool CReactPolygonal::load(MfcArchive &file) {
-  _field_C = file.readUint32LE();
-  _field_10 = file.readUint32LE();
-  _pointCount = file.readUint32LE();
+	_field_C = file.readUint32LE();
+	_field_10 = file.readUint32LE();
+	_pointCount = file.readUint32LE();
 
-  if (_pointCount > 0) {
-	  _points = (Common::Point **)malloc(sizeof(Common::Point *) * _pointCount);
+	if (_pointCount > 0) {
+		_points = (Common::Point **)malloc(sizeof(Common::Point *) * _pointCount);
 
-	  for (int i = 0; i < _pointCount; i++) {
-		_points[i] = new Common::Point;
+		for (int i = 0; i < _pointCount; i++) {
+			_points[i] = new Common::Point;
 
-		_points[i]->x = file.readUint32LE();
-		_points[i]->y = file.readUint32LE();
-	  }
+			_points[i]->x = file.readUint32LE();
+			_points[i]->y = file.readUint32LE();
+		}
 
-  }
+	}
 
-  createRegion();
+	createRegion();
 
-  return true;
+	return true;
 }
 
 void CReactPolygonal::createRegion() {
-  if (_points) {
+	if (_points) {
 
-	// GdiObject::Attach(_rgn, CreatePolygonRgn(_points, _pointCount, 2);
-  }
+		// GdiObject::Attach(_rgn, CreatePolygonRgn(_points, _pointCount, 2);
+	}
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 7a5d663..4d8f961 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -180,11 +180,10 @@ bool Scene::load(MfcArchive &file) {
 		strcpy(fname, _stringObj);
 		strcpy(strrchr(fname, '.') + 1, "col");
 
-		MemoryObject *col =  new MemoryObject();
+		MemoryObject *col = new MemoryObject();
 		col->loadFile(fname);
 
 		_colorMemoryObj = col;
-	  
 	}
 
 	char *shdname = genFileName(0, _sceneId, "shd");
@@ -203,7 +202,7 @@ bool Scene::load(MfcArchive &file) {
 
 		if (g_fullpipe->_flgSoundList) {
 			char *nlname = genFileName(17, _sceneId, "nl");
-		  
+
 			_soundList->loadFile(slsname, nlname);
 
 			free(nlname);
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 57e3921..47952ba 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -469,82 +469,82 @@ bool CGameVar::load(MfcArchive &file) {
 }
 
 CGameVar *CGameVar::getSubVarByName(const char *name) {
-  CGameVar *sv = 0;
+	CGameVar *sv = 0;
 
-  if (_subVars != 0) {
-    sv = _subVars;
-    for (;sv && scumm_stricmp(sv->_stringObj, name); sv = sv->_nextVarObj)
-      ;
-  }
-  return sv;
+	if (_subVars != 0) {
+		sv = _subVars;
+		for (;sv && scumm_stricmp(sv->_stringObj, name); sv = sv->_nextVarObj)
+			;
+	}
+	return sv;
 }
 
 bool CGameVar::setSubVarAsInt(const char *name, int value) {
-  CGameVar *var = getSubVarByName(name);
+	CGameVar *var = getSubVarByName(name);
 
-  if (var) {
-    if (var->_varType == 0) {
-      var->_value.intValue = value;
+	if (var) {
+		if (var->_varType == 0) {
+			var->_value.intValue = value;
 
-      return true;
-    }
-    return false;
-  }
+			return true;
+		}
+		return false;
+	}
 
-  var = new CGameVar();
-  var->_varType = 0;
-  var->_value.intValue = value;
-  var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
-  strcpy(var->_stringObj, name);
+	var = new CGameVar();
+	var->_varType = 0;
+	var->_value.intValue = value;
+	var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
+	strcpy(var->_stringObj, name);
 
-  return addSubVar(var);
+	return addSubVar(var);
 }
 
 int CGameVar::getSubVarAsInt(const char *name) {
-  CGameVar *var = getSubVarByName(name);
+	CGameVar *var = getSubVarByName(name);
 
-  if (var)
-    return var->_value.intValue;
-  else
-    return 0;
+	if (var)
+		return var->_value.intValue;
+	else
+		return 0;
 }
 
 CGameVar *CGameVar::addSubVarAsInt(const char *name, int value) {
-  if (getSubVarByName(name)) {
-    return 0;
-  } else {
-    CGameVar *var = new CGameVar();
+	if (getSubVarByName(name)) {
+		return 0;
+	} else {
+		CGameVar *var = new CGameVar();
 
-    var->_varType = 0;
-    var->_value.intValue = value;
+		var->_varType = 0;
+		var->_value.intValue = value;
 
-    var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
-    strcpy(var->_stringObj, name);
+		var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
+		strcpy(var->_stringObj, name);
 
-    return (addSubVar(var) != 0) ? var : 0;
-  }
+		return (addSubVar(var) != 0) ? var : 0;
+	}
 }
 
 bool CGameVar::addSubVar(CGameVar *subvar) {
-  CGameVar *var = _subVars;
+	CGameVar *var = _subVars;
 
-  if (var) {
-    for (CGameVar *i = var->_nextVarObj; i; i = i->_nextVarObj)
-      var = i;
+	if (var) {
+		for (CGameVar *i = var->_nextVarObj; i; i = i->_nextVarObj)
+			var = i;
 
-    var->_nextVarObj = subvar;
-    subvar->_prevVarObj = var;
-    subvar->_parentVarObj = var;
-    
-    return true;
-  } else {
-    var->_subVars = subvar;
-    subvar->_parentVarObj = var;
+		var->_nextVarObj = subvar;
+		subvar->_prevVarObj = var;
+		subvar->_parentVarObj = var;
 
-    return true;
-  }
+		return true;
+	} else {
+		var->_subVars = subvar;
+		subvar->_parentVarObj = var;
 
-  return false;
+		return true;
+	}
+
+	return false;
 }
 
 Sc2::Sc2() {
@@ -571,27 +571,27 @@ bool Sc2::load(MfcArchive &file) {
 	_count1 = file.readUint32LE();
 	debug(4, "count1: %d", _count1);
 	if (_count1 > 0) {
-	  _data1 = (int32 *)malloc(_count1 * sizeof(int32));
-	  
-	  for (int i = 0; i < _count1; i++) {
-		_data1[i] = file.readUint32LE();
-	  }
+		_data1 = (int32 *)malloc(_count1 * sizeof(int32));
+
+		for (int i = 0; i < _count1; i++) {
+			_data1[i] = file.readUint32LE();
+		}
 	} else {
-	  _data1 = 0;
+		_data1 = 0;
 	}
 
 	_defPicAniInfosCount = file.readUint32LE();
 	debug(4, "defPicAniInfos: %d", _defPicAniInfosCount);
 	if (_defPicAniInfosCount > 0) {
-	  _defPicAniInfos = (PicAniInfo **)malloc(_defPicAniInfosCount * sizeof(PicAniInfo *));
+		_defPicAniInfos = (PicAniInfo **)malloc(_defPicAniInfosCount * sizeof(PicAniInfo *));
 
-	  for (int i = 0; i < _defPicAniInfosCount; i++) {
-		_defPicAniInfos[i] = new PicAniInfo();
+		for (int i = 0; i < _defPicAniInfosCount; i++) {
+			_defPicAniInfos[i] = new PicAniInfo();
 
-		_defPicAniInfos[i]->load(file);
-	  }
+			_defPicAniInfos[i]->load(file);
+		}
 	} else {
-	  _defPicAniInfos = 0;
+		_defPicAniInfos = 0;
 	}
 
 	_picAniInfos = 0;
@@ -601,14 +601,14 @@ bool Sc2::load(MfcArchive &file) {
 	debug(4, "_entranceData: %d", _entranceDataCount);
 
 	if (_entranceDataCount > 0) {
-	  _entranceData = (EntranceInfo **)malloc(_defPicAniInfosCount * sizeof(EntranceInfo *));
+		_entranceData = (EntranceInfo **)malloc(_defPicAniInfosCount * sizeof(EntranceInfo *));
 
-	  for (int i = 0; i < _entranceDataCount; i++) {
-		_entranceData[i] = new EntranceInfo();
-		_entranceData[i]->load(file);
-	  }
+		for (int i = 0; i < _entranceDataCount; i++) {
+			_entranceData[i] = new EntranceInfo();
+			_entranceData[i]->load(file);
+		}
 	} else {
-	  _entranceData = 0;
+		_entranceData = 0;
 	}
 
 	debug(4, "pos: %d, 0x%x: %d", file.size(), file.pos(), file.size() - file.pos());
@@ -617,33 +617,33 @@ bool Sc2::load(MfcArchive &file) {
 }
 
 bool PicAniInfo::load(MfcArchive &file) {
-  type = file.readUint32LE();
-  objectId = file.readUint16LE();
-  field_6 = file.readUint16LE();
-  field_8 = file.readUint32LE();
-  field_C = file.readUint16LE();
-  field_E = file.readUint16LE();
-  ox = file.readUint32LE();
-  oy = file.readUint32LE();
-  priority = file.readUint32LE();
-  staticsId = file.readUint16LE();
-  movementId = file.readUint16LE();
-  dynamicPhaseIndex = file.readUint16LE();
-  flags = file.readUint16LE();
-  field_24 = file.readUint32LE();
-  someDynamicPhaseIndex = file.readUint32LE();
-
-  return true;
+	type = file.readUint32LE();
+	objectId = file.readUint16LE();
+	field_6 = file.readUint16LE();
+	field_8 = file.readUint32LE();
+	field_C = file.readUint16LE();
+	field_E = file.readUint16LE();
+	ox = file.readUint32LE();
+	oy = file.readUint32LE();
+	priority = file.readUint32LE();
+	staticsId = file.readUint16LE();
+	movementId = file.readUint16LE();
+	dynamicPhaseIndex = file.readUint16LE();
+	flags = file.readUint16LE();
+	field_24 = file.readUint32LE();
+	someDynamicPhaseIndex = file.readUint32LE();
+
+	return true;
 }
 
 bool EntranceInfo::load(MfcArchive &file) {
-  sceneId = file.readUint32LE();
-  field_4 = file.readUint32LE();
-  messageQueueId = file.readUint32LE();
-  file.read(gap_C, 292); // FIXME, Ugh
-  field_130 = file.readUint32LE();
+	sceneId = file.readUint32LE();
+	field_4 = file.readUint32LE();
+	messageQueueId = file.readUint32LE();
+	file.read(gap_C, 292); // FIXME, Ugh
+	field_130 = file.readUint32LE();
 
-  return true;
+	return true;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 04aa8cf..f59342e 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -53,7 +53,7 @@ bool StaticANIObject::load(MfcArchive &file) {
 
 	for (int i = 0; i < count; i++) {
 		Statics *st = new Statics();
-	  
+
 		st->load(file);
 		_staticsList.push_back(st);
 	}
@@ -62,7 +62,7 @@ bool StaticANIObject::load(MfcArchive &file) {
 	debug(7, "Movements: %d", count);
 
 	for (int i = 0; i < count; i++) {
-	  	int movNum = file.readUint16LE();
+		int movNum = file.readUint16LE();
 
 		char *movname = genFileName(_id, movNum, "mov");
 
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 0b75ab5..88a21a0 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -105,7 +105,7 @@ char *MfcArchive::readPascalString(bool twoByte) {
 }
 
 MemoryObject::MemoryObject() {
-  	_filename = 0;
+	_filename = 0;
 	_field_8 = 0;
 	_field_C = 0;
 	_field_10 = -1;
@@ -169,20 +169,20 @@ int MfcArchive::readCount() {
 }
 
 double MfcArchive::readDouble() {
-  // FIXME: This is utterly cruel and unportable
-
-  union {
-    struct {
-      int32 a;
-      int32 b;
-    } i;
-    double d;
-  } tmp;
-
-  tmp.i.a = readUint32LE();
-  tmp.i.b = readUint32LE();
-    
-  return tmp.d;
+	// FIXME: This is utterly cruel and unportable
+
+	union {
+		struct {
+			int32 a;
+			int32 b;
+		} i;
+		double d;
+	} tmp;
+
+	tmp.i.a = readUint32LE();
+	tmp.i.b = readUint32LE();
+
+	return tmp.d;
 }
 
 enum {
@@ -380,7 +380,7 @@ byte *transCyrillic(byte *s) {
 		0xf1, 0xd181, 0xf2, 0xd182, 0xf3, 0xd183, 0xf4, 0xd184,
 		0xf5, 0xd185, 0xf6, 0xd186, 0xf7, 0xd187, 0xf8, 0xd188,
 		0xf9, 0xd189, 0xfa, 0xd18a, 0xfb, 0xd18b, 0xfc, 0xd18c,
-       	  	0xfd, 0xd18d, 0xfe, 0xd18e, 0xff, 0xd18f };
+		0xfd, 0xd18d, 0xfe, 0xd18e, 0xff, 0xd18f };
 
 	int i = 0;
 


Commit: f18e318f788d126b6c39232afaf0012ef401d55d
    https://github.com/scummvm/scummvm/commit/f18e318f788d126b6c39232afaf0012ef401d55d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Bitmap loading

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 15a3def..b06968e 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -24,8 +24,24 @@
 
 #include "fullpipe/objects.h"
 
+#include "common/memstream.h"
+
 namespace Fullpipe {
 
+void Bitmap::load(Common::ReadStream *s) {
+	x = s->readUint32LE();
+	y = s->readUint32LE();
+	width = s->readUint32LE();
+	height = s->readUint32LE();
+	s->readUint32LE(); // pixels
+	type = s->readUint32LE();
+	field_18 = s->readUint32LE();
+	flags = s->readUint32LE();
+
+	debug(9, "x: %d y: %d w: %d h: %d", x, y, width, height);
+	debug(9, "type: %d field_18: %d flags: 0x%x", type, field_18, flags);
+}
+
 Background::Background() {
 	_x = 0;
 	_y = 0;
@@ -227,6 +243,27 @@ void Picture::setAOIDs() {
 	warning("STUB: Picture::setAOIDs()");
 }
 
+void Picture::init() {
+	_bitmap = new Bitmap();
+
+	getDibInfo();
+
+	_bitmap->flags |= 0x1000000;
+}
+
+void Picture::getDibInfo() {
+	int off = _dataSize & ~0xf;
+
+	if (_dataSize != off) {
+		warning("Uneven data size: 0x%x", _dataSize);
+	}
+
+	Common::MemoryReadStream *s = new Common::MemoryReadStream(_data + off, 32);
+
+	_bitmap->load(s);
+	_bitmap->pixels = _data;
+}
+
 BigPicture::BigPicture() {
 }
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 6e1a3a1..f03cc72 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -23,12 +23,27 @@
 #ifndef FULLPIPE_GFX_H
 #define FULLPIPE_GFX_H
 
+class Common::ReadStream;
+
 namespace Fullpipe {
 
 class ShadowsItemArray : public CObArray {
 	// empty
 };
 
+struct Bitmap {
+	int x;
+	int y;
+	int width;
+	int height;
+	byte *pixels;
+	int type;
+	int field_18;
+	int flags;
+
+	void load(Common::ReadStream *s);
+};
+
 class Picture : public MemoryObject {
 	friend class Movement;
 
@@ -39,7 +54,7 @@ class Picture : public MemoryObject {
 	int _field_44;
 	int _width;
 	int _height;
-	int _bitmap;
+	Bitmap *_bitmap;
 	int _field_54;
 	MemoryObject2 *_memoryObject2;
 	int _alpha;
@@ -49,6 +64,8 @@ class Picture : public MemoryObject {
 	Picture();
 	virtual bool load(MfcArchive &file);
 	void setAOIDs();
+	void init();
+	void getDibInfo();
 };
 
 class BigPicture : public Picture {
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 88a21a0..be1bcd3 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -134,15 +134,27 @@ void MemoryObject::loadFile(char *filename) {
 		if (s) {
 			assert(s->size() > 0);
 
-			debug(0, "Loading %s", filename);
-			_data = calloc(s->size(), 1);
-			s->read(_data, s->size());
+			_dataSize = s->size();
+
+			debug(0, "Loading %s (%d bytes)", filename, _dataSize);
+			_data = (byte *)calloc(_dataSize, 1);
+			s->read(_data, _dataSize);
 
 			delete s;
 		}
 	}
 }
 
+void *MemoryObject::getData() {
+	load();
+
+	if (_field_14 || _flags & 1) {
+		return _data;
+	} else {
+		error("Unhandled packed data");
+	}
+}
+
 MemoryObject2::MemoryObject2() {
 	_data2 = 0;
 }
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 4588541..c12d857 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -89,7 +89,7 @@ class MemoryObject : CObject {
 	char _field_15;
 	char _field_16;
 	char _field_17;
-	void *_data;
+	byte *_data;
 	int _dataSize;
 	int _flags;
 	NGIArchive *_libHandle;
@@ -98,6 +98,8 @@ class MemoryObject : CObject {
 	MemoryObject();
 	virtual bool load(MfcArchive &file);
 	void loadFile(char *filename);
+	void load() { loadFile(_filename); }
+	void *getData();
 };
 
 class MemoryObject2 : public MemoryObject {


Commit: 56cb726ebc4446dfab6e625502a1589253deae4f
    https://github.com/scummvm/scummvm/commit/56cb726ebc4446dfab6e625502a1589253deae4f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Added lots of debug output, Picture::setAOIDs() implementation

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/inventory.cpp
    engines/fullpipe/motion.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 23a93cf..c826d21 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -47,7 +47,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_rnd = new Common::RandomSource("fullpipe");
 
 	_gameProjectVersion = 0;
-	_gameProjectValue = 0;
+	_pictureScale = 8;
 	_scrollSpeed = 0;
 	_currSoundListCount = 0;
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index d6b38f2..88c9587 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -78,7 +78,7 @@ public:
 	bool loadGam(const char *fname);
 
 	int _gameProjectVersion;
-	int _gameProjectValue;
+	int _pictureScale;
 	int _scrollSpeed;
 	int _currSoundListCount;
 	bool _soundEnabled;
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index b06968e..460452d 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -29,6 +29,8 @@
 namespace Fullpipe {
 
 void Bitmap::load(Common::ReadStream *s) {
+	debug(5, "Bitmap::load()");
+
 	x = s->readUint32LE();
 	y = s->readUint32LE();
 	width = s->readUint32LE();
@@ -54,6 +56,7 @@ Background::Background() {
 }
 
 bool Background::load(MfcArchive &file) {
+	debug(5, "Background::load()");
 	_stringObj = file.readPascalString();
 
 	int count = file.readUint16LE();
@@ -132,6 +135,7 @@ PictureObject::PictureObject() {
 }
 
 bool PictureObject::load(MfcArchive &file, bool bigPicture) {
+	debug(5, "PictureObject::load()");
 	GameObject::load(file);
 
 	if (bigPicture)
@@ -170,6 +174,7 @@ GameObject::GameObject() {
 }
 
 bool GameObject::load(MfcArchive &file) {
+	debug(5, "GameObject::load()");
 	_field_4 = 0;
 	_flags = 0;
 	_field_20 = 0;
@@ -205,6 +210,7 @@ Picture::Picture() {
 }
 
 bool Picture::load(MfcArchive &file) {
+	debug(5, "Picture::load()");
 	MemoryObject::load(file);
 
 	_x = file.readUint32LE();
@@ -240,6 +246,17 @@ bool Picture::load(MfcArchive &file) {
 }
 
 void Picture::setAOIDs() {
+	int w = (g_fullpipe->_pictureScale + _width - 1) / g_fullpipe->_pictureScale;
+	int h = (g_fullpipe->_pictureScale + _height - 1) / g_fullpipe->_pictureScale;
+
+	_memoryObject2->_rows = (byte **)malloc(w * sizeof(int *));
+
+	int pitch = 2 * h;
+	byte *ptr = _memoryObject2->getData();
+	for (int i = 0; i < w; i++) {
+		_memoryObject2->_rows[i] = ptr;
+		ptr += pitch;
+	}
 	warning("STUB: Picture::setAOIDs()");
 }
 
@@ -268,6 +285,7 @@ BigPicture::BigPicture() {
 }
 
 bool BigPicture::load(MfcArchive &file) {
+	debug(5, "BigPicture::load()");
 	Picture::load(file);
 
 	return true;
@@ -280,6 +298,7 @@ Shadows::Shadows() {
 }
 
 bool Shadows::load(MfcArchive &file) {
+	debug(5, "Shadows::load()");
 	_sceneId = file.readUint32LE();
 	_staticAniObjectId = file.readUint32LE();
 	_movementId = file.readUint32LE();
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 47f3b0d..3ca6ce6 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -27,6 +27,8 @@
 namespace Fullpipe {
 
 bool CInventory::load(MfcArchive &file) {
+	debug(5, "CInventory::load()");
+
 	_sceneId = file.readUint16LE();
 	int numInvs = file.readUint32LE();
 
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 4acf568..097ef34 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -34,11 +34,14 @@ namespace Fullpipe {
 bool CMotionController::load(MfcArchive &file) {
 	// Is originally empty	file.readClass();
 
+	debug(5, "CMotionController::load()");
 
 	return true;
 }
 
 bool CMctlCompound::load(MfcArchive &file) {
+	debug(5, "CMctlCompound::load()");
+
 	int count = file.readUint32LE();
 
 	debug(6, "CMctlCompound::count = %d", count);
@@ -70,6 +73,8 @@ bool CMctlCompound::load(MfcArchive &file) {
 }
 
 bool CMctlCompoundArray::load(MfcArchive &file) {
+	debug(5, "CMctlCompoundArray::load()");
+
 	int count = file.readUint32LE();
 
 	debug(0, "CMctlCompoundArray::count = %d", count);
@@ -88,6 +93,8 @@ CMovGraph::CMovGraph() {
 }
 
 bool CMovGraph::load(MfcArchive &file) {
+	debug(5, "CMovGraph::load()");
+
 	_links.load(file);
 	_nodes.load(file);
 
@@ -106,6 +113,8 @@ CMovGraphLink::CMovGraphLink() {
 }
 
 bool CMovGraphLink::load(MfcArchive &file) {
+	debug(5, "CMovGraphLink::load()");
+
 	_dwordArray1.load(file);
 	_dwordArray2.load(file);
 
@@ -128,6 +137,8 @@ bool CMovGraphLink::load(MfcArchive &file) {
 }
 
 bool CMovGraphNode::load(MfcArchive &file) {
+	debug(5, "CMovGraphNode::load()");
+
 	_field_14 = file.readUint32LE();
 	_x = file.readUint32LE();
 	_y = file.readUint32LE();
@@ -147,6 +158,8 @@ CReactParallel::CReactParallel() {
 }
 
 bool CReactParallel::load(MfcArchive &file) {
+	debug(5, "CReactParallel::load()");
+
 	_x1 = file.readUint32LE();
 	_y1 = file.readUint32LE();
 	_x2 = file.readUint32LE();
@@ -192,6 +205,8 @@ CReactPolygonal::CReactPolygonal() {
 }
 
 bool CReactPolygonal::load(MfcArchive &file) {
+	debug(5, "CReactPolygonal::load()");
+
 	_field_C = file.readUint32LE();
 	_field_10 = file.readUint32LE();
 	_pointCount = file.readUint32LE();
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 4d8f961..e6a1a9b 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -49,6 +49,8 @@ Scene *FullpipeEngine::accessScene(int sceneId) {
 }
 
 bool SceneTagList::load(MfcArchive &file) {
+	debug(5, "SceneTagList::load()");
+
 	int numEntries = file.readUint16LE();
 
 	for (int i = 0; i < numEntries; i++) {
@@ -66,6 +68,8 @@ SceneTag::SceneTag() {
 }
 
 bool SceneTag::load(MfcArchive &file) {
+	debug(5, "SceneTag::load()");
+
 	_field_4 = 0;
 	_scene = 0;
 
@@ -113,6 +117,8 @@ Scene::Scene() {
 }
 
 bool Scene::load(MfcArchive &file) {
+	debug(5, "Scene::load()");
+
 	Background::load(file);
 
 	_sceneId = file.readUint16LE();
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index bdbc8da..43b8e11 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -34,6 +34,8 @@ SoundList::SoundList() {
 }
 
 bool SoundList::load(MfcArchive &file, char *fname) {
+	debug(5, "SoundList::load()");
+
 	_soundItemsCount = file.readUint32LE();
 	_soundItems = (Sound **)calloc(_soundItemsCount, sizeof(Sound *));
 
@@ -75,6 +77,8 @@ Sound::Sound() {
 
 
 bool Sound::load(MfcArchive &file, NGIArchive *archive) {
+	debug(5, "Sound::load()");
+
 	MemoryObject::load(file);
 
 	_id = file.readUint32LE();
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 47952ba..02e2970 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -144,6 +144,8 @@ CGameLoader::~CGameLoader() {
 }
 
 bool CGameLoader::load(MfcArchive &file) {
+	debug(5, "CGameLoader::load()");
+
 	_gameName = file.readPascalString();
 	debug(6, "_gameName: %s", _gameName);
 
@@ -229,18 +231,20 @@ GameProject::GameProject() {
 }
 
 bool GameProject::load(MfcArchive &file) {
+	debug(5, "GameProject::load()");
+
 	_field_4 = 0;
 	_headerFilename = 0;
 	_field_10 = 12;
 
 	g_fullpipe->_gameProjectVersion = file.readUint32LE();
-	g_fullpipe->_gameProjectValue = file.readUint16LE();
+	g_fullpipe->_pictureScale = file.readUint16LE();
 	g_fullpipe->_scrollSpeed = file.readUint32LE();
 
 	_headerFilename = file.readPascalString();
 
 	debug(1, "_gameProjectVersion = %d", g_fullpipe->_gameProjectVersion);
-	debug(1, "_gameProjectValue = %d", g_fullpipe->_gameProjectValue);
+	debug(1, "_pictureScale = %d", g_fullpipe->_pictureScale);
 	debug(1, "_scrollSpeed = %d", g_fullpipe->_scrollSpeed);
 	debug(1, "_headerFilename = %s", _headerFilename);
 
@@ -264,6 +268,8 @@ GameProject::~GameProject() {
 }
 
 bool CInteractionController::load(MfcArchive &file) {
+	debug(5, "CInteractionController::load()");
+
 	return _interactions.load(file);
 }
 
@@ -288,6 +294,8 @@ CInteraction::CInteraction() {
 }
 
 bool CInteraction::load(MfcArchive &file) {
+	debug(5, "CInteraction::load()");
+
 	_objectId1 = file.readUint16LE();
 	_objectId2 = file.readUint16LE();
 	_staticsId1 = file.readUint16LE();
@@ -316,6 +324,8 @@ MessageQueue::MessageQueue() {
 }
 
 bool MessageQueue::load(MfcArchive &file) {
+	debug(5, "MessageQueue::load()");
+
 	_dataId = file.readUint16LE();
 
 	int count = file.readUint16LE();
@@ -346,6 +356,8 @@ ExCommand::ExCommand() {
 }
 
 bool ExCommand::load(MfcArchive &file) {
+	debug(5, "ExCommand::load()");
+
 	_msg._parentId = file.readUint16LE();
 	_msg._messageKind = file.readUint32LE();
 	_msg._x = file.readUint32LE();
@@ -393,6 +405,8 @@ CObjstateCommand::CObjstateCommand() {
 }
 
 bool CObjstateCommand::load(MfcArchive &file) {
+	debug(5, "CObjStateCommand::load()");
+
 	_cmd.load(file);
 
 	_value = file.readUint32LE();
@@ -403,6 +417,8 @@ bool CObjstateCommand::load(MfcArchive &file) {
 }
 
 bool PreloadItems::load(MfcArchive &file) {
+	debug(5, "PreloadItems::load()");
+
 	int count = file.readCount();
 
 	resize(count);
@@ -564,6 +580,8 @@ Sc2::Sc2() {
 }
 
 bool Sc2::load(MfcArchive &file) {
+	debug(5, "Sc2::load()");
+
 	_sceneId = file.readUint16LE();
 
 	_motionController = (CMotionController *)file.readClass();
@@ -617,6 +635,8 @@ bool Sc2::load(MfcArchive &file) {
 }
 
 bool PicAniInfo::load(MfcArchive &file) {
+	debug(5, "PicAniInfo::load()");
+
 	type = file.readUint32LE();
 	objectId = file.readUint16LE();
 	field_6 = file.readUint16LE();
@@ -637,6 +657,8 @@ bool PicAniInfo::load(MfcArchive &file) {
 }
 
 bool EntranceInfo::load(MfcArchive &file) {
+	debug(5, "EntranceInfo::load()");
+
 	sceneId = file.readUint32LE();
 	field_4 = file.readUint32LE();
 	messageQueueId = file.readUint32LE();
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index f59342e..f51bc17 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -47,6 +47,8 @@ StaticANIObject::StaticANIObject() {
 }
 
 bool StaticANIObject::load(MfcArchive &file) {
+	debug(5, "StaticANIObject::load()");
+
 	GameObject::load(file);
 
 	int count = file.readUint16LE();
@@ -128,6 +130,8 @@ Statics::Statics() {
 }
 
 bool Statics::load(MfcArchive &file) {
+	debug(5, "Statics::load()");
+
 	DynamicPhase::load(file);
 
 	_staticsId = file.readUint16LE();
@@ -279,6 +283,8 @@ DynamicPhase::DynamicPhase() {
 }
 
 bool DynamicPhase::load(MfcArchive &file) {
+	debug(5, "DynamicPhase::load()");
+
 	StaticPhase::load(file);
 
 	_field_7C = file.readUint16LE();
@@ -309,6 +315,8 @@ StaticPhase::StaticPhase() {
 }
 
 bool StaticPhase::load(MfcArchive &file) {
+	debug(5, "StaticPhase::load()");
+
 	Picture::load(file);
 
 	_initialCountdown = file.readUint16LE();
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index be1bcd3..9227d3d 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -43,6 +43,7 @@ bool CObject::loadFile(const char *fname) {
 }
 
 bool CObList::load(MfcArchive &file) {
+	debug(5, "CObList::load()");
 	int count = file.readCount();
 
 	debug(9, "CObList::count: %d:", count);
@@ -58,6 +59,7 @@ bool CObList::load(MfcArchive &file) {
 }
 
 bool CObArray::load(MfcArchive &file) {
+	debug(5, "CObArray::load()");
 	int count = file.readCount();
 
 	resize(count);
@@ -72,6 +74,7 @@ bool CObArray::load(MfcArchive &file) {
 }
 
 bool CDWordArray::load(MfcArchive &file) {
+	debug(5, "CWordArray::load()");
 	int count = file.readCount();
 
 	debug(9, "CDWordArray::count: %d", count);
@@ -117,6 +120,7 @@ MemoryObject::MemoryObject() {
 }
 
 bool MemoryObject::load(MfcArchive &file) {
+	debug(5, "MemoryObject::load()");
 	_filename = file.readPascalString();
 
 	if (g_fullpipe->_currArchive) {
@@ -128,6 +132,7 @@ bool MemoryObject::load(MfcArchive &file) {
 }
 
 void MemoryObject::loadFile(char *filename) {
+	debug(0, "MemoryObject::loadFile(<%s>)", filename);
 	if (!_data) {
 		Common::SeekableReadStream *s = g_fullpipe->_currArchive->createReadStreamForMember(filename);
 
@@ -145,7 +150,7 @@ void MemoryObject::loadFile(char *filename) {
 	}
 }
 
-void *MemoryObject::getData() {
+byte *MemoryObject::getData() {
 	load();
 
 	if (_field_14 || _flags & 1) {
@@ -156,10 +161,11 @@ void *MemoryObject::getData() {
 }
 
 MemoryObject2::MemoryObject2() {
-	_data2 = 0;
+	_rows = 0;
 }
 
 bool MemoryObject2::load(MfcArchive &file) {
+	debug(5, "MemoryObject2::load()");
 	MemoryObject::load(file);
 
 	_flags |= 1;
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index c12d857..7314ead 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -99,11 +99,14 @@ class MemoryObject : CObject {
 	virtual bool load(MfcArchive &file);
 	void loadFile(char *filename);
 	void load() { loadFile(_filename); }
-	void *getData();
+	byte *getData();
 };
 
 class MemoryObject2 : public MemoryObject {
-	void *_data2;
+	friend class Picture;
+
+ protected:
+	byte **_rows;
 
  public:
 	MemoryObject2();


Commit: 1aa11bd86fccc700de84571a24e2fef957abce3d
    https://github.com/scummvm/scummvm/commit/1aa11bd86fccc700de84571a24e2fef957abce3d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Further work on inventory

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 460452d..3679f8f 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -257,7 +257,6 @@ void Picture::setAOIDs() {
 		_memoryObject2->_rows[i] = ptr;
 		ptr += pitch;
 	}
-	warning("STUB: Picture::setAOIDs()");
 }
 
 void Picture::init() {
@@ -281,6 +280,13 @@ void Picture::getDibInfo() {
 	_bitmap->pixels = _data;
 }
 
+Bitmap *Picture::getPixelData() {
+	if (!_bitmap)
+		init();
+
+	return _bitmap;
+}
+
 BigPicture::BigPicture() {
 }
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index f03cc72..aa5dbf4 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -66,6 +66,10 @@ class Picture : public MemoryObject {
 	void setAOIDs();
 	void init();
 	void getDibInfo();
+	Bitmap *getPixelData();
+
+	byte getAlpha() { return (byte)_alpha; }
+	void setAlpha(byte alpha) { _alpha = alpha; }
 };
 
 class BigPicture : public Picture {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 3ca6ce6..5c67e87 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -100,6 +100,8 @@ void CInventory2::addItem(int itemId, int value) {
 
 void CInventory2::rebuildItemRects() {
 	g_fullpipe->accessScene(_sceneId);
+
+	warning("STUB: CInventory2::rebuildItemRects()");
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 93f4755..36170b8 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -64,18 +64,20 @@ struct InventoryItem {
 
 typedef Common::Array<InventoryItem> InventoryItems;
 
+class PictureObject;
+
 class InventoryIcon {
-	int pictureObjectNormal;
-	int pictureObjectMouseInside;
-	int pictureObject3;
-	int x1;
-	int y1;
-	int x2;
-	int y2;
-	int16 inventoryItemId;
-	int16 field_1E;
-	int isSelected;
-	int isMouseInside;
+	PictureObject *_pictureObjectNormal;
+	InventoryIcon **_icons;
+	int _numIcons;
+	int _x1;
+	int _y1;
+	int _x2;
+	int _y2;
+	int16 _inventoryItemId;
+	int16 _field_1E;
+	int _isSelected;
+	int _isMouseInside;
 };
 
 typedef Common::Array<InventoryIcon> InventoryIcons;
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 9227d3d..78440d8 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -132,7 +132,7 @@ bool MemoryObject::load(MfcArchive &file) {
 }
 
 void MemoryObject::loadFile(char *filename) {
-	debug(0, "MemoryObject::loadFile(<%s>)", filename);
+	debug(5, "MemoryObject::loadFile(<%s>)", filename);
 	if (!_data) {
 		Common::SeekableReadStream *s = g_fullpipe->_currArchive->createReadStreamForMember(filename);
 


Commit: defc53d4d1a74959adf4e87f2e715ac3c4c2f7b7
    https://github.com/scummvm/scummvm/commit/defc53d4d1a74959adf4e87f2e715ac3c4c2f7b7
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:17-07:00

Commit Message:
FULLPIPE: Scene drawing stubs

Changed paths:
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index e6a1a9b..fa144df 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -234,4 +234,32 @@ void Scene::init() {
 	warning("STUB: Scene::init()");
 }
 
+void Scene::draw(int par) {
+	updateScrolling(par);
+
+	drawContent(60000, 0, true);
+
+	//_staticANIObjectList2.sortByPriority();
+
+	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
+		((StaticANIObject *)s)->draw2();
+	}
+
+	int priority = -1;
+	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
+		drawContent(((StaticANIObject *)s)->_priority, priority, false);
+		((StaticANIObject *)s)->draw();
+
+		priority = ((StaticANIObject *)s)->_priority;
+	}
+
+	drawContent(-1, priority, false);
+}
+
+void Scene::updateScrolling(int par) {
+}
+
+void Scene::drawContent(int minPri, int maxPri, bool drawBG) {
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index e2bda17..1a76d31 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -43,6 +43,9 @@ class Scene : public Background {
 	virtual bool load(MfcArchive &file);
 	void initStaticANIObjects();
 	void init();
+	void draw(int par);
+	void drawContent(int minPri, int maxPri, bool drawBG);
+	void updateScrolling(int par);
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 02e2970..e01d08e 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -101,10 +101,10 @@ bool FullpipeEngine::loadGam(const char *fname) {
 
 		_inventory->rebuildItemRects();
 
-		for (CPtrList::iterator s = _inventory->getScene()->_picObjList.begin(); s != _inventory->getScene()->_picObjList.end(); ++s) {
-		}
-		
 		warning("STUB: loadGam()");
+		//for (CPtrList::iterator s = _inventory->getScene()->_picObjList.begin(); s != _inventory->getScene()->_picObjList.end(); ++s) {
+		//}
+		
 	} else
 		return false;
 
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index f51bc17..cdb8fab 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -124,6 +124,14 @@ Statics *StaticANIObject::addStatics(Statics *ani) {
 	return 0;
 }
 
+void StaticANIObject::draw() {
+	warning("STUB: StaticANIObject::draw()");
+}
+
+void StaticANIObject::draw2() {
+	warning("STUB: StaticANIObject::draw2()");
+}
+
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 7c52e18..3f16878 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -145,6 +145,8 @@ class StaticANIObject : public GameObject {
 	Movement *getMovementById(int id);
 
 	Statics *addStatics(Statics *ani);
+	void draw();
+	void draw2();
 };
 
 } // End of namespace Fullpipe


Commit: 51a5b5c9c51ac40c3ec27e4b55f8c9118c9a580f
    https://github.com/scummvm/scummvm/commit/51a5b5c9c51ac40c3ec27e4b55f8c9118c9a580f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:18-07:00

Commit Message:
FULLPIPE: Stubs for picture drawing

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 3679f8f..91c0780 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -287,6 +287,56 @@ Bitmap *Picture::getPixelData() {
 	return _bitmap;
 }
 
+void Picture::draw(int x, int y, int style, int angle) {
+	int x1 = x;
+	int y1 = y;
+
+	if (x != -1)
+		x1 = x;
+
+	if (y != -1)
+		y1 = y;
+
+	if (!_bitmap)
+		init();
+
+	if (!_bitmap)
+		return;
+
+	if (_alpha < 0xff) {
+		warning("Picture:draw: alpha = %0x", _alpha);
+	}
+
+	if (_bitmap->type == MKTAG('C', 'B', '\0', '\0') || _bitmap->type == MKTAG('R', 'B', '\0', '\0')) {
+		if (_paletteData) {
+			warning("Picture:draw: have palette");
+		}
+	}
+
+	switch (style) {
+	case 1:
+		//flip
+		warning("Picture::draw: style 1");
+		break;
+	case 2:
+		error("Picture::draw: style 2");
+		break;
+	default:
+		if (angle) {
+			warning("Picture:draw: angle = %d", angle);
+			drawRotated(x1, y1, angle);
+		} else {
+			putDib(x1, y1);
+		}
+	}
+}
+
+void Picture::drawRotated(int x, int y, int angle) {
+}
+
+void Picture::putDib(int x, int y) {
+}
+
 BigPicture::BigPicture() {
 }
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index aa5dbf4..a2bcad0 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -67,6 +67,9 @@ class Picture : public MemoryObject {
 	void init();
 	void getDibInfo();
 	Bitmap *getPixelData();
+	void draw(int x, int y, int style, int angle);
+	void drawRotated(int x, int y, int angle);
+	void putDib(int x, int y);
 
 	byte getAlpha() { return (byte)_alpha; }
 	void setAlpha(byte alpha) { _alpha = alpha; }


Commit: 57e03aedd3924cc9f675594b4b504b4f42958b40
    https://github.com/scummvm/scummvm/commit/57e03aedd3924cc9f675594b4b504b4f42958b40
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:18-07:00

Commit Message:
FULLPIPE: Initial code for bitmap rendering

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/sound.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index c826d21..f49edc7 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -64,8 +64,12 @@ FullpipeEngine::~FullpipeEngine() {
 }
 
 Common::Error FullpipeEngine::run() {
+
+	const Graphics::PixelFormat format(2, 5, 6, 5, 0, 11, 5, 0, 0);
 	// Initialize backend
-	initGraphics(800, 600, true);
+	initGraphics(800, 600, true, &format);
+
+	_backgroundSurface.create(800, 600, format);
 
 	_isSaveAllowed = false;
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 88c9587..bab7a72 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -73,6 +73,8 @@ public:
 
 	void updateEvents();
 
+	Graphics::Surface _backgroundSurface;
+
 	CGameLoader *_gameLoader;
 	GameProject *_gameProject;
 	bool loadGam(const char *fname);
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 91c0780..9bd511e 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -31,17 +31,17 @@ namespace Fullpipe {
 void Bitmap::load(Common::ReadStream *s) {
 	debug(5, "Bitmap::load()");
 
-	x = s->readUint32LE();
-	y = s->readUint32LE();
-	width = s->readUint32LE();
-	height = s->readUint32LE();
+	_x = s->readUint32LE();
+	_y = s->readUint32LE();
+	_width = s->readUint32LE();
+	_height = s->readUint32LE();
 	s->readUint32LE(); // pixels
-	type = s->readUint32LE();
-	field_18 = s->readUint32LE();
-	flags = s->readUint32LE();
+	_type = s->readUint32LE();
+	_field_18 = s->readUint32LE();
+	_flags = s->readUint32LE();
 
-	debug(9, "x: %d y: %d w: %d h: %d", x, y, width, height);
-	debug(9, "type: %d field_18: %d flags: 0x%x", type, field_18, flags);
+	debug(8, "Bitmap: x: %d y: %d w: %d h: %d field_18: 0x%x", _x, _y, _width, _height, _field_18);
+	debug(8, "Bitmap: type: %s (0x%04x) flags: 0x%x", Common::tag2string(_type).c_str(), _type, _flags);
 }
 
 Background::Background() {
@@ -242,6 +242,11 @@ bool Picture::load(MfcArchive &file) {
 		file.read(_paletteData, 1024);
 	}
 
+	debug(5, "Picture::load: <%s>", _memfilename);
+
+	getData();
+	init();
+
 	return true;
 }
 
@@ -264,20 +269,27 @@ void Picture::init() {
 
 	getDibInfo();
 
-	_bitmap->flags |= 0x1000000;
+	_bitmap->_flags |= 0x1000000;
 }
 
 void Picture::getDibInfo() {
 	int off = _dataSize & ~0xf;
 
+	debug(0, "Picture::getDibInfo: _dataSize: %d", _dataSize);
+
+	if (!_dataSize) {
+		warning("Picture::getDibInfo(): Empty data size");
+		return;
+	}
+
 	if (_dataSize != off) {
 		warning("Uneven data size: 0x%x", _dataSize);
 	}
 
-	Common::MemoryReadStream *s = new Common::MemoryReadStream(_data + off, 32);
+	Common::MemoryReadStream *s = new Common::MemoryReadStream(_data + off - 32, 32);
 
 	_bitmap->load(s);
-	_bitmap->pixels = _data;
+	_bitmap->_pixels = _data;
 }
 
 Bitmap *Picture::getPixelData() {
@@ -307,7 +319,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 		warning("Picture:draw: alpha = %0x", _alpha);
 	}
 
-	if (_bitmap->type == MKTAG('C', 'B', '\0', '\0') || _bitmap->type == MKTAG('R', 'B', '\0', '\0')) {
+	if (_bitmap->_type == MKTAG('C', 'B', '\0', '\0') || _bitmap->_type == MKTAG('R', 'B', '\0', '\0')) {
 		if (_paletteData) {
 			warning("Picture:draw: have palette");
 		}
@@ -326,7 +338,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 			warning("Picture:draw: angle = %d", angle);
 			drawRotated(x1, y1, angle);
 		} else {
-			putDib(x1, y1);
+			_bitmap->putDib(x1, y1, _paletteData);
 		}
 	}
 }
@@ -334,7 +346,237 @@ void Picture::draw(int x, int y, int style, int angle) {
 void Picture::drawRotated(int x, int y, int angle) {
 }
 
-void Picture::putDib(int x, int y) {
+void Bitmap::putDib(int x, int y, byte *palette) {
+	byte *curDestPtr;
+	int endy;
+	int pos;
+	byte *srcPtr;
+	uint pixel;
+	int start1;
+	int fillValue;
+	int pixoffset;
+	int end2;
+	int pixelHigh;
+	int pixoffset1;
+	int leftx;
+	uint pixel1;
+	uint pixel1High;
+	int bpp;
+	uint pitch;
+	byte *srcPtr1;
+	int end;
+	int endx;
+	int endy1;
+	bool cb05_format;
+	byte *pixPtr;
+	byte *srcPtr2;
+	int start;
+
+	endx = _width + _x - 1;
+	endy = _height + _y - 1;
+
+	if (_x > 799 || _width + _x - 1 < 0 || _y > 599 || endy < 0)
+		return;
+
+	if (endy > 599)
+		endy = 599;
+
+	if (_type == MKTAG('R', 'B', '\0', '\0')) {
+		endy1 = endy;
+		pixPtr = _pixels;
+		pos = _x;
+
+	LABEL_17:
+		srcPtr = pixPtr;
+		while (1) {
+			while (1) {
+                while (1) {
+					while (1) {
+						while (1) {
+							pixel = *(int16 *)srcPtr;
+							srcPtr += 2;
+							pixPtr = srcPtr;
+							if (pixel)
+								break;
+							--endy1;
+							if (endy1 < _y)
+								return;
+							pos = _x;
+						}
+
+						if (pixel == 0x100)
+							return;
+
+						if (pixel != 0x200)
+							break;
+
+						pixel1 = *(int16 *)srcPtr;
+						srcPtr += 2;
+						pos += (byte)pixel1;
+						pixel1High = pixel1 >> 8;
+
+						if (pixel1High) {
+							endy1 -= pixel1High;
+
+							if (endy1 < _y)
+								return;
+						}
+					}
+					start1 = pos;
+					fillValue = (byte)pixel;
+
+					if (!(byte)pixel)
+						break;
+
+					pos += (byte)pixel;
+					pixoffset = -start1;
+
+					if (pixoffset <= 0)
+						goto LABEL_25;
+
+					fillValue = (byte)pixel - pixoffset;
+
+					if (fillValue > 0) {
+						start1 = 0;
+
+					LABEL_25:
+						end2 = 799;
+						if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
+							if (endy1 <= endy) {
+								curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
+								int bgcolor = *(int32 *)(palette + 4 * (pixel >> 8));
+
+								colorFill(curDestPtr, fillValue, bgcolor);
+							}
+							goto LABEL_17;
+						}
+					}
+				}
+				pixelHigh = pixel >> 8;
+				srcPtr2 = srcPtr;
+				pos += pixelHigh;
+				srcPtr += 2 * ((pixelHigh + 1) >> 1);
+				pixoffset1 = -start1;
+
+				if (pixoffset1 > 0)
+					break;
+
+			LABEL_37:
+				leftx = 799;
+				if (pos > leftx + 1) {
+					pixelHigh += leftx - pos + 1;
+					if (pixelHigh <= 0)
+						continue;
+				}
+				if (endy1 <= endy) {
+					curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
+					paletteFill(curDestPtr, srcPtr2, pixelHigh);
+				}
+			}
+			pixelHigh -= pixoffset1;
+			if (pixelHigh > 0) {
+				start1 = 0;
+				srcPtr2 += pixoffset1;
+				goto LABEL_37;
+			}
+		}
+	}
+
+	cb05_format = (_type == MKTAG('C', 'B', '\05', 'e'));
+	bpp = cb05_format ? 2 : 1;
+	end = _width + _x - 1;
+	pitch = (bpp * (endx - _x + 1) + 3) & 0xFFFFFFFC;
+	start = _x;
+	srcPtr1 = &_pixels[pitch * (endy - _y)];
+	if (_x < 0) {
+		srcPtr1 += bpp * -_x;
+		start = 0;
+	}
+
+	if (endx > 799)
+		end = 799;
+
+	if (_flags & 0x1000000) {
+		for (int n = _y; n < endy; srcPtr1 -= pitch) {
+			curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(n, start);
+			copierKeyColor(curDestPtr, srcPtr1, end - start + 1, _flags & 0xff);
+			++n;
+		}
+	} else {
+		for (int n = _y; n <= endy; srcPtr1 -= pitch) {
+			curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(n, start);
+			copier(curDestPtr, srcPtr1, end - start + 1);
+			++n;
+		}
+	}
+}
+
+	void Bitmap::colorFill(byte *dest, int len, int color) {
+#if 0
+	if (blendMode) {
+		if (blendMode != 1)
+			error("vrtPutDib : RLE Fill : Invalid alpha blend mode");
+
+		colorFill = ptralphaFillColor16bit;
+	} else {
+		colorFill = ptrfillColor16bit;
+	}
+#endif
+
+}
+
+void Bitmap::paletteFill(byte *dest, byte *src, int len) {
+#if 0
+	if (blendMode) {
+		if (blendMode != 1)
+			error("vrtPutDib : RLE Fill : Invalid alpha blend mode");
+
+		paletteFill = ptrcopierWithPaletteAlpha;
+	} else {
+		paletteFill = ptrcopierWithPalette;
+	}
+#endif
+
+}
+
+void Bitmap::copierKeyColor(byte *dest, byte *src, int len, int keyColor) {
+#if 0
+	if (blendMode) {
+		if (blendMode == 1) {
+			if (cb05_format)
+				copierKeyColor = ptrcopier16bitKeycolorAlpha;
+			else
+				copierKeyColor = ptrcopierKeycolorAlpha;
+		} else {
+			copier = 0;
+		}
+	} else if (cb05_format) {
+		copierKeyColor = ptrcopier16bitKeycolor;
+	} else {
+		copierKeyColor = ptrkeyColor16bit;
+	}
+#endif
+
+}
+
+void Bitmap::copier(byte *dest, byte *src, int len) {
+#if 0
+	if (blendMode) {
+		if (blendMode == 1) {
+			if (cb05_format)
+				copier = ptrcopier16bitAlpha;
+			else
+				copier = ptrcopierWithPaletteAlpha;
+		} else {
+			copier = 0;
+		}
+	} else if (cb05_format) {
+		copier = ptrcopier16bit;
+	} else {
+		copier = ptrcopierWithPalette;
+	}
+#endif
+
 }
 
 BigPicture::BigPicture() {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index a2bcad0..1205468 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -32,16 +32,22 @@ class ShadowsItemArray : public CObArray {
 };
 
 struct Bitmap {
-	int x;
-	int y;
-	int width;
-	int height;
-	byte *pixels;
-	int type;
-	int field_18;
-	int flags;
+	int _x;
+	int _y;
+	int _width;
+	int _height;
+	byte *_pixels;
+	int _type;
+	int _field_18;
+	int _flags;
 
 	void load(Common::ReadStream *s);
+	void putDib(int x, int y, byte *palette);
+
+	void colorFill(byte *dest, int len, int color);
+	void paletteFill(byte *dest, byte *src, int len);
+	void copierKeyColor(byte *dest, byte *src, int len, int keyColor);
+	void copier(byte *dest, byte *src, int len);
 };
 
 class Picture : public MemoryObject {
@@ -69,7 +75,6 @@ class Picture : public MemoryObject {
 	Bitmap *getPixelData();
 	void draw(int x, int y, int style, int angle);
 	void drawRotated(int x, int y, int angle);
-	void putDib(int x, int y);
 
 	byte getAlpha() { return (byte)_alpha; }
 	void setAlpha(byte alpha) { _alpha = alpha; }
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 43b8e11..e1b2b33 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -88,8 +88,8 @@ bool Sound::load(MfcArchive &file, NGIArchive *archive) {
 
 	_objectId = file.readUint16LE();
 
-	if (archive && archive->hasFile(_filename)) {
-		Common::SeekableReadStream *s = archive->createReadStreamForMember(_filename);
+	if (archive && archive->hasFile(_memfilename)) {
+		Common::SeekableReadStream *s = archive->createReadStreamForMember(_memfilename);
 
 		_soundData = (byte *)calloc(s->size(), 1);
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index e01d08e..d1f9e00 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -44,7 +44,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
 		_inventory->addItem(ANI_INV_MAP, 1);
 
-#if 0
+#if 1
 		g_fullpipe->accessScene(301);
 		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(303);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index cdb8fab..4a2616c 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -145,7 +145,7 @@ bool Statics::load(MfcArchive &file) {
 	_staticsId = file.readUint16LE();
 
 	_stringObj = file.readPascalString();
-	debug(7, "statics: <%s>", _stringObj);
+	debug(7, "statics: <%s>", transCyrillic((byte *)_stringObj));
 
 	_picture = new Picture();
 	_picture->load(file);
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 78440d8..6ca6a8e 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -108,7 +108,7 @@ char *MfcArchive::readPascalString(bool twoByte) {
 }
 
 MemoryObject::MemoryObject() {
-	_filename = 0;
+	_memfilename = 0;
 	_field_8 = 0;
 	_field_C = 0;
 	_field_10 = -1;
@@ -121,7 +121,14 @@ MemoryObject::MemoryObject() {
 
 bool MemoryObject::load(MfcArchive &file) {
 	debug(5, "MemoryObject::load()");
-	_filename = file.readPascalString();
+	_memfilename = file.readPascalString();
+
+	if (char *p = strchr(_memfilename, '\\')) {
+		for (char *d = _memfilename; *p;) {
+			p++;
+			*d++ = *p;
+		}
+	}
 
 	if (g_fullpipe->_currArchive) {
 		_field_14 = 0;
@@ -170,8 +177,10 @@ bool MemoryObject2::load(MfcArchive &file) {
 
 	_flags |= 1;
 
-	if (_filename) {
-		MemoryObject::loadFile(_filename);
+	debug(5, "MemoryObject2::load: <%s>", _memfilename);
+
+	if (_memfilename && *_memfilename) {
+		MemoryObject::loadFile(_memfilename);
 	}
 
 	return true;
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 7314ead..524436b 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -81,7 +81,7 @@ class MemoryObject : CObject {
 	friend class Picture;
 
  protected:
-	char *_filename;
+	char *_memfilename;
 	int _field_8;
 	int _field_C;
 	int _field_10;
@@ -98,7 +98,7 @@ class MemoryObject : CObject {
 	MemoryObject();
 	virtual bool load(MfcArchive &file);
 	void loadFile(char *filename);
-	void load() { loadFile(_filename); }
+	void load() { loadFile(_memfilename); }
 	byte *getData();
 };
 


Commit: 6518cb579c110cd19356cd7aa78a12cc342056bb
    https://github.com/scummvm/scummvm/commit/6518cb579c110cd19356cd7aa78a12cc342056bb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:18-07:00

Commit Message:
FULLPIPE: Bitmap loading.

Added test code to display loaded pictures.
So far it crashes on certain pictures.

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 9bd511e..050a1b4 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -244,8 +244,7 @@ bool Picture::load(MfcArchive &file) {
 
 	debug(5, "Picture::load: <%s>", _memfilename);
 
-	getData();
-	init();
+	displayPicture();
 
 	return true;
 }
@@ -346,8 +345,29 @@ void Picture::draw(int x, int y, int style, int angle) {
 void Picture::drawRotated(int x, int y, int angle) {
 }
 
+void Picture::displayPicture() {
+	getData();
+	init();
+
+	g_fullpipe->_backgroundSurface.fillRect(Common::Rect(0, 0, 799, 599), 0);
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(0, 0), g_fullpipe->_backgroundSurface.pitch, 0, 0, 799, 599);
+
+	draw(0, 0, 0, 0);
+
+	while (1) {
+		g_fullpipe->updateEvents();
+		g_fullpipe->_system->delayMillis(10);
+		g_fullpipe->_system->updateScreen();
+
+		if (g_fullpipe->_keyState == ' ') {
+			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+			break;
+		}
+	}
+}
+
 void Bitmap::putDib(int x, int y, byte *palette) {
-	byte *curDestPtr;
+	int16 *curDestPtr;
 	int endy;
 	int pos;
 	byte *srcPtr;
@@ -443,7 +463,7 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 						end2 = 799;
 						if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
 							if (endy1 <= endy) {
-								curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
+								curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
 								int bgcolor = *(int32 *)(palette + 4 * (pixel >> 8));
 
 								colorFill(curDestPtr, fillValue, bgcolor);
@@ -469,8 +489,8 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 						continue;
 				}
 				if (endy1 <= endy) {
-					curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
-					paletteFill(curDestPtr, srcPtr2, pixelHigh);
+					curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
+					paletteFill(curDestPtr, srcPtr2, pixelHigh, (int32 *)palette);
 				}
 			}
 			pixelHigh -= pixoffset1;
@@ -498,20 +518,22 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 
 	if (_flags & 0x1000000) {
 		for (int n = _y; n < endy; srcPtr1 -= pitch) {
-			curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(n, start);
-			copierKeyColor(curDestPtr, srcPtr1, end - start + 1, _flags & 0xff);
+			curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
+			copierKeyColor(curDestPtr, srcPtr1, end - start + 1, _flags & 0xff, (int32 *)palette, cb05_format);
 			++n;
 		}
 	} else {
 		for (int n = _y; n <= endy; srcPtr1 -= pitch) {
-			curDestPtr = (byte *)g_fullpipe->_backgroundSurface.getBasePtr(n, start);
-			copier(curDestPtr, srcPtr1, end - start + 1);
+			curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
+			copier(curDestPtr, srcPtr1, end - start + 1, (int32 *)palette, cb05_format);
 			++n;
 		}
 	}
+
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(start, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, end, endy);
 }
 
-	void Bitmap::colorFill(byte *dest, int len, int color) {
+void Bitmap::colorFill(int16 *dest, int len, int color) {
 #if 0
 	if (blendMode) {
 		if (blendMode != 1)
@@ -523,9 +545,11 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 	}
 #endif
 
+	for (int i = 0; i < len; i++)
+		*dest++ = (int16)color;
 }
 
-void Bitmap::paletteFill(byte *dest, byte *src, int len) {
+void Bitmap::paletteFill(int16 *dest, byte *src, int len, int32 *palette) {
 #if 0
 	if (blendMode) {
 		if (blendMode != 1)
@@ -537,9 +561,11 @@ void Bitmap::paletteFill(byte *dest, byte *src, int len) {
 	}
 #endif
 
+	for (int i = 0; i < len; i++)
+		*dest++ = palette[*src++];
 }
 
-void Bitmap::copierKeyColor(byte *dest, byte *src, int len, int keyColor) {
+void Bitmap::copierKeyColor(int16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format) {
 #if 0
 	if (blendMode) {
 		if (blendMode == 1) {
@@ -557,9 +583,28 @@ void Bitmap::copierKeyColor(byte *dest, byte *src, int len, int keyColor) {
 	}
 #endif
 
+	if (!cb05_format) {
+		for (int i = 0; i < len; i++) {
+			if (*src != keyColor)
+				*dest = palette[*src];
+
+			dest++;
+			src++;
+		}
+	} else {
+		int16 *src16 = (int16 *)src;
+
+		for (int i = 0; i < len; i++) {
+			if (*src16 != 0)
+				*dest = *src16;
+
+			dest++;
+			src16++;
+		}
+	}
 }
 
-void Bitmap::copier(byte *dest, byte *src, int len) {
+void Bitmap::copier(int16 *dest, byte *src, int len, int32 *palette, bool cb05_format) {
 #if 0
 	if (blendMode) {
 		if (blendMode == 1) {
@@ -577,6 +622,15 @@ void Bitmap::copier(byte *dest, byte *src, int len) {
 	}
 #endif
 
+	if (!cb05_format) {
+		for (int i = 0; i < len; i++)
+			*dest++ = palette[*src++];
+	} else {
+		int16 *src16 = (int16 *)src;
+
+		for (int i = 0; i < len; i++)
+			*dest++ = *src16++;
+	}
 }
 
 BigPicture::BigPicture() {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 1205468..13f5194 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -44,10 +44,10 @@ struct Bitmap {
 	void load(Common::ReadStream *s);
 	void putDib(int x, int y, byte *palette);
 
-	void colorFill(byte *dest, int len, int color);
-	void paletteFill(byte *dest, byte *src, int len);
-	void copierKeyColor(byte *dest, byte *src, int len, int keyColor);
-	void copier(byte *dest, byte *src, int len);
+	void colorFill(int16 *dest, int len, int color);
+	void paletteFill(int16 *dest, byte *src, int len, int32 *palette);
+	void copierKeyColor(int16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format);
+	void copier(int16 *dest, byte *src, int len, int32 *palette, bool cb05_format);
 };
 
 class Picture : public MemoryObject {
@@ -66,6 +66,8 @@ class Picture : public MemoryObject {
 	int _alpha;
 	byte *_paletteData;
 
+	void displayPicture();
+
   public:
 	Picture();
 	virtual bool load(MfcArchive &file);


Commit: a54a60f52e1548715361c98f779e531205b3c18a
    https://github.com/scummvm/scummvm/commit/a54a60f52e1548715361c98f779e531205b3c18a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:18-07:00

Commit Message:
FULLPIPE: Fix crash in bitmap drawing code.

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 050a1b4..bc8ed26 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -464,7 +464,7 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 						if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
 							if (endy1 <= endy) {
 								curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
-								int bgcolor = *(int32 *)(palette + 4 * (pixel >> 8));
+								int bgcolor = *(int32 *)(palette + 4 * ((pixel >> 8) & 0xff));
 
 								colorFill(curDestPtr, fillValue, bgcolor);
 							}


Commit: d0c9392862484a07b360c69af5aab078ad9d4036
    https://github.com/scummvm/scummvm/commit/d0c9392862484a07b360c69af5aab078ad9d4036
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:18-07:00

Commit Message:
FULLPIPE: Implemented quitting from picture browsing

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index f49edc7..3054432 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -56,6 +56,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_soundEnabled = true;
 	_flgSoundList = true;
 
+	_needQuit = false;
+
 	g_fullpipe = this;
 }
 
@@ -94,6 +96,9 @@ void FullpipeEngine::updateEvents() {
 			_mouseX = event.mouse.x;
 			_mouseY = event.mouse.y;
 			break;
+		case Common::EVENT_QUIT:
+			_needQuit = true;
+			break;
 		default:
 			break;
 		}
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index bab7a72..7e34e4e 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -86,6 +86,8 @@ public:
 	bool _soundEnabled;
 	bool _flgSoundList;
 
+	bool _needQuit;
+
 	void initObjectStates();
 	void setLevelStates();
 	void setSwallowedEggsState();
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index bc8ed26..1e5bb28 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -346,6 +346,12 @@ void Picture::drawRotated(int x, int y, int angle) {
 }
 
 void Picture::displayPicture() {
+	if (g_fullpipe->_needQuit)
+		return;
+
+	if (0 && !Common::String(_memfilename).hasSuffix(".dib"))
+		return;
+
 	getData();
 	init();
 
@@ -354,7 +360,7 @@ void Picture::displayPicture() {
 
 	draw(0, 0, 0, 0);
 
-	while (1) {
+	while (!g_fullpipe->_needQuit) {
 		g_fullpipe->updateEvents();
 		g_fullpipe->_system->delayMillis(10);
 		g_fullpipe->_system->updateScreen();
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index fa144df..37b3560 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -124,7 +124,7 @@ bool Scene::load(MfcArchive &file) {
 	_sceneId = file.readUint16LE();
 	
 	_scstringObj = file.readPascalString();
-	debug(0, "scene: <%s>", transCyrillic((byte *)_scstringObj));
+	debug(0, "scene: <%s> %d", transCyrillic((byte *)_scstringObj), _sceneId);
 
 	int count = file.readUint16LE();
 	debug(7, "scene.ani: %d", count);
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index d1f9e00..c4ea1cd 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -45,6 +45,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->addItem(ANI_INV_MAP, 1);
 
 #if 1
+		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(301);
 		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(303);


Commit: ba93c8d0842f4b786e6bea2725cfd03e0e132d4c
    https://github.com/scummvm/scummvm/commit/ba93c8d0842f4b786e6bea2725cfd03e0e132d4c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:18-07:00

Commit Message:
FULLPIPE: Added links to articles with floating point structure description

Changed paths:
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 6ca6a8e..f6e1925 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -197,6 +197,9 @@ int MfcArchive::readCount() {
 
 double MfcArchive::readDouble() {
 	// FIXME: This is utterly cruel and unportable
+	// Some articles on the matter:
+	// http://randomascii.wordpress.com/2013/02/07/float-precision-revisited-nine-digit-float-portability/
+	// http://randomascii.wordpress.com/2012/01/11/tricks-with-the-floating-point-format/
 
 	union {
 		struct {


Commit: 4554ac24c6c47645528f68dbed84ccfa93b62a15
    https://github.com/scummvm/scummvm/commit/4554ac24c6c47645528f68dbed84ccfa93b62a15
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:48:19-07:00

Commit Message:
FULLPIPE: Fixed to RB bitmap rendering

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 1e5bb28..b6c2a95 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -318,12 +318,6 @@ void Picture::draw(int x, int y, int style, int angle) {
 		warning("Picture:draw: alpha = %0x", _alpha);
 	}
 
-	if (_bitmap->_type == MKTAG('C', 'B', '\0', '\0') || _bitmap->_type == MKTAG('R', 'B', '\0', '\0')) {
-		if (_paletteData) {
-			warning("Picture:draw: have palette");
-		}
-	}
-
 	switch (style) {
 	case 1:
 		//flip
@@ -337,7 +331,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 			warning("Picture:draw: angle = %d", angle);
 			drawRotated(x1, y1, angle);
 		} else {
-			_bitmap->putDib(x1, y1, _paletteData);
+			_bitmap->putDib(x1, y1, (int32 *)_paletteData);
 		}
 	}
 }
@@ -349,7 +343,7 @@ void Picture::displayPicture() {
 	if (g_fullpipe->_needQuit)
 		return;
 
-	if (0 && !Common::String(_memfilename).hasSuffix(".dib"))
+	if (Common::String(_memfilename).hasSuffix(".dib"))
 		return;
 
 	getData();
@@ -372,12 +366,11 @@ void Picture::displayPicture() {
 	}
 }
 
-void Bitmap::putDib(int x, int y, byte *palette) {
-	int16 *curDestPtr;
+void Bitmap::putDib(int x, int y, int32 *palette) {
+	uint16 *curDestPtr;
 	int endy;
 	int pos;
 	byte *srcPtr;
-	uint pixel;
 	int start1;
 	int fillValue;
 	int pixoffset;
@@ -385,7 +378,8 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 	int pixelHigh;
 	int pixoffset1;
 	int leftx;
-	uint pixel1;
+	uint16 pixel;
+	uint16 pixel1;
 	uint pixel1High;
 	int bpp;
 	uint pitch;
@@ -419,48 +413,55 @@ void Bitmap::putDib(int x, int y, byte *palette) {
                 while (1) {
 					while (1) {
 						while (1) {
-							pixel = *(int16 *)srcPtr;
+							pixel = *(uint16 *)srcPtr;
 							srcPtr += 2;
 							pixPtr = srcPtr;
 							if (pixel)
 								break;
 							--endy1;
-							if (endy1 < _y)
+							if (endy1 < _y) {
+								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
+
 								return;
+							}
 							pos = _x;
 						}
 
-						if (pixel == 0x100)
+						if (pixel == 0x100) {
+							g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
 							return;
+						}
 
 						if (pixel != 0x200)
 							break;
 
-						pixel1 = *(int16 *)srcPtr;
+						pixel1 = *(uint16 *)srcPtr;
 						srcPtr += 2;
-						pos += (byte)pixel1;
+						pos += (byte)(pixel1 && 0xff);
 						pixel1High = pixel1 >> 8;
 
 						if (pixel1High) {
 							endy1 -= pixel1High;
 
-							if (endy1 < _y)
+							if (endy1 < _y) {
+								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, endx, endy);
 								return;
+							}
 						}
 					}
 					start1 = pos;
-					fillValue = (byte)pixel;
+					fillValue = (byte)(pixel & 0xff);
 
 					if (!(byte)pixel)
 						break;
 
-					pos += (byte)pixel;
+					pos += (byte)(pixel & 0xff);
 					pixoffset = -start1;
 
 					if (pixoffset <= 0)
 						goto LABEL_25;
 
-					fillValue = (byte)pixel - pixoffset;
+					fillValue = (byte)(pixel & 0xff) - pixoffset;
 
 					if (fillValue > 0) {
 						start1 = 0;
@@ -469,9 +470,8 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 						end2 = 799;
 						if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
 							if (endy1 <= endy) {
-								curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
-								int bgcolor = *(int32 *)(palette + 4 * ((pixel >> 8) & 0xff));
-
+								curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
+								int bgcolor = palette[(pixel >> 8) & 0xff];
 								colorFill(curDestPtr, fillValue, bgcolor);
 							}
 							goto LABEL_17;
@@ -495,7 +495,7 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 						continue;
 				}
 				if (endy1 <= endy) {
-					curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(endy1, start1);
+					curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
 					paletteFill(curDestPtr, srcPtr2, pixelHigh, (int32 *)palette);
 				}
 			}
@@ -524,13 +524,13 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 
 	if (_flags & 0x1000000) {
 		for (int n = _y; n < endy; srcPtr1 -= pitch) {
-			curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
+			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
 			copierKeyColor(curDestPtr, srcPtr1, end - start + 1, _flags & 0xff, (int32 *)palette, cb05_format);
 			++n;
 		}
 	} else {
 		for (int n = _y; n <= endy; srcPtr1 -= pitch) {
-			curDestPtr = (int16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
+			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
 			copier(curDestPtr, srcPtr1, end - start + 1, (int32 *)palette, cb05_format);
 			++n;
 		}
@@ -539,7 +539,7 @@ void Bitmap::putDib(int x, int y, byte *palette) {
 	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(start, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, end, endy);
 }
 
-void Bitmap::colorFill(int16 *dest, int len, int color) {
+void Bitmap::colorFill(uint16 *dest, int len, int32 color) {
 #if 0
 	if (blendMode) {
 		if (blendMode != 1)
@@ -552,10 +552,10 @@ void Bitmap::colorFill(int16 *dest, int len, int color) {
 #endif
 
 	for (int i = 0; i < len; i++)
-		*dest++ = (int16)color;
+		*dest++ = (int16)(color & 0xffff);
 }
 
-void Bitmap::paletteFill(int16 *dest, byte *src, int len, int32 *palette) {
+void Bitmap::paletteFill(uint16 *dest, byte *src, int len, int32 *palette) {
 #if 0
 	if (blendMode) {
 		if (blendMode != 1)
@@ -568,10 +568,10 @@ void Bitmap::paletteFill(int16 *dest, byte *src, int len, int32 *palette) {
 #endif
 
 	for (int i = 0; i < len; i++)
-		*dest++ = palette[*src++];
+		*dest++ = READ_LE_UINT32(&palette[*src++]) & 0xffff;
 }
 
-void Bitmap::copierKeyColor(int16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format) {
+void Bitmap::copierKeyColor(uint16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format) {
 #if 0
 	if (blendMode) {
 		if (blendMode == 1) {
@@ -592,7 +592,7 @@ void Bitmap::copierKeyColor(int16 *dest, byte *src, int len, int keyColor, int32
 	if (!cb05_format) {
 		for (int i = 0; i < len; i++) {
 			if (*src != keyColor)
-				*dest = palette[*src];
+				*dest = READ_LE_UINT32(&palette[*src]) & 0xffff;
 
 			dest++;
 			src++;
@@ -610,7 +610,7 @@ void Bitmap::copierKeyColor(int16 *dest, byte *src, int len, int keyColor, int32
 	}
 }
 
-void Bitmap::copier(int16 *dest, byte *src, int len, int32 *palette, bool cb05_format) {
+void Bitmap::copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_format) {
 #if 0
 	if (blendMode) {
 		if (blendMode == 1) {
@@ -630,7 +630,7 @@ void Bitmap::copier(int16 *dest, byte *src, int len, int32 *palette, bool cb05_f
 
 	if (!cb05_format) {
 		for (int i = 0; i < len; i++)
-			*dest++ = palette[*src++];
+			*dest++ = READ_LE_UINT32(&palette[*src++]) & 0xffff;
 	} else {
 		int16 *src16 = (int16 *)src;
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 13f5194..05ec2d9 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -42,12 +42,12 @@ struct Bitmap {
 	int _flags;
 
 	void load(Common::ReadStream *s);
-	void putDib(int x, int y, byte *palette);
+	void putDib(int x, int y, int32 *palette);
 
-	void colorFill(int16 *dest, int len, int color);
-	void paletteFill(int16 *dest, byte *src, int len, int32 *palette);
-	void copierKeyColor(int16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format);
-	void copier(int16 *dest, byte *src, int len, int32 *palette, bool cb05_format);
+	void colorFill(uint16 *dest, int len, int color);
+	void paletteFill(uint16 *dest, byte *src, int len, int32 *palette);
+	void copierKeyColor(uint16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format);
+	void copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_format);
 };
 
 class Picture : public MemoryObject {


Commit: ade5ad2c74218423af4693f4ceb96be960bd7b44
    https://github.com/scummvm/scummvm/commit/ade5ad2c74218423af4693f4ceb96be960bd7b44
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:02-07:00

Commit Message:
FULLPIPE: Optimize bitmap rendering routine

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index b6c2a95..f1f1700 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -370,7 +370,6 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 	uint16 *curDestPtr;
 	int endy;
 	int pos;
-	byte *srcPtr;
 	int start1;
 	int fillValue;
 	int pixoffset;
@@ -383,13 +382,14 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 	uint pixel1High;
 	int bpp;
 	uint pitch;
-	byte *srcPtr1;
 	int end;
 	int endx;
 	int endy1;
 	bool cb05_format;
-	byte *pixPtr;
-	byte *srcPtr2;
+	uint16 *pixPtr;
+	uint16 *srcPtr2;
+	uint16 *srcPtr;
+	byte *srcPtr1;
 	int start;
 
 	endx = _width + _x - 1;
@@ -403,7 +403,7 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 
 	if (_type == MKTAG('R', 'B', '\0', '\0')) {
 		endy1 = endy;
-		pixPtr = _pixels;
+		pixPtr = (uint16 *)_pixels;
 		pos = _x;
 
 	LABEL_17:
@@ -413,15 +413,17 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
                 while (1) {
 					while (1) {
 						while (1) {
-							pixel = *(uint16 *)srcPtr;
-							srcPtr += 2;
+							pixel = *srcPtr;
+
+							srcPtr++;
 							pixPtr = srcPtr;
+
 							if (pixel)
 								break;
+
 							--endy1;
 							if (endy1 < _y) {
 								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
-
 								return;
 							}
 							pos = _x;
@@ -435,10 +437,11 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 						if (pixel != 0x200)
 							break;
 
-						pixel1 = *(uint16 *)srcPtr;
-						srcPtr += 2;
+						pixel1 = *srcPtr;
+
+						srcPtr++;
 						pos += (byte)(pixel1 && 0xff);
-						pixel1High = pixel1 >> 8;
+						pixel1High = (pixel1 >> 8) & 0xff;
 
 						if (pixel1High) {
 							endy1 -= pixel1High;
@@ -452,16 +455,16 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 					start1 = pos;
 					fillValue = (byte)(pixel & 0xff);
 
-					if (!(byte)pixel)
+					if (!fillValue)
 						break;
 
-					pos += (byte)(pixel & 0xff);
+					pos += fillValue;
 					pixoffset = -start1;
 
 					if (pixoffset <= 0)
 						goto LABEL_25;
 
-					fillValue = (byte)(pixel & 0xff) - pixoffset;
+					fillValue -= pixoffset;
 
 					if (fillValue > 0) {
 						start1 = 0;
@@ -478,10 +481,10 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 						}
 					}
 				}
-				pixelHigh = pixel >> 8;
+				pixelHigh = (pixel >> 8) & 0xff;
 				srcPtr2 = srcPtr;
 				pos += pixelHigh;
-				srcPtr += 2 * ((pixelHigh + 1) >> 1);
+				srcPtr += (pixelHigh + 1) >> 1;
 				pixoffset1 = -start1;
 
 				if (pixoffset1 > 0)
@@ -496,13 +499,13 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 				}
 				if (endy1 <= endy) {
 					curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
-					paletteFill(curDestPtr, srcPtr2, pixelHigh, (int32 *)palette);
+					paletteFill(curDestPtr, (byte *)srcPtr2, pixelHigh, (int32 *)palette);
 				}
 			}
 			pixelHigh -= pixoffset1;
 			if (pixelHigh > 0) {
 				start1 = 0;
-				srcPtr2 += pixoffset1;
+				srcPtr2 = (uint16 *)((byte *)srcPtr2 + pixoffset1);
 				goto LABEL_37;
 			}
 		}


Commit: 5add3373fe08897ce43e9c435df7213c03beffac
    https://github.com/scummvm/scummvm/commit/5add3373fe08897ce43e9c435df7213c03beffac
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:02-07:00

Commit Message:
FULLPIPE: Fix stupid bug in RB bitmap rendering

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index f1f1700..c59ab63 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -440,7 +440,7 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 						pixel1 = *srcPtr;
 
 						srcPtr++;
-						pos += (byte)(pixel1 && 0xff);
+						pos += (byte)(pixel1 & 0xff);
 						pixel1High = (pixel1 >> 8) & 0xff;
 
 						if (pixel1High) {


Commit: 754858641b23cec314fc483f82caed438d929da3
    https://github.com/scummvm/scummvm/commit/754858641b23cec314fc483f82caed438d929da3
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:02-07:00

Commit Message:
FULLPIPE: Proper parameters for screen blitting

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index c59ab63..9f88327 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -343,12 +343,12 @@ void Picture::displayPicture() {
 	if (g_fullpipe->_needQuit)
 		return;
 
-	if (Common::String(_memfilename).hasSuffix(".dib"))
-		return;
-
 	getData();
 	init();
 
+	if (!_dataSize)
+		return;
+
 	g_fullpipe->_backgroundSurface.fillRect(Common::Rect(0, 0, 799, 599), 0);
 	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(0, 0), g_fullpipe->_backgroundSurface.pitch, 0, 0, 799, 599);
 
@@ -423,7 +423,7 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 
 							--endy1;
 							if (endy1 < _y) {
-								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
+								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx + 1, MIN(endy + 1, 799));
 								return;
 							}
 							pos = _x;


Commit: 75c4be7469e71021d2e1cf7810a2be68ff972fac
    https://github.com/scummvm/scummvm/commit/75c4be7469e71021d2e1cf7810a2be68ff972fac
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:02-07:00

Commit Message:
FULLPIPE: Split drawing of different image types. Optimize putDibCB

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 9f88327..684fce5 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -367,6 +367,16 @@ void Picture::displayPicture() {
 }
 
 void Bitmap::putDib(int x, int y, int32 *palette) {
+	_x = x;
+	_y = y;
+
+	if (_type == MKTAG('R', 'B', '\0', '\0'))
+		putDibRB(palette);
+	else
+		putDibCB(palette);
+}
+
+void Bitmap::putDibRB(int32 *palette) {
 	uint16 *curDestPtr;
 	int endy;
 	int pos;
@@ -380,16 +390,11 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 	uint16 pixel;
 	uint16 pixel1;
 	uint pixel1High;
-	int bpp;
-	uint pitch;
-	int end;
 	int endx;
 	int endy1;
-	bool cb05_format;
 	uint16 *pixPtr;
 	uint16 *srcPtr2;
 	uint16 *srcPtr;
-	byte *srcPtr1;
 	int start;
 
 	endx = _width + _x - 1;
@@ -401,145 +406,165 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 	if (endy > 599)
 		endy = 599;
 
-	if (_type == MKTAG('R', 'B', '\0', '\0')) {
-		endy1 = endy;
-		pixPtr = (uint16 *)_pixels;
-		pos = _x;
+	endy1 = endy;
+	pixPtr = (uint16 *)_pixels;
+	pos = _x;
 
-	LABEL_17:
-		srcPtr = pixPtr;
+ LABEL_17:
+	srcPtr = pixPtr;
+	while (1) {
 		while (1) {
 			while (1) {
-                while (1) {
+				while (1) {
 					while (1) {
-						while (1) {
-							pixel = *srcPtr;
+						pixel = *srcPtr;
 
-							srcPtr++;
-							pixPtr = srcPtr;
-
-							if (pixel)
-								break;
+						srcPtr++;
+						pixPtr = srcPtr;
 
-							--endy1;
-							if (endy1 < _y) {
-								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx + 1, MIN(endy + 1, 799));
-								return;
-							}
-							pos = _x;
-						}
+						if (pixel)
+							break;
 
-						if (pixel == 0x100) {
-							g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
+						--endy1;
+						if (endy1 < _y) {
+							g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx + 1, MIN(endy + 1, 799));
 							return;
 						}
+						pos = _x;
+					}
 
-						if (pixel != 0x200)
-							break;
+					if (pixel == 0x100) {
+						g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
+						return;
+					}
 
-						pixel1 = *srcPtr;
+					if (pixel != 0x200)
+						break;
 
-						srcPtr++;
-						pos += (byte)(pixel1 & 0xff);
-						pixel1High = (pixel1 >> 8) & 0xff;
+					pixel1 = *srcPtr;
 
-						if (pixel1High) {
-							endy1 -= pixel1High;
+					srcPtr++;
+					pos += (byte)(pixel1 & 0xff);
+					pixel1High = (pixel1 >> 8) & 0xff;
 
-							if (endy1 < _y) {
-								g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, endx, endy);
-								return;
-							}
+					if (pixel1High) {
+						endy1 -= pixel1High;
+
+						if (endy1 < _y) {
+							g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, endx, endy);
+							return;
 						}
 					}
-					start1 = pos;
-					fillValue = (byte)(pixel & 0xff);
+				}
+				start1 = pos;
+				fillValue = (byte)(pixel & 0xff);
 
-					if (!fillValue)
-						break;
+				if (!fillValue)
+					break;
 
-					pos += fillValue;
-					pixoffset = -start1;
+				pos += fillValue;
+				pixoffset = -start1;
 
-					if (pixoffset <= 0)
-						goto LABEL_25;
+				if (pixoffset <= 0)
+					goto LABEL_25;
 
-					fillValue -= pixoffset;
+				fillValue -= pixoffset;
 
-					if (fillValue > 0) {
-						start1 = 0;
+				if (fillValue > 0) {
+					start1 = 0;
 
-					LABEL_25:
-						end2 = 799;
-						if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
-							if (endy1 <= endy) {
-								curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
-								int bgcolor = palette[(pixel >> 8) & 0xff];
-								colorFill(curDestPtr, fillValue, bgcolor);
-							}
-							goto LABEL_17;
+				LABEL_25:
+					end2 = 799;
+					if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
+						if (endy1 <= endy) {
+							curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
+							int bgcolor = palette[(pixel >> 8) & 0xff];
+							colorFill(curDestPtr, fillValue, bgcolor);
 						}
+						goto LABEL_17;
 					}
 				}
-				pixelHigh = (pixel >> 8) & 0xff;
-				srcPtr2 = srcPtr;
-				pos += pixelHigh;
-				srcPtr += (pixelHigh + 1) >> 1;
-				pixoffset1 = -start1;
-
-				if (pixoffset1 > 0)
-					break;
-
-			LABEL_37:
-				leftx = 799;
-				if (pos > leftx + 1) {
-					pixelHigh += leftx - pos + 1;
-					if (pixelHigh <= 0)
-						continue;
-				}
-				if (endy1 <= endy) {
-					curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
-					paletteFill(curDestPtr, (byte *)srcPtr2, pixelHigh, (int32 *)palette);
-				}
 			}
-			pixelHigh -= pixoffset1;
-			if (pixelHigh > 0) {
-				start1 = 0;
-				srcPtr2 = (uint16 *)((byte *)srcPtr2 + pixoffset1);
-				goto LABEL_37;
+			pixelHigh = (pixel >> 8) & 0xff;
+			srcPtr2 = srcPtr;
+			pos += pixelHigh;
+			srcPtr += (pixelHigh + 1) >> 1;
+			pixoffset1 = -start1;
+
+			if (pixoffset1 > 0)
+				break;
+
+		LABEL_37:
+			leftx = 799;
+			if (pos > leftx + 1) {
+				pixelHigh += leftx - pos + 1;
+				if (pixelHigh <= 0)
+					continue;
+			}
+			if (endy1 <= endy) {
+				curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
+				paletteFill(curDestPtr, (byte *)srcPtr2, pixelHigh, (int32 *)palette);
 			}
 		}
+		pixelHigh -= pixoffset1;
+		if (pixelHigh > 0) {
+			start1 = 0;
+			srcPtr2 = (uint16 *)((byte *)srcPtr2 + pixoffset1);
+			goto LABEL_37;
+		}
 	}
 
+	error("Unhandled image type");
+}
+
+void Bitmap::putDibCB(int32 *palette) {
+	uint16 *curDestPtr;
+	int endx;
+	int endy;
+	int bpp;
+	uint pitch;
+	bool cb05_format;
+	byte *srcPtr;
+	int start;
+
+	endx = _width + _x - 1;
+	endy = _height + _y - 1;
+
+	if (_x > 799 || _width + _x - 1 < 0 || _y > 599 || endy < 0)
+		return;
+
+	if (endy > 599)
+		endy = 599;
+
+	if (endx > 799)
+		endx = 799;
+
 	cb05_format = (_type == MKTAG('C', 'B', '\05', 'e'));
+
 	bpp = cb05_format ? 2 : 1;
-	end = _width + _x - 1;
-	pitch = (bpp * (endx - _x + 1) + 3) & 0xFFFFFFFC;
+	pitch = (bpp * _width + 3) & 0xFFFFFFFC;
+
+	srcPtr = &_pixels[pitch * (endy - _y)];
+
 	start = _x;
-	srcPtr1 = &_pixels[pitch * (endy - _y)];
 	if (_x < 0) {
-		srcPtr1 += bpp * -_x;
+		srcPtr += bpp * -_x;
 		start = 0;
 	}
 
-	if (endx > 799)
-		end = 799;
-
 	if (_flags & 0x1000000) {
-		for (int n = _y; n < endy; srcPtr1 -= pitch) {
-			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
-			copierKeyColor(curDestPtr, srcPtr1, end - start + 1, _flags & 0xff, (int32 *)palette, cb05_format);
-			++n;
+		for (int y = _y; y < endy; srcPtr -= pitch, y++) {
+			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, y);
+			copierKeyColor(curDestPtr, srcPtr, endx - start + 1, _flags & 0xff, (int32 *)palette, cb05_format);
 		}
 	} else {
-		for (int n = _y; n <= endy; srcPtr1 -= pitch) {
-			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, n);
-			copier(curDestPtr, srcPtr1, end - start + 1, (int32 *)palette, cb05_format);
-			++n;
+		for (int y = _y; y <= endy; srcPtr -= pitch, y++) {
+			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, y);
+			copier(curDestPtr, srcPtr, endx - start + 1, (int32 *)palette, cb05_format);
 		}
 	}
 
-	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(start, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, end, endy);
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(start, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, endx, endy);
 }
 
 void Bitmap::colorFill(uint16 *dest, int len, int32 color) {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 05ec2d9..a0f1859 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -43,6 +43,8 @@ struct Bitmap {
 
 	void load(Common::ReadStream *s);
 	void putDib(int x, int y, int32 *palette);
+	void putDibRB(int32 *palette);
+	void putDibCB(int32 *palette);
 
 	void colorFill(uint16 *dest, int len, int color);
 	void paletteFill(uint16 *dest, byte *src, int len, int32 *palette);


Commit: 0c218f01444b8917924ce38d5fafc20890d817fa
    https://github.com/scummvm/scummvm/commit/0c218f01444b8917924ce38d5fafc20890d817fa
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:02-07:00

Commit Message:
FULLPIPE: Refactored putDibRB to a human-readable state.

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 684fce5..3c0f515 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -354,6 +354,10 @@ void Picture::displayPicture() {
 
 	draw(0, 0, 0, 0);
 
+	g_fullpipe->updateEvents();
+	g_fullpipe->_system->delayMillis(10);
+	g_fullpipe->_system->updateScreen();
+
 	while (!g_fullpipe->_needQuit) {
 		g_fullpipe->updateEvents();
 		g_fullpipe->_system->delayMillis(10);
@@ -379,23 +383,14 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 void Bitmap::putDibRB(int32 *palette) {
 	uint16 *curDestPtr;
 	int endy;
-	int pos;
+	int x;
 	int start1;
-	int fillValue;
-	int pixoffset;
-	int end2;
-	int pixelHigh;
-	int pixoffset1;
-	int leftx;
+	int fillLen;
 	uint16 pixel;
-	uint16 pixel1;
-	uint pixel1High;
 	int endx;
-	int endy1;
-	uint16 *pixPtr;
+	int y;
 	uint16 *srcPtr2;
 	uint16 *srcPtr;
-	int start;
 
 	endx = _width + _x - 1;
 	endy = _height + _y - 1;
@@ -406,115 +401,85 @@ void Bitmap::putDibRB(int32 *palette) {
 	if (endy > 599)
 		endy = 599;
 
-	endy1 = endy;
-	pixPtr = (uint16 *)_pixels;
-	pos = _x;
-
- LABEL_17:
-	srcPtr = pixPtr;
-	while (1) {
-		while (1) {
-			while (1) {
-				while (1) {
-					while (1) {
-						pixel = *srcPtr;
-
-						srcPtr++;
-						pixPtr = srcPtr;
-
-						if (pixel)
-							break;
-
-						--endy1;
-						if (endy1 < _y) {
-							g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx + 1, MIN(endy + 1, 799));
-							return;
-						}
-						pos = _x;
-					}
+	if (endx > 799)
+		endx = 799;
 
-					if (pixel == 0x100) {
-						g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx, endy);
-						return;
-					}
+	y = endy;
+	srcPtr = (uint16 *)_pixels;
 
-					if (pixel != 0x200)
-						break;
+	bool breakup = false;
+	for (y = endy; y >= _y && !breakup; y--) {
+		x = _x;
 
-					pixel1 = *srcPtr;
+		while ((pixel = *srcPtr++) != 0) {
+			if (pixel == 0x100) {
+				breakup = true;
+				break;
+			}
 
-					srcPtr++;
-					pos += (byte)(pixel1 & 0xff);
-					pixel1High = (pixel1 >> 8) & 0xff;
+			while (pixel == 0x200 && y >= _y) {
+				uint16 value = *srcPtr++;
 
-					if (pixel1High) {
-						endy1 -= pixel1High;
+				x += (byte)(value & 0xff);
+				y -= (byte)((value >> 8) & 0xff);
 
-						if (endy1 < _y) {
-							g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, endx, endy);
-							return;
-						}
-					}
-				}
-				start1 = pos;
-				fillValue = (byte)(pixel & 0xff);
+				pixel = *srcPtr++;
+			}
 
-				if (!fillValue)
-					break;
+			if (y < _y || pixel == 0)
+				break;
 
-				pos += fillValue;
-				pixoffset = -start1;
+			start1 = x;
+			fillLen = (byte)(pixel & 0xff);
 
-				if (pixoffset <= 0)
-					goto LABEL_25;
+			if (fillLen) {
+				x += fillLen;
 
-				fillValue -= pixoffset;
+				if (start1 < 0) {
+					fillLen += start1;
 
-				if (fillValue > 0) {
-					start1 = 0;
+					if (fillLen > 0)
+						start1 = 0;
+				}
 
-				LABEL_25:
-					end2 = 799;
-					if (pos <= end2 + 1 || (fillValue += end2 - pos + 1, fillValue > 0)) {
-						if (endy1 <= endy) {
-							curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
+				if (fillLen > 0 || start1 >= 0) {
+					if (x <= 799 + 1 || (fillLen += 799 - x + 1, fillLen > 0)) {
+						if (y <= endy) {
+							curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
 							int bgcolor = palette[(pixel >> 8) & 0xff];
-							colorFill(curDestPtr, fillValue, bgcolor);
+							colorFill(curDestPtr, fillLen, bgcolor);
 						}
-						goto LABEL_17;
 					}
 				}
-			}
-			pixelHigh = (pixel >> 8) & 0xff;
-			srcPtr2 = srcPtr;
-			pos += pixelHigh;
-			srcPtr += (pixelHigh + 1) >> 1;
-			pixoffset1 = -start1;
+			} else {
+				fillLen = (pixel >> 8) & 0xff;
+				srcPtr2 = srcPtr;
+				x += fillLen;
+				srcPtr += (fillLen + 1) >> 1;
+
+				if (start1 < 0) {
+					fillLen += start1;
+					if (fillLen > 0) {
+						srcPtr2 = (uint16 *)((byte *)srcPtr2 - start1);
+						start1 = 0;
+					}
+				}
 
-			if (pixoffset1 > 0)
-				break;
+				if (x > 799 + 1) {
+					fillLen += 799 - x + 1;
+					if (fillLen <= 0)
+						continue;
+				}
 
-		LABEL_37:
-			leftx = 799;
-			if (pos > leftx + 1) {
-				pixelHigh += leftx - pos + 1;
-				if (pixelHigh <= 0)
-					continue;
-			}
-			if (endy1 <= endy) {
-				curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, endy1);
-				paletteFill(curDestPtr, (byte *)srcPtr2, pixelHigh, (int32 *)palette);
+				if (y <= endy) {
+					curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
+					paletteFill(curDestPtr, (byte *)srcPtr2, fillLen, (int32 *)palette);
+				}
 			}
 		}
-		pixelHigh -= pixoffset1;
-		if (pixelHigh > 0) {
-			start1 = 0;
-			srcPtr2 = (uint16 *)((byte *)srcPtr2 + pixoffset1);
-			goto LABEL_37;
-		}
 	}
 
-	error("Unhandled image type");
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx + 1, endy + 1);
 }
 
 void Bitmap::putDibCB(int32 *palette) {


Commit: cf35f34454ad1f9224481e8cfe027d8fae4b8e76
    https://github.com/scummvm/scummvm/commit/cf35f34454ad1f9224481e8cfe027d8fae4b8e76
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:02-07:00

Commit Message:
FULLPIPE: Beginning of scene drawing

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 3c0f515..71a07d0 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -51,13 +51,13 @@ Background::Background() {
 	_bigPictureArray1Count = 0;
 	_bigPictureArray2Count = 0;
 	_bigPictureArray = 0;
-	_stringObj = 0;
-	_colorMemoryObj = 0;
+	_bgname = 0;
+	_palette = 0;
 }
 
 bool Background::load(MfcArchive &file) {
 	debug(5, "Background::load()");
-	_stringObj = file.readPascalString();
+	_bgname = file.readPascalString();
 
 	int count = file.readUint16LE();
 
@@ -244,7 +244,9 @@ bool Picture::load(MfcArchive &file) {
 
 	debug(5, "Picture::load: <%s>", _memfilename);
 
+#if 0
 	displayPicture();
+#endif
 
 	return true;
 }
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index a0f1859..e4989cd 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -125,11 +125,11 @@ class Background : public CObject {
 	CPtrList _picObjList;
 
   protected:
-	char *_stringObj;
+	char *_bgname;
 	int _x;
 	int _y;
 	int16 _messageQueueId;
-	MemoryObject *_colorMemoryObj;
+	MemoryObject *_palette;
 	int _bigPictureArray1Count;
 	int _bigPictureArray2Count;
 	BigPicture ***_bigPictureArray;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 37b3560..81fa91c 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -180,16 +180,16 @@ bool Scene::load(MfcArchive &file) {
 
 	_libHandle = g_fullpipe->_currArchive;
 
-	if (_picObjList.size() > 0 && _stringObj && strlen(_stringObj) > 1) {
+	if (_picObjList.size() > 0 && _bgname && strlen(_bgname) > 1) {
 		char fname[260];
 
-		strcpy(fname, _stringObj);
+		strcpy(fname, _bgname);
 		strcpy(strrchr(fname, '.') + 1, "col");
 
 		MemoryObject *col = new MemoryObject();
 		col->loadFile(fname);
 
-		_colorMemoryObj = col;
+		_palette = col;
 	}
 
 	char *shdname = genFileName(0, _sceneId, "shd");
@@ -260,6 +260,12 @@ void Scene::updateScrolling(int par) {
 }
 
 void Scene::drawContent(int minPri, int maxPri, bool drawBG) {
+	if (!_picObjList.size() && !_bigPictureArray1Count)
+		return;
+
+	if (_palette) {
+		warning("Scene palette is ignored");
+	}
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 1a76d31..cdb5cf2 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -26,7 +26,6 @@
 namespace Fullpipe {
 
 class Scene : public Background {
-	Background _bg;
 	CPtrList _staticANIObjectList1;
 	CPtrList _staticANIObjectList2;
 	CPtrList _messageQueueList;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index c4ea1cd..d1f9e00 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -45,7 +45,6 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->addItem(ANI_INV_MAP, 1);
 
 #if 1
-		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(301);
 		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(303);


Commit: 8f0ff728e49d2b31c392471881db2bb20829d7ab
    https://github.com/scummvm/scummvm/commit/8f0ff728e49d2b31c392471881db2bb20829d7ab
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:03-07:00

Commit Message:
FULLPIPE: Rename _stringObj to relevant names in order to avoid ambiguity

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/objects.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 71a07d0..10bf105 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -181,7 +181,7 @@ bool GameObject::load(MfcArchive &file) {
 	
 	_id = file.readUint16LE();
 	
-	_stringObj = file.readPascalString();
+	_objectName = file.readPascalString();
 	_ox = file.readUint32LE();
 	_oy = file.readUint32LE();
 	_priority = file.readUint16LE();
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index e4989cd..a4f9d8f 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -97,7 +97,7 @@ class GameObject : public CObject {
 	int _field_8;
 	int16 _flags;
 	int16 _id;
-	char *_stringObj;
+	char *_objectName;
 	int _ox;
 	int _oy;
 	int _priority;
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 0258ed4..1d84305 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -47,7 +47,7 @@ class GameProject : public CObject {
 class MessageQueue : public CObject {
 	int _id;
 	int _flags;
-	char *_stringObj;
+	char *_queueName;
 	int16 _dataId;
 	int16 _field_12;
 	int _field_14;
@@ -78,7 +78,7 @@ class CInteraction : public CObject {
 	int _sceneId;
 	int _field_28;
 	int _flags;
-	char *_stringObj;
+	char *_actionName;
 
  public:
 	CInteraction();
@@ -222,7 +222,7 @@ class CGameVar : public CObject {
 	CGameVar *_parentVarObj;
 	CGameVar *_subVars;
 	CGameVar *_field_14;
-	char *_stringObj;
+	char *_varName;
 	VarValue _value;
 	int _varType;
 
@@ -292,7 +292,7 @@ class CGameLoader : public CObject {
 
 class CObjstateCommand : public CObject {
 	ExCommand _cmd;
-	char *_stringObj;
+	char *_objCommandName;
 	int _value;
 
  public:
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 81fa91c..2ce93ee 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -123,8 +123,8 @@ bool Scene::load(MfcArchive &file) {
 
 	_sceneId = file.readUint16LE();
 	
-	_scstringObj = file.readPascalString();
-	debug(0, "scene: <%s> %d", transCyrillic((byte *)_scstringObj), _sceneId);
+	_sceneName = file.readPascalString();
+	debug(0, "scene: <%s> %d", transCyrillic((byte *)_sceneName), _sceneId);
 
 	int count = file.readUint16LE();
 	debug(7, "scene.ani: %d", count);
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index cdb5cf2..639bff0 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -33,7 +33,7 @@ class Scene : public Background {
 	Shadows *_shadows;
 	SoundList *_soundList;
 	int16 _sceneId;
-	char *_scstringObj;
+	char *_sceneName;
 	int _field_BC;
 	NGIArchive *_libHandle;
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index d1f9e00..f3cf644 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -307,7 +307,7 @@ bool CInteraction::load(MfcArchive &file) {
 	_yOffs = file.readUint32LE();
 	_sceneId = file.readUint32LE();
 	_flags = file.readUint32LE();
-	_stringObj = file.readPascalString();
+	_actionName = file.readPascalString();
 
 	_messageQueue = (MessageQueue *)file.readClass();
 
@@ -332,7 +332,7 @@ bool MessageQueue::load(MfcArchive &file) {
 
 	assert(g_fullpipe->_gameProjectVersion >= 12);
 
-	_stringObj = file.readPascalString();
+	_queueName = file.readPascalString();
 
 	for (int i = 0; i < count; i++) {
 		CObject *tmp = file.readClass();
@@ -411,7 +411,7 @@ bool CObjstateCommand::load(MfcArchive &file) {
 
 	_value = file.readUint32LE();
 
-	_stringObj = file.readPascalString();
+	_objCommandName = file.readPascalString();
 
 	return true;
 }
@@ -447,14 +447,14 @@ CGameVar::CGameVar() {
 }
 
 bool CGameVar::load(MfcArchive &file) {
-	_stringObj = file.readPascalString();
+	_varName = file.readPascalString();
 	_varType = file.readUint32LE();
 
 	debugN(6, "[%03d] ", file.getLevel());
 	for (int i = 0; i < file.getLevel(); i++)
 		debugN(6, " ");
 
-	debugN(6, "<%s>: ", transCyrillic((byte *)_stringObj));
+	debugN(6, "<%s>: ", transCyrillic((byte *)_varName));
 
 	switch (_varType) {
 	case 0:
@@ -489,7 +489,7 @@ CGameVar *CGameVar::getSubVarByName(const char *name) {
 
 	if (_subVars != 0) {
 		sv = _subVars;
-		for (;sv && scumm_stricmp(sv->_stringObj, name); sv = sv->_nextVarObj)
+		for (;sv && scumm_stricmp(sv->_varName, name); sv = sv->_nextVarObj)
 			;
 	}
 	return sv;
@@ -510,8 +510,8 @@ bool CGameVar::setSubVarAsInt(const char *name, int value) {
 	var = new CGameVar();
 	var->_varType = 0;
 	var->_value.intValue = value;
-	var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
-	strcpy(var->_stringObj, name);
+	var->_varName = (char *)calloc(strlen(name) + 1, 1);
+	strcpy(var->_varName, name);
 
 	return addSubVar(var);
 }
@@ -534,8 +534,8 @@ CGameVar *CGameVar::addSubVarAsInt(const char *name, int value) {
 		var->_varType = 0;
 		var->_value.intValue = value;
 
-		var->_stringObj = (char *)calloc(strlen(name) + 1, 1);
-		strcpy(var->_stringObj, name);
+		var->_varName = (char *)calloc(strlen(name) + 1, 1);
+		strcpy(var->_varName, name);
 
 		return (addSubVar(var) != 0) ? var : 0;
 	}
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 4a2616c..cc51691 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -144,8 +144,8 @@ bool Statics::load(MfcArchive &file) {
 
 	_staticsId = file.readUint16LE();
 
-	_stringObj = file.readPascalString();
-	debug(7, "statics: <%s>", transCyrillic((byte *)_stringObj));
+	_staticsName = file.readPascalString();
+	debug(7, "statics: <%s>", transCyrillic((byte *)_staticsName));
 
 	_picture = new Picture();
 	_picture->load(file);
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 3f16878..5b27b54 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -66,7 +66,7 @@ class Statics : public DynamicPhase {
 
  	int16 _staticsId;
 	int16 _field_86;
-	char *_stringObj;
+	char *_staticsName;
 	Picture *_picture;
 
   public:


Commit: 69fc7a38bb387c3590d9a32855442e1579ff8a4e
    https://github.com/scummvm/scummvm/commit/69fc7a38bb387c3590d9a32855442e1579ff8a4e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:03-07:00

Commit Message:
FULLPIPE: Continued scene drawing

Changed paths:
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 7e34e4e..26a5a62 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -86,6 +86,8 @@ public:
 	bool _soundEnabled;
 	bool _flgSoundList;
 
+	Common::Rect _sceneRect;
+
 	bool _needQuit;
 
 	void initObjectStates();
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 10bf105..9cef7e14 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -373,8 +373,8 @@ void Picture::displayPicture() {
 }
 
 void Bitmap::putDib(int x, int y, int32 *palette) {
-	_x = x;
-	_y = y;
+	_x = x - g_fullpipe->_sceneRect.left;
+	_y = y - g_fullpipe->_sceneRect.top;
 
 	if (_type == MKTAG('R', 'B', '\0', '\0'))
 		putDibRB(palette);
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 2ce93ee..717eb0c 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -266,6 +266,20 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBG) {
 	if (_palette) {
 		warning("Scene palette is ignored");
 	}
+
+	if (_picObjList.size() > 2) { // We need to z-sort them
+		// Sort by priority
+		warning("Scene::drawContent: STUB sort by priority");
+	}
+
+	if (minPri == -1 && _picObjList.size())
+		minPri = ((PictureObject *)_picObjList.back())->_priority - 1;
+
+	if (maxPri == -1)
+		maxPri = 60000;
+
+	if (drawBg && _bigPictureArray1Count && _picObjList.size()) {
+	}
 }
 
 } // End of namespace Fullpipe


Commit: 3ab56b0cc8b0d6967aad3ac7dc9bfa54928ae199
    https://github.com/scummvm/scummvm/commit/3ab56b0cc8b0d6967aad3ac7dc9bfa54928ae199
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:03-07:00

Commit Message:
FULLPIPE: Initial code for scene switcher.

Does not even compile.

Changed paths:
  A engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
new file mode 100644
index 0000000..f04291b
--- /dev/null
+++ b/engines/fullpipe/scenes.cpp
@@ -0,0 +1,673 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+namespace Fullpipe {
+
+signed int sceneSwitcher(EntranceInfo *a1, int a2) {
+	EntranceInfo *entrance; // ebx at 1
+	Scene *scene; // esi at 1
+	CGameVar *sceneVar; // eax at 21
+	signed int result; // eax at 2
+	POINT *v6; // eax at 3
+	int v7; // eax at 3
+	CInventory2 *v8; // eax at 4
+	CInventory2 *v9; // eax at 4
+	int v10; // edi at 8
+	Sound *v11; // eax at 9
+	int v12; // ST08_4 at 12
+	int v13; // eax at 12
+	Scene *v14; // edi at 12
+	int v15; // eax at 13
+	int v16; // eax at 13
+	int v17; // eax at 13
+	int v18; // eax at 13
+	CNode *v19; // edi at 16
+	CNode *v20; // eax at 17
+	Scene *v21; // eax at 18
+	PictureObject *v22; // eax at 18
+	POINT point; // [sp+Ch] [bp-8h]@3
+
+	entrance = a1;
+	scene = accessScene(a1->_sceneId);
+
+	if (!scene)
+		return 0;
+
+	v6 = PictureObject_getDimensions((PictureObject *)scene->bg.picObjList.m_pNodeHead->data, &point);
+	g_sceneWidth = v6->x;
+	v7 = v6->y;
+	g_sceneHeight = v7;
+	g_sceneRect.top = 0;
+	g_sceneRect.left = 0;
+	g_sceneRect.right = 799;
+	g_sceneRect.bottom = 599;
+	scene->bg.x = 0;
+	scene->bg.y = 0;
+	(*(void (__stdcall **)(_DWORD, _DWORD, int))(g_aniMan->GameObject.CObject.vmt + offsetof(GameObjectVmt, setOXY)))(0, 0, a2);
+	(*(void (**)(void))(g_aniMan->GameObject.CObject.vmt + offsetof(GameObjectVmt, clearFlags)))();
+	g_aniMan->callback2 = 0;
+	g_aniMan->callback1 = 0;
+	g_aniMan->shadowsOn = 1;
+	g_scrollSpeed = 8;
+	savesEnabled = 1;
+	updateFlag = 1;
+	flgCanOpenMap = 1;
+	if (entrance->sceneId == SC_DBGMENU) {
+		g_inventoryScene = 0;
+	} else {
+		CGameLoader_loadScene(g_gameLoader, SC_INV);
+		v8 = getGameLoaderInventory();
+		CInventory2_rebuildItemRects(v8);
+		v9 = getGameLoaderInventory();
+		g_inventoryScene = CInventory2_getScene(v9);
+	}
+	if (soundEnabled) {
+		if (scene->soundList) {
+			g_currSoundListCount = 2;
+			v10 = 0;
+			g_currSoundList1 = accessScene(SC_COMMON)->soundList;
+			for (*(&g_currSoundList1 + 1) = scene->soundList; v10 < SoundList_getCount(scene->soundList); ++v10) {
+				v11 = SoundList_getSoundByItemByIndex(scene->soundList, v10);
+				(*(void (__thiscall **)(Sound *))(v11->MemoryObject.obj.vmt + offsetof(SoundVmt, updateVolume)))(v11);
+			}
+		} else {
+			g_currSoundListCount = 1;
+			g_currSoundList1 = accessScene(SC_COMMON)->soundList;
+		}
+	}
+	v12 = scene->sceneId;
+	v13 = (int)getGameLoaderInteractionController();
+	CInteractionController_sortInteractions(v13, v12);
+	v14 = g_currentScene;
+	g_currentScene = v4;
+	Scene_addStaticANIObject(scene, (int)g_aniMan, 1);
+	g_scene2 = v4;
+	g_aniMan->movementObj = 0;
+	g_aniMan->staticsObj = StaticANIObject_getStaticsById(g_aniMan, ST_MAN_EMPTY);
+	(*(void (__stdcall **)(_DWORD))(g_aniMan->GameObject.CObject.vmt + 24))(0);
+	if (g_aniMan) {
+		g_aniMan2 = (int)g_aniMan;
+		v15 = getSc2MotionControllerBySceneId(LOWORD(entrance->sceneId));
+		initMovGraph2((void *)v15);
+		v16 = getSc2MotionControllerBySceneId(LOWORD(entrance->sceneId));
+		(*(void (__thiscall **)(int, StaticANIObject *))(*(_DWORD *)v16 + offsetof(CMotionControllerVmt, addObject)))(v16, g_aniMan);
+		v17 = getSc2MotionControllerBySceneId(LOWORD(entrance->sceneId));
+		(*(void (__thiscall **)(int))(*(_DWORD *)v17 + offsetof(CMotionControllerVmt, setField8)))(v17);
+		v18 = (int)getGameLoaderInteractionController();
+		CInteractionController_enableFlag24(v18);
+		input_setInputDisabled(0);
+	} else {
+		g_aniMan2 = 0;
+	}
+	g_currentScene = v14;
+	Scene_setPictureObjectsFlag4((int)scene);
+	if (scene->staticANIObjectList1.m_nCount) {
+		v19 = scene->staticANIObjectList1.m_pNodeHead;
+		while (v19) {
+			v20 = v19;
+			v19 = v19->pNext;
+			GameObject_setFlags((GameObject *)v20->data, *((_WORD *)v20->data + 6) & 0xFE7F);
+		}
+	}
+	v21 = accessScene(SC_INV);
+	v22 = Scene_getPictureObjectById(v21, PIC_INV_MENU, 0);
+	GameObject_setFlags(&v22->GameObject, v22->GameObject.flags & 0xFFFB);
+	removeMessageHandler(2, -1);
+	g_updateScreenCallback = 0;
+
+	switch (entrance->sceneId) {
+	case SC_INTRO1:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1");
+		scene->preloadMovements(sceneVar);
+		sceneIntro_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_INTRO1");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandlerIntro, 2);
+		_updateCursorCallback = sceneIntro_updateCursor;
+		result = 1;
+		break;
+
+	case SC_1:
+		scene01_sub_40E160();
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_1");
+		scene->preloadMovements(sceneVar);
+		scene01_initScene(scene, entrance->field_4);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_1");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler01, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_2:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_2");
+		scene->preloadMovements(sceneVar);
+		scene02_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_2");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler02, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_3:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_3");
+		scene->preloadMovements(sceneVar);
+		scene03_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_3");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler03, 2);
+		j_Scene_sc03_sub_40F160(scene);
+		g_updateCursorCallback = scene03_updateCursor;
+		result = 1;
+		break;
+
+	case SC_4:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_4");
+		scene->preloadMovements(sceneVar);
+		scene04_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_4");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler04, 2, 2);
+		g_updateCursorCallback = scene04_updateCursor;
+		result = 1;
+		break;
+
+	case SC_5:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_5");
+		scene->preloadMovements(sceneVar);
+		scene05_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_5");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler05, 2, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_6:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_6");
+		scene->preloadMovements(sceneVar);
+		scene06_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_6");
+		setSceneMusicParameters(sceneVar);
+		sub_415300();
+		insertMessageHandler(sceneHandler06, 2, 2);
+		g_updateCursorCallback = scene06_updateCursor;
+		result = 1;
+		break;
+
+	case SC_7:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_7");
+		scene->preloadMovements(sceneVar);
+		scene07_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_7");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler07, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_8:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_8");
+		scene->preloadMovements(sceneVar);
+		scene08_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_8");
+		setSceneMusicParameters(sceneVar);
+		sub_416890();
+		addMessageHandler(sceneHandler08, 2);
+		g_updateCursorCallback = scene08_updateCursor;
+		result = 1;
+		break;
+
+	case SC_9:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_9");
+		scene->preloadMovements(sceneVar);
+		scene09_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_9");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler09, 2, 2);
+		g_updateCursorCallback = scene09_updateCursor;
+		result = 1;
+		break;
+
+	case SC_10:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_10");
+		scene->preloadMovements(sceneVar);
+		scene10_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_10");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler10, 2, 2);
+		g_updateCursorCallback = scene10_updateCursor;
+		result = 1;
+		break;
+
+	case SC_11:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_11");
+		scene->preloadMovements(sceneVar);
+		scene11_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_11");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler11, 2, 2);
+		scene11_sub_41A980();
+		g_updateCursorCallback = scene11_updateCursor;
+		result = 1;
+		break;
+
+	case SC_12:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_12");
+		scene->preloadMovements(sceneVar);
+		scene12_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_12");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler12, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_13:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_13");
+		scene->preloadMovements(sceneVar);
+		scene13_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_13");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler13, 2, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_14:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_14");
+		scene->preloadMovements(sceneVar);
+		scene14_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_14");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler14, 2, 2);
+		scene14_sub_41D2B0();
+		g_updateCursorCallback = scene14_updateCursor;
+		result = 1;
+		break;
+
+	case SC_15:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_15");
+		scene->preloadMovements(sceneVar);
+		scene15_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_15");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler15, 2, 2);
+		g_updateCursorCallback = scene15_updateCursor;
+		result = 1;
+		break;
+
+	case SC_16:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_16");
+		scene->preloadMovements(sceneVar);
+		scene16_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_16");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler16, 2);
+		g_updateCursorCallback = scene16_updateCursor;
+		result = 1;
+		break;
+
+	case SC_17:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_17");
+		scene->preloadMovements(sceneVar);
+		scene17_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_17");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler17, 2);
+		scene17_sub_41F060();
+		g_updateCursorCallback = scene17_updateCursor;
+		result = 1;
+		break;
+
+	case SC_18:
+		sub_40E1B0();
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_18");
+		scene->preloadMovements(sceneVar);
+		sub_4062D0();
+		if (dword_476C38)
+			scene18_initScene1(scene);
+		else
+			scene18_initScene2(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_18");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler18, 2, 2);
+		g_updateCursorCallback = scene18_updateCursor;
+		result = 1;
+		break;
+
+	case SC_19:
+		if (!g_scene3) {
+			g_scene3 = accessScene(SC_18);
+			getGameLoader()->loadScene(SC_18);
+			scene18_initScene2(g_scene3);
+			sub_40C5F0();
+			scene19_sub_420B10(g_scene3, entrance->field_4);
+			dword_476C38 = 1;
+		}
+		sub_40C650();
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_19");
+		scene->preloadMovements(sceneVar);
+		sub_4062D0();
+		if (dword_476C38)
+			scene18_initScene1(scene);
+		else
+			scene19_initScene2();
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_19");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler19, 2);
+		scene19_sub_4211D0(scene);
+		g_updateCursorCallback = scene19_updateCursor;
+		result = 1;
+		break;
+
+	case SC_20:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_20");
+		scene->preloadMovements(sceneVar);
+		scene20_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_20");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler20, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_21:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_21");
+		scene->preloadMovements(sceneVar);
+		scene21_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_21");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler21, 2, 2);
+		g_updateCursorCallback = scene21_updateCursor;
+		result = 1;
+		break;
+
+	case SC_22:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_22");
+		scene->preloadMovements(sceneVar);
+		scene22_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_22");
+		setSceneMusicParameters(sceneVar);
+		scene22_sub_4228A0();
+		insertMessageHandler(sceneHandler22, 2, 2);
+		g_updateCursorCallback = scene22_updateCursor;
+		result = 1;
+		break;
+
+	case SC_23:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_23");
+		scene->preloadMovements(sceneVar);
+		scene23_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_23");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler23, 2, 2);
+		scene23_sub_423B00();
+		g_updateCursorCallback = scene23_updateCursor;
+		result = 1;
+		break;
+
+	case SC_24:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_24");
+		scene->preloadMovements(sceneVar);
+		scene24_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_24");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler24, 2);
+		scene24_sub_423DD0();
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_25:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_25");
+		scene->preloadMovements(sceneVar);
+		scene25_initScene(scene, entrance->field_4);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_25");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler25, 2);
+		scene25_sub_4253B0(scene, entrance->field_4);
+		g_updateCursorCallback = scene25_updateCursor;
+		result = 1;
+		break;
+
+	case SC_26:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_26");
+		scene->preloadMovements(sceneVar);
+		scene26_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_26");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler26, 2, 2);
+		scene26_sub_426140(scene);
+		g_updateCursorCallback = scene26_updateCursor;
+		result = 1;
+		break;
+
+	case SC_27:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_27");
+		scene->preloadMovements(sceneVar);
+		scene27_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_27");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler27, 2);
+		g_updateCursorCallback = scene27_updateCursor;
+		result = 1;
+		break;
+
+	case SC_28:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_28");
+		scene->preloadMovements(sceneVar);
+		scene28_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_28");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler28, 2, 2);
+		g_updateCursorCallback = scene28_updateCursor;
+		result = 1;
+		break;
+
+	case SC_29:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_29");
+		scene->preloadMovements(sceneVar);
+		scene29_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_29");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler29, 2);
+		g_updateCursorCallback = scene29_updateCursor;
+		result = 1;
+		break;
+
+	case SC_30:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_30");
+		scene->preloadMovements(sceneVar);
+		scene30_initScene(scene, entrance->field_4);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_30");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler30, 2);
+		g_updateCursorCallback = scene30_updateCursor;
+		result = 1;
+		break;
+
+	case SC_31:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_31");
+		scene->preloadMovements(sceneVar);
+		scene31_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_31");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler31, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_32:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_32");
+		scene->preloadMovements(sceneVar);
+		scene32_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_32");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler32, 2, 2);
+		scene32_sub_42C5C0();
+		g_updateCursorCallback = scene32_updateCursor;
+		result = 1;
+		break;
+
+	case SC_33:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_33");
+		scene->preloadMovements(sceneVar);
+		scene33_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_33");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler33, 2, 2);
+		scene33_sub_42CEF0();
+		g_updateCursorCallback = scene33_updateCursor;
+		result = 1;
+		break;
+
+	case SC_34:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_34");
+		scene->preloadMovements(sceneVar);
+		scene34_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_34");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler34, 2, 2);
+		scene34_sub_42DEE0();
+		g_updateCursorCallback = scene34_updateCursor;
+		result = 1;
+		break;
+
+	case SC_35:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_35");
+		scene->preloadMovements(sceneVar);
+		scene35_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_35");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler35, 2, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_36:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_36");
+		scene->preloadMovements(sceneVar);
+		scene36_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_36");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler36, 2);
+		g_updateCursorCallback = scene36_updateCursor;
+		result = 1;
+		break;
+
+	case SC_37:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_37");
+		scene->preloadMovements(sceneVar);
+		scene37_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_37");
+		setSceneMusicParameters(sceneVar);
+		insertMessageHandler(sceneHandler37, 2, 2);
+		g_updateCursorCallback = scene37_updateCursor;
+		result = 1;
+		break;
+
+	case SC_38:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_38");
+		scene->preloadMovements(sceneVar);
+		scene38_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_38");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandler38, 2);
+		g_updateCursorCallback = defaultUpdateCursorCallback;
+		result = 1;
+		break;
+
+	case SC_FINAL1:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_FINAL1");
+		scene->preloadMovements(sceneVar);
+		sceneFinal1_initScene();
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_FINAL1");
+		setSceneMusicParameters(sceneVar);
+		addMessageHandler(sceneHandlerFinal1, 2);
+		g_updateCursorCallback = sceneFinal1_updateCursor;
+		result = 1;
+		break;
+
+	case SC_DBGMENU:
+		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_DBGMENU");
+		scene->preloadMovements(sceneVar);
+		sceneDbgMenu_initScene(scene);
+		_behaviorManager->initBehavior(scene, sceneVar);
+		scene->initObjectCursors("SC_DBGMENU");
+		addMessageHandler(sceneHandlerDbgMenu, 2);
+		result = 1;
+		break;
+
+	default:
+		_behaviorManager->initBehavior(0, 0);
+		result = 1;
+		break;
+	}
+
+	return result;
+}
+
+} // End of namespace Fullpipe


Commit: c76bec26467efc8cad4554cf44903c9f927d3a8c
    https://github.com/scummvm/scummvm/commit/c76bec26467efc8cad4554cf44903c9f927d3a8c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:03-07:00

Commit Message:
FULLPIPE: Further work on sceneSwitcher()

Changed paths:
  A engines/fullpipe/messagequeue.cpp
  A engines/fullpipe/messagequeue.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/module.mk
    engines/fullpipe/objects.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 3054432..fb8a141 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -30,6 +30,7 @@
 #include "fullpipe/fullpipe.h"
 #include "fullpipe/objectnames.h"
 #include "fullpipe/objects.h"
+#include "fullpipe/messagequeue.h"
 
 namespace Fullpipe {
 
@@ -58,21 +59,32 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 
 	_needQuit = false;
 
+	_aniMan = 0;
+	_scene2 = 0;
+
+	_globalMessageQueueList = 0;
+
 	g_fullpipe = this;
 }
 
 FullpipeEngine::~FullpipeEngine() {
 	delete _rnd;
+	delete _globalMessageQueueList;
 }
 
-Common::Error FullpipeEngine::run() {
+void FullpipeEngine::initialize() {
+	_globalMessageQueueList = new GlobalMessageQueueList;
+}
 
+Common::Error FullpipeEngine::run() {
 	const Graphics::PixelFormat format(2, 5, 6, 5, 0, 11, 5, 0, 0);
 	// Initialize backend
 	initGraphics(800, 600, true, &format);
 
 	_backgroundSurface.create(800, 600, format);
 
+	initialize();
+
 	_isSaveAllowed = false;
 
 	loadGam("fullpipe.gam");
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 26a5a62..31f44fd 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -49,6 +49,8 @@ class CGameVar;
 class CInventory2;
 class Scene;
 class NGIArchive;
+class StaticANIObject;
+class GlobalMessageQueueList;
 
 class FullpipeEngine : public ::Engine {
 protected:
@@ -59,6 +61,8 @@ public:
 	FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	virtual ~FullpipeEngine();
 
+	void initialize();
+
 	// Detection related functions
 	const ADGameDescription *_gameDescription;
 	const char *getGameId() const;
@@ -87,6 +91,10 @@ public:
 	bool _flgSoundList;
 
 	Common::Rect _sceneRect;
+	Scene *_scene2;
+	StaticANIObject *_aniMan;
+
+	GlobalMessageQueueList *_globalMessageQueueList;
 
 	bool _needQuit;
 
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 9cef7e14..241b799 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -162,6 +162,12 @@ bool PictureObject::load(MfcArchive &file, bool bigPicture) {
 	return true;
 }
 
+Common::Point *PictureObject::getDimensions(Common::Point *p) {
+	_picture->getDimensions(p);
+
+	return p;
+}
+
 GameObject::GameObject() {
 	_field_4 = 0;
 	_flags = 0;
@@ -273,6 +279,13 @@ void Picture::init() {
 	_bitmap->_flags |= 0x1000000;
 }
 
+Common::Point *Picture::getDimensions(Common::Point *p) {
+	p->x = _width;
+	p->y = _height;
+
+	return p;
+}
+
 void Picture::getDibInfo() {
 	int off = _dataSize & ~0xf;
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index a4f9d8f..c420ffe 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -82,6 +82,8 @@ class Picture : public MemoryObject {
 
 	byte getAlpha() { return (byte)_alpha; }
 	void setAlpha(byte alpha) { _alpha = alpha; }
+
+	Common::Point *getDimensions(Common::Point *p);
 };
 
 class BigPicture : public Picture {
@@ -118,6 +120,7 @@ class PictureObject : public GameObject {
   public:
 	PictureObject();
 	bool load(MfcArchive &file, bool bigPicture);
+	Common::Point *getDimensions(Common::Point *p);
 };
 
 class Background : public CObject {
diff --git a/engines/fullpipe/messagequeue.cpp b/engines/fullpipe/messagequeue.cpp
new file mode 100644
index 0000000..3c9e088
--- /dev/null
+++ b/engines/fullpipe/messagequeue.cpp
@@ -0,0 +1,90 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/messagequeue.h"
+
+namespace Fullpipe {
+
+MessageQueue::MessageQueue() {
+	_field_14 = 0;
+	_parId = 0;
+	_dataId = 0;
+	_id = 0;
+	_isFinished = 0;
+	_flags = 0;
+}
+
+bool MessageQueue::load(MfcArchive &file) {
+	debug(5, "MessageQueue::load()");
+
+	_dataId = file.readUint16LE();
+
+	int count = file.readUint16LE();
+
+	assert(g_fullpipe->_gameProjectVersion >= 12);
+
+	_queueName = file.readPascalString();
+
+	for (int i = 0; i < count; i++) {
+		CObject *tmp = file.readClass();
+
+		_exCommands.push_back(tmp);
+	}
+
+	_id = -1;
+	_field_14 = 0;
+	_parId = 0;
+	_isFinished = 0;
+
+	return true;
+}
+
+MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
+	for (CPtrList::iterator s = begin(); s != end(); ++s) {
+		if (((MessageQueue *)s)->_id == id)
+			return (MessageQueue *)s;
+	}
+
+	return 0;
+}
+
+void GlobalMessageQueueList::deleteQueueById(int id) {
+	for (uint i = 0; i < size(); i++)
+		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
+			delete (MessageQueue *)remove_at(i);
+
+			disableQueueById(id);
+			return;
+		}
+}
+
+void GlobalMessageQueueList::disableQueueById(int id) {
+	for (CPtrList::iterator s = begin(); s != end(); ++s) {
+		if (((MessageQueue *)s)->_parId == id)
+			((MessageQueue *)s)->_parId = 0;
+	}
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messagequeue.h b/engines/fullpipe/messagequeue.h
new file mode 100644
index 0000000..1f4cf02
--- /dev/null
+++ b/engines/fullpipe/messagequeue.h
@@ -0,0 +1,67 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_MESSAGEQUEUE_H
+#define FULLPIPE_MESSAGEQUEUE_H
+
+#include "fullpipe/utils.h"
+#include "fullpipe/inventory.h"
+#include "fullpipe/gfx.h"
+#include "fullpipe/sound.h"
+#include "fullpipe/scene.h"
+
+namespace Fullpipe {
+
+class MessageQueue : public CObject {
+	friend class GlobalMessageQueueList;
+
+  protected:
+	int _id;
+	int _flags;
+	char *_queueName;
+	int16 _dataId;
+	int16 _field_12;
+	int _field_14;
+	CPtrList _exCommands;
+	int _counter;
+	int _field_38;
+	int _isFinished;
+	int _parId;
+	int _flag1;
+
+ public:
+	MessageQueue();
+	virtual bool load(MfcArchive &file);
+
+	int getFlags() { return _flags; }
+};
+
+class GlobalMessageQueueList : public CPtrList {
+  public:
+	MessageQueue *getMessageQueueById(int id);
+	void deleteQueueById(int id);
+	void disableQueueById(int id);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_MESSAGEQUEUE_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 1b115a3..02a5626 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS = \
 	fullpipe.o \
 	gfx.o \
 	inventory.o \
+	messagequeue.o \
 	motion.o \
 	ngiarchive.o \
 	scene.o \
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 1d84305..6afab02 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -31,6 +31,8 @@
 
 namespace Fullpipe {
 
+class MessageQueue;
+
 class GameProject : public CObject {
  public:
 	int _field_4;
@@ -44,25 +46,6 @@ class GameProject : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class MessageQueue : public CObject {
-	int _id;
-	int _flags;
-	char *_queueName;
-	int16 _dataId;
-	int16 _field_12;
-	int _field_14;
-	CPtrList _exCommands;
-	int _counter;
-	int _field_38;
-	int _isFinished;
-	int _parId;
-	int _flag1;
-
- public:
-	MessageQueue();
-	virtual bool load(MfcArchive &file);
-};
-
 class CInteraction : public CObject {
 	int16 _objectId1;
 	int16 _objectId2;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 717eb0c..dec8911 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -25,6 +25,9 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/messagequeue.h"
+
+#include "fullpipe/gameobj.h"
 
 namespace Fullpipe {
 
@@ -234,6 +237,38 @@ void Scene::init() {
 	warning("STUB: Scene::init()");
 }
 
+StaticANIObject *Scene::getAniMan() {
+	StaticANIObject *aniMan = getStaticANIObject1ById(ANI_MAN, -1);
+
+	deleteStaticANIObject(aniMan);
+
+	return aniMan;
+}
+
+StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
+	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
+		StaticANIObject *o = (StaticANIObject *)s;
+		if (o->_id == obj && (a3 == -1 || o->_field_4 == a3))
+			return o;
+	}
+
+	return 0;
+}
+
+void Scene::deleteStaticANIObject(StaticANIObject *obj) {
+	for (uint n = 0; n < _staticANIObjectList1.size(); n++)
+		if ((StaticANIObject *)_staticANIObjectList1[n] == obj) {
+			_staticANIObjectList1.remove_at(n);
+			break;
+		}
+
+	for (uint n = 0; n < _staticANIObjectList2.size(); n++)
+		if ((StaticANIObject *)_staticANIObjectList2[n] == obj) {
+			_staticANIObjectList2.remove_at(n);
+			break;
+		}
+}
+
 void Scene::draw(int par) {
 	updateScrolling(par);
 
@@ -257,9 +292,10 @@ void Scene::draw(int par) {
 }
 
 void Scene::updateScrolling(int par) {
+	warning("STUB Scene::updateScrolling()");
 }
 
-void Scene::drawContent(int minPri, int maxPri, bool drawBG) {
+void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	if (!_picObjList.size() && !_bigPictureArray1Count)
 		return;
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 639bff0..8d1ea7c 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -45,6 +45,9 @@ class Scene : public Background {
 	void draw(int par);
 	void drawContent(int minPri, int maxPri, bool drawBG);
 	void updateScrolling(int par);
+	StaticANIObject *getAniMan();
+	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
+	void deleteStaticANIObject(StaticANIObject * obj);
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index f04291b..2dbe503 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -24,11 +24,8 @@
 
 namespace Fullpipe {
 
-signed int sceneSwitcher(EntranceInfo *a1, int a2) {
-	EntranceInfo *entrance; // ebx at 1
-	Scene *scene; // esi at 1
+bool FullPipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	CGameVar *sceneVar; // eax at 21
-	signed int result; // eax at 2
 	POINT *v6; // eax at 3
 	int v7; // eax at 3
 	CInventory2 *v8; // eax at 4
@@ -46,37 +43,41 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 	CNode *v20; // eax at 17
 	Scene *v21; // eax at 18
 	PictureObject *v22; // eax at 18
-	POINT point; // [sp+Ch] [bp-8h]@3
+	Common::Point sceneDim;
 
-	entrance = a1;
-	scene = accessScene(a1->_sceneId);
+	Scene *scene = accessScene(entrance->_sceneId);
 
 	if (!scene)
 		return 0;
 
-	v6 = PictureObject_getDimensions((PictureObject *)scene->bg.picObjList.m_pNodeHead->data, &point);
-	g_sceneWidth = v6->x;
-	v7 = v6->y;
-	g_sceneHeight = v7;
-	g_sceneRect.top = 0;
-	g_sceneRect.left = 0;
-	g_sceneRect.right = 799;
-	g_sceneRect.bottom = 599;
-	scene->bg.x = 0;
-	scene->bg.y = 0;
-	(*(void (__stdcall **)(_DWORD, _DWORD, int))(g_aniMan->GameObject.CObject.vmt + offsetof(GameObjectVmt, setOXY)))(0, 0, a2);
-	(*(void (**)(void))(g_aniMan->GameObject.CObject.vmt + offsetof(GameObjectVmt, clearFlags)))();
-	g_aniMan->callback2 = 0;
-	g_aniMan->callback1 = 0;
-	g_aniMan->shadowsOn = 1;
-	g_scrollSpeed = 8;
-	savesEnabled = 1;
-	updateFlag = 1;
-	flgCanOpenMap = 1;
+	((PictureObject *)_picObjList.front())->getDimensions(&sceneDim);
+	_sceneWidth = sceneDim.x;
+	_sceneHeight = sceneDim.y;
+
+	_sceneRect.top = 0;
+	_sceneRect.left = 0;
+	_sceneRect.right = 799;
+	_sceneRect.bottom = 599;
+
+	scene->_x = 0;
+	scene->_y = 0;
+
+	_aniMan->setOXY(0, 0);
+	_aniMan->clearFlags();
+	_aniMan->callback1 = 0;
+	_aniMan->callback2 = 0;
+	_aniMan->shadowsOn = 1;
+
+	_scrollSpeed = 8;
+
+	_savesEnabled = 1;
+	_updateFlag = 1;
+	_flgCanOpenMap = 1;
+
 	if (entrance->sceneId == SC_DBGMENU) {
-		g_inventoryScene = 0;
+		_inventoryScene = 0;
 	} else {
-		CGameLoader_loadScene(g_gameLoader, SC_INV);
+		_gameLoader->loadScene(SC_INV);
 		v8 = getGameLoaderInventory();
 		CInventory2_rebuildItemRects(v8);
 		v9 = getGameLoaderInventory();
@@ -146,7 +147,6 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandlerIntro, 2);
 		_updateCursorCallback = sceneIntro_updateCursor;
-		result = 1;
 		break;
 
 	case SC_1:
@@ -158,8 +158,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_1");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler01, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_2:
@@ -170,8 +169,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_2");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler02, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_3:
@@ -183,8 +181,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler03, 2);
 		j_Scene_sc03_sub_40F160(scene);
-		g_updateCursorCallback = scene03_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene03_updateCursor;
 		break;
 
 	case SC_4:
@@ -195,8 +192,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_4");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler04, 2, 2);
-		g_updateCursorCallback = scene04_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene04_updateCursor;
 		break;
 
 	case SC_5:
@@ -207,8 +203,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_5");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler05, 2, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_6:
@@ -220,8 +215,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		sub_415300();
 		insertMessageHandler(sceneHandler06, 2, 2);
-		g_updateCursorCallback = scene06_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene06_updateCursor;
 		break;
 
 	case SC_7:
@@ -232,8 +226,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_7");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler07, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_8:
@@ -245,8 +238,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		sub_416890();
 		addMessageHandler(sceneHandler08, 2);
-		g_updateCursorCallback = scene08_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene08_updateCursor;
 		break;
 
 	case SC_9:
@@ -257,8 +249,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_9");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler09, 2, 2);
-		g_updateCursorCallback = scene09_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene09_updateCursor;
 		break;
 
 	case SC_10:
@@ -269,8 +260,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_10");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler10, 2, 2);
-		g_updateCursorCallback = scene10_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene10_updateCursor;
 		break;
 
 	case SC_11:
@@ -282,8 +272,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler11, 2, 2);
 		scene11_sub_41A980();
-		g_updateCursorCallback = scene11_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene11_updateCursor;
 		break;
 
 	case SC_12:
@@ -294,8 +283,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_12");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler12, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_13:
@@ -306,8 +294,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_13");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler13, 2, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_14:
@@ -319,8 +306,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler14, 2, 2);
 		scene14_sub_41D2B0();
-		g_updateCursorCallback = scene14_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene14_updateCursor;
 		break;
 
 	case SC_15:
@@ -331,8 +317,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_15");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler15, 2, 2);
-		g_updateCursorCallback = scene15_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene15_updateCursor;
 		break;
 
 	case SC_16:
@@ -343,8 +328,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_16");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler16, 2);
-		g_updateCursorCallback = scene16_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene16_updateCursor;
 		break;
 
 	case SC_17:
@@ -356,8 +340,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler17, 2);
 		scene17_sub_41F060();
-		g_updateCursorCallback = scene17_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene17_updateCursor;
 		break;
 
 	case SC_18:
@@ -373,8 +356,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_18");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler18, 2, 2);
-		g_updateCursorCallback = scene18_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene18_updateCursor;
 		break;
 
 	case SC_19:
@@ -399,8 +381,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler19, 2);
 		scene19_sub_4211D0(scene);
-		g_updateCursorCallback = scene19_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene19_updateCursor;
 		break;
 
 	case SC_20:
@@ -411,8 +392,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_20");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler20, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_21:
@@ -423,8 +403,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_21");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler21, 2, 2);
-		g_updateCursorCallback = scene21_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene21_updateCursor;
 		break;
 
 	case SC_22:
@@ -436,8 +415,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		scene22_sub_4228A0();
 		insertMessageHandler(sceneHandler22, 2, 2);
-		g_updateCursorCallback = scene22_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene22_updateCursor;
 		break;
 
 	case SC_23:
@@ -449,8 +427,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler23, 2, 2);
 		scene23_sub_423B00();
-		g_updateCursorCallback = scene23_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene23_updateCursor;
 		break;
 
 	case SC_24:
@@ -462,8 +439,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler24, 2);
 		scene24_sub_423DD0();
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_25:
@@ -475,8 +451,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler25, 2);
 		scene25_sub_4253B0(scene, entrance->field_4);
-		g_updateCursorCallback = scene25_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene25_updateCursor;
 		break;
 
 	case SC_26:
@@ -488,8 +463,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler26, 2, 2);
 		scene26_sub_426140(scene);
-		g_updateCursorCallback = scene26_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene26_updateCursor;
 		break;
 
 	case SC_27:
@@ -500,8 +474,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_27");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler27, 2);
-		g_updateCursorCallback = scene27_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene27_updateCursor;
 		break;
 
 	case SC_28:
@@ -512,8 +485,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_28");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler28, 2, 2);
-		g_updateCursorCallback = scene28_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene28_updateCursor;
 		break;
 
 	case SC_29:
@@ -524,8 +496,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_29");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler29, 2);
-		g_updateCursorCallback = scene29_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene29_updateCursor;
 		break;
 
 	case SC_30:
@@ -536,8 +507,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_30");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler30, 2);
-		g_updateCursorCallback = scene30_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene30_updateCursor;
 		break;
 
 	case SC_31:
@@ -548,8 +518,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_31");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler31, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_32:
@@ -561,8 +530,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler32, 2, 2);
 		scene32_sub_42C5C0();
-		g_updateCursorCallback = scene32_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene32_updateCursor;
 		break;
 
 	case SC_33:
@@ -574,8 +542,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler33, 2, 2);
 		scene33_sub_42CEF0();
-		g_updateCursorCallback = scene33_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene33_updateCursor;
 		break;
 
 	case SC_34:
@@ -587,8 +554,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler34, 2, 2);
 		scene34_sub_42DEE0();
-		g_updateCursorCallback = scene34_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene34_updateCursor;
 		break;
 
 	case SC_35:
@@ -599,8 +565,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_35");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler35, 2, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_36:
@@ -611,8 +576,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_36");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler36, 2);
-		g_updateCursorCallback = scene36_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene36_updateCursor;
 		break;
 
 	case SC_37:
@@ -623,8 +587,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_37");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler37, 2, 2);
-		g_updateCursorCallback = scene37_updateCursor;
-		result = 1;
+		_updateCursorCallback = scene37_updateCursor;
 		break;
 
 	case SC_38:
@@ -635,8 +598,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_38");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler38, 2);
-		g_updateCursorCallback = defaultUpdateCursorCallback;
-		result = 1;
+		_updateCursorCallback = defaultUpdateCursorCallback;
 		break;
 
 	case SC_FINAL1:
@@ -647,8 +609,7 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		scene->initObjectCursors("SC_FINAL1");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandlerFinal1, 2);
-		g_updateCursorCallback = sceneFinal1_updateCursor;
-		result = 1;
+		_updateCursorCallback = sceneFinal1_updateCursor;
 		break;
 
 	case SC_DBGMENU:
@@ -658,16 +619,14 @@ signed int sceneSwitcher(EntranceInfo *a1, int a2) {
 		_behaviorManager->initBehavior(scene, sceneVar);
 		scene->initObjectCursors("SC_DBGMENU");
 		addMessageHandler(sceneHandlerDbgMenu, 2);
-		result = 1;
 		break;
 
 	default:
 		_behaviorManager->initBehavior(0, 0);
-		result = 1;
 		break;
 	}
 
-	return result;
+	return true;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index f3cf644..4e9b0a3 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -101,10 +101,16 @@ bool FullpipeEngine::loadGam(const char *fname) {
 
 		_inventory->rebuildItemRects();
 
-		warning("STUB: loadGam()");
 		//for (CPtrList::iterator s = _inventory->getScene()->_picObjList.begin(); s != _inventory->getScene()->_picObjList.end(); ++s) {
 		//}
+
+		//_sceneSwitcher = sceneSwitcher;
+		//_preloadCallback = gameLoaderPreloadCallback
+		//_readSavegameCallback = gameLoaderReadSavegameCallback;
+		_aniMan = accessScene(SC_COMMON)->getAniMan();
+		_scene2 = 0;
 		
+		warning("STUB: loadGam()");
 	} else
 		return false;
 
@@ -314,40 +320,6 @@ bool CInteraction::load(MfcArchive &file) {
 	return true;
 }
 
-MessageQueue::MessageQueue() {
-	_field_14 = 0;
-	_parId = 0;
-	_dataId = 0;
-	_id = 0;
-	_isFinished = 0;
-	_flags = 0;
-}
-
-bool MessageQueue::load(MfcArchive &file) {
-	debug(5, "MessageQueue::load()");
-
-	_dataId = file.readUint16LE();
-
-	int count = file.readUint16LE();
-
-	assert(g_fullpipe->_gameProjectVersion >= 12);
-
-	_queueName = file.readPascalString();
-
-	for (int i = 0; i < count; i++) {
-		CObject *tmp = file.readClass();
-
-		_exCommands.push_back(tmp);
-	}
-
-	_id = -1;
-	_field_14 = 0;
-	_parId = 0;
-	_isFinished = 0;
-
-	return true;
-}
-
 ExCommand::ExCommand() {
 	_field_3C = 1;
 	_messageNum = 0;
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index cc51691..d0abbb8 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -25,10 +25,42 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/messagequeue.h"
+
 #include "fullpipe/gameobj.h"
 
 namespace Fullpipe {
 
+CStepArray::CStepArray() {
+	_points = 0;
+	_maxPointIndex = 0;
+	_currPointIndex = 0;
+	_pointsCount = 0;
+	_isEos = 0;
+}
+
+CStepArray::~CStepArray() {
+	if (_pointsCount) {
+		for (int i = 0; i < _pointsCount; i++)
+			delete _points[i];
+
+		delete _points;
+
+		_points = 0;
+	}
+}
+
+void CStepArray::clear() {
+	_currPointIndex = 0;
+	_maxPointIndex = 0;
+	_isEos = 0;
+
+	for (int i = 0; i < _pointsCount; i++) {
+		_points[i]->x = 0;
+		_points[i]->y = 0;
+	}
+}
+
 StaticANIObject::StaticANIObject() {
 	_shadowsOn = 1;
 	_field_30 = 0;
@@ -102,6 +134,43 @@ void StaticANIObject::setOXY(int x, int y) {
 		_movementObj->setOXY(x, y);
 }
 
+void StaticANIObject::clearFlags() {
+	_flags = 0;
+
+	deleteFromGlobalMessageQueue();
+	_messageQueueId = 0;
+	_movementObj = 0;
+	_staticsObj = 0;
+	_animExFlag = 0;
+	_counter = 0;
+	_messageNum = 0;
+	_stepArray.clear();
+}
+
+void StaticANIObject::deleteFromGlobalMessageQueue() {
+	while (_messageQueueId) {
+		if (g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId)) {
+			if (!isIdle())
+				return;
+
+			g_fullpipe->_globalMessageQueueList->deleteQueueById(_messageQueueId);
+		} else {
+			_messageQueueId = 0;
+		}
+	}
+}
+
+bool StaticANIObject::isIdle() {
+	if (_messageQueueId) {
+		MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
+
+		if (m && m->getFlags() & 1)
+			return false;
+	}
+
+	return true;
+}
+
 Statics *StaticANIObject::getStaticsById(int itemId) {
 	for (uint i = 0; i < _staticsList.size(); i++)
 		if (((Statics *)_staticsList[i])->_staticsId == itemId)
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 5b27b54..d964359 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -27,10 +27,17 @@ namespace Fullpipe {
 
 class CStepArray : public CObject {
 	int _currPointIndex;
-	int _points;
+	Common::Point **_points;
 	int _maxPointIndex;
 	int _pointsCount;
 	int _isEos;
+
+  public:
+	CStepArray();
+	~CStepArray();
+	void clear();
+
+	int getCurrPointIndex() { return _currPointIndex; }
 };
 
 class StaticPhase : public Picture {
@@ -144,6 +151,11 @@ class StaticANIObject : public GameObject {
 	Statics *getStaticsById(int id);
 	Movement *getMovementById(int id);
 
+	void clearFlags();
+	bool isIdle();
+
+	void deleteFromGlobalMessageQueue();
+
 	Statics *addStatics(Statics *ani);
 	void draw();
 	void draw2();
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index f6e1925..3e153c1 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -28,6 +28,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/motion.h"
 #include "fullpipe/ngiarchive.h"
+#include "fullpipe/messagequeue.h"
 
 namespace Fullpipe {
 


Commit: 62cbdd81f0843ad10fb768e8cf97222144cb8a1e
    https://github.com/scummvm/scummvm/commit/62cbdd81f0843ad10fb768e8cf97222144cb8a1e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:03-07:00

Commit Message:
FULLPIPE: Further work on sceneSwitcher.

Reduced header dependency.
Put CGameLoader into separate files.

Changed paths:
  A engines/fullpipe/gameloader.cpp
  A engines/fullpipe/gameloader.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/module.mk
    engines/fullpipe/objects.h
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/sound.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index fb8a141..1d0b237 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -30,6 +30,7 @@
 #include "fullpipe/fullpipe.h"
 #include "fullpipe/objectnames.h"
 #include "fullpipe/objects.h"
+#include "fullpipe/gameloader.h"
 #include "fullpipe/messagequeue.h"
 
 namespace Fullpipe {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 31f44fd..6a10f23 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -44,13 +44,15 @@ enum FullpipeGameFeatures {
 };
 
 class CGameLoader;
-class GameProject;
 class CGameVar;
 class CInventory2;
-class Scene;
+class EntranceInfo;
+class GameProject;
+class GlobalMessageQueueList;
 class NGIArchive;
+class Scene;
+class SoundList;
 class StaticANIObject;
-class GlobalMessageQueueList;
 
 class FullpipeEngine : public ::Engine {
 protected:
@@ -86,14 +88,21 @@ public:
 	int _gameProjectVersion;
 	int _pictureScale;
 	int _scrollSpeed;
-	int _currSoundListCount;
-	bool _soundEnabled;
-	bool _flgSoundList;
+	bool _savesEnabled;
+	bool _updateFlag;
+	bool _flgCanOpenMap;
 
 	Common::Rect _sceneRect;
+	int _sceneWidth;
+	int _sceneHeight;
 	Scene *_scene2;
 	StaticANIObject *_aniMan;
 
+	SoundList *_currSoundList1[11];
+	int _currSoundListCount;
+	bool _soundEnabled;
+	bool _flgSoundList;
+
 	GlobalMessageQueueList *_globalMessageQueueList;
 
 	bool _needQuit;
@@ -106,11 +115,13 @@ public:
 	CGameVar *_swallowedEgg2;
 	CGameVar *_swallowedEgg3;
 
+	Scene *_inventoryScene;
 	CInventory2 *_inventory;
 
 	void setObjectState(const char *name, int state);
 	int getObjectEnumState(const char *name, const char *state);
 
+	bool sceneSwitcher(EntranceInfo *entrance);
 	Scene *accessScene(int sceneId);
 
 	NGIArchive *_currArchive;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
new file mode 100644
index 0000000..0f35fb7
--- /dev/null
+++ b/engines/fullpipe/gameloader.cpp
@@ -0,0 +1,143 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/scene.h"
+
+namespace Fullpipe {
+
+CGameLoader::CGameLoader() {
+	_interactionController = new CInteractionController();
+
+	_gameProject = 0;
+	//_gameName = "untitled";
+
+	//addMessageHandler2(CGameLoader_messageHandler1, 0, 0);
+	//insertMessageHandler(CGameLoader_messageHandler2, 0, 128);
+	//insertMessageHandler(CGameLoader_messageHandler3, 0, 1);
+
+	_field_FA = 0;
+	_field_F8 = 0;
+	_sceneSwitcher = 0;
+	_preloadCallback = 0;
+	_readSavegameCallback = 0;
+	_gameVar = 0;
+	_preloadId1 = 0;
+	_preloadId2 = 0;
+	_updateCounter = 0;
+
+	//g_x = 0;
+	//g_y = 0;
+	//dword_478480 = 0;
+	//g_objectId2 = 0;
+	//g_id = 0;
+}
+
+CGameLoader::~CGameLoader() {
+	free(_gameName);
+	delete _gameProject;
+}
+
+bool CGameLoader::load(MfcArchive &file) {
+	debug(5, "CGameLoader::load()");
+
+	_gameName = file.readPascalString();
+	debug(6, "_gameName: %s", _gameName);
+
+	_gameProject = new GameProject();
+
+	_gameProject->load(file);
+
+	g_fullpipe->_gameProject = _gameProject;
+
+	if (g_fullpipe->_gameProjectVersion < 12) {
+		error("Old gameProjectVersion: %d", g_fullpipe->_gameProjectVersion);
+	}
+
+	_gameName = file.readPascalString();
+	debug(6, "_gameName: %s", _gameName);
+
+	_inventory.load(file);
+
+	_interactionController->load(file);
+
+	debug(6, "sceneTag count: %d", _gameProject->_sceneTagList->size());
+
+	_sc2array.resize(_gameProject->_sceneTagList->size());
+
+	int i = 0;
+	for (SceneTagList::const_iterator it = _gameProject->_sceneTagList->begin(); it != _gameProject->_sceneTagList->end(); ++it, i++) {
+		char tmp[12];
+
+		snprintf(tmp, 11, "%04d.sc2", it->_sceneId);
+
+		debug(2, "sc: %s", tmp);
+
+		_sc2array[i].loadFile((const char *)tmp);
+	}
+
+	_preloadItems.load(file);
+
+	_field_FA = file.readUint16LE();
+	_field_F8 = file.readUint16LE();
+
+	_gameVar = (CGameVar *)file.readClass();
+
+	return true;
+}
+
+bool CGameLoader::loadScene(int num) {
+	SceneTag *st;
+
+	int idx = getSceneTagBySceneId(num, &st);
+
+	if (st->_scene)
+		st->loadScene();
+
+	if (st->_scene) {
+		st->_scene->init();
+
+		applyPicAniInfos(st->_scene, _sc2array[idx]._defPicAniInfos, _sc2array[idx]._defPicAniInfosCount);
+		applyPicAniInfos(st->_scene, _sc2array[idx]._picAniInfos, _sc2array[idx]._picAniInfosCount);
+
+		_sc2array[idx]._scene = st->_scene;
+		_sc2array[idx]._isLoaded = 1;
+
+		return true;
+	}
+
+	return false;
+}
+
+int CGameLoader::getSceneTagBySceneId(int num, SceneTag **st) {
+	warning("STUB: CGameLoader::getSceneTagBySceneId()");
+
+	return 0;
+}
+
+void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount) {
+	warning("STUB: CGameLoader::applyPicAniInfo()");
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
new file mode 100644
index 0000000..9322e45
--- /dev/null
+++ b/engines/fullpipe/gameloader.h
@@ -0,0 +1,76 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_GAMELOADER_H
+#define FULLPIPE_GAMELOADER_H
+
+#include "fullpipe/objects.h"
+#include "fullpipe/inventory.h"
+
+namespace Fullpipe {
+
+class SceneTag;
+
+class CGameLoader : public CObject {
+ public:
+	CGameLoader();
+	virtual ~CGameLoader();
+
+	virtual bool load(MfcArchive &file);
+	bool loadScene(int num);
+
+	int getSceneTagBySceneId(int num, SceneTag **st);
+	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
+
+	CGameVar *_gameVar;
+	CInventory2 _inventory;
+
+ private:
+	GameProject *_gameProject;
+	CInteractionController *_interactionController;
+	int _field_C;
+	int _field_10;
+	int _field_14;
+	int _field_18;
+	int _field_1C;
+	int _field_20;
+	int _field_24;
+	int _field_28;
+	int _field_2C;
+	CInputController _inputController;
+	Sc2Array _sc2array;
+	void *_sceneSwitcher;
+	void *_preloadCallback;
+	void *_readSavegameCallback;
+	int16 _field_F8;
+	int16 _field_FA;
+	PreloadItems _preloadItems;
+	char *_gameName;
+	ExCommand _exCommand;
+	int _updateCounter;
+	int _preloadId1;
+	int _preloadId2;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_GAMELOADER_H */
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 241b799..5f6d75b 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -23,6 +23,7 @@
 #include "fullpipe/fullpipe.h"
 
 #include "fullpipe/objects.h"
+#include "fullpipe/gfx.h"
 
 #include "common/memstream.h"
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index c420ffe..3340b20 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -124,6 +124,8 @@ class PictureObject : public GameObject {
 };
 
 class Background : public CObject {
+	friend class FullpipeEngine;
+
   public:
 	CPtrList _picObjList;
 
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 5c67e87..5ee85aa 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -22,10 +22,16 @@
 
 #include "fullpipe/fullpipe.h"
 
-#include "fullpipe/objects.h"
+#include "fullpipe/utils.h"
+#include "fullpipe/inventory.h"
+#include "fullpipe/gameloader.h"
 
 namespace Fullpipe {
 
+CInventory2 *getGameLoaderInventory() {
+	return &g_fullpipe->_gameLoader->_inventory;
+}
+
 bool CInventory::load(MfcArchive &file) {
 	debug(5, "CInventory::load()");
 
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 36170b8..7991e2f 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -103,6 +103,8 @@ class CInventory2 : public CInventory {
 
 };
 
+CInventory2 *getGameLoaderInventory();
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_INVENTORY_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 02a5626..cced876 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -3,12 +3,14 @@ MODULE := engines/fullpipe
 MODULE_OBJS = \
 	detection.o \
 	fullpipe.o \
+	gameloader.o \
 	gfx.o \
 	inventory.o \
 	messagequeue.o \
 	motion.o \
 	ngiarchive.o \
 	scene.o \
+	scenes.o \
 	sound.o \
 	stateloader.o \
 	statics.o \
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 6afab02..57f96b7 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -24,14 +24,11 @@
 #define FULLPIPE_OBJECTS_H
 
 #include "fullpipe/utils.h"
-#include "fullpipe/inventory.h"
-#include "fullpipe/gfx.h"
-#include "fullpipe/sound.h"
-#include "fullpipe/scene.h"
 
 namespace Fullpipe {
 
 class MessageQueue;
+class SceneTagList;
 
 class GameProject : public CObject {
  public:
@@ -124,11 +121,11 @@ struct PicAniInfo {
 };
 
 struct EntranceInfo {
-	int32 sceneId;
-	int32 field_4;
-	int32 messageQueueId;
-	byte gap_C[292]; // FIXME
-	int32 field_130;
+	int32 _sceneId;
+	int32 _field_4;
+	int32 _messageQueueId;
+	byte _gap_C[292]; // FIXME
+	int32 _field_130;
 
 	bool load(MfcArchive &file);
 };
@@ -232,47 +229,6 @@ class PreloadItems : public Common::Array<PreloadItem>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class CGameLoader : public CObject {
- public:
-	CGameLoader();
-	virtual ~CGameLoader();
-
-	virtual bool load(MfcArchive &file);
-	bool loadScene(int num);
-
-	int getSceneTagBySceneId(int num, SceneTag **st);
-	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
-
-	CGameVar *_gameVar;
-	CInventory2 _inventory;
-
- private:
-	GameProject *_gameProject;
-	CInteractionController *_interactionController;
-	int _field_C;
-	int _field_10;
-	int _field_14;
-	int _field_18;
-	int _field_1C;
-	int _field_20;
-	int _field_24;
-	int _field_28;
-	int _field_2C;
-	CInputController _inputController;
-	Sc2Array _sc2array;
-	void *_sceneSwitcher;
-	void *_preloadCallback;
-	void *_readSavegameCallback;
-	int16 _field_F8;
-	int16 _field_FA;
-	PreloadItems _preloadItems;
-	char *_gameName;
-	ExCommand _exCommand;
-	int _updateCounter;
-	int _preloadId1;
-	int _preloadId2;
-};
-
 class CObjstateCommand : public CObject {
 	ExCommand _cmd;
 	char *_objCommandName;
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 8d1ea7c..8204143 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -23,9 +23,14 @@
 #ifndef FULLPIPE_SCENE_H
 #define FULLPIPE_SCENE_H
 
+#include "fullpipe/gfx.h"
+
 namespace Fullpipe {
 
 class Scene : public Background {
+	friend class FullpipeEngine;
+
+  protected:
 	CPtrList _staticANIObjectList1;
 	CPtrList _staticANIObjectList2;
 	CPtrList _messageQueueList;
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 2dbe503..e3ebc22 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -22,27 +22,31 @@
 
 #include "fullpipe/fullpipe.h"
 
+#include "fullpipe/utils.h"
+#include "fullpipe/gfx.h"
+#include "fullpipe/objects.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/sound.h"
+
+#include "fullpipe/gameobj.h"
+
 namespace Fullpipe {
 
-bool FullPipeEngine::sceneSwitcher(EntranceInfo *entrance) {
-	CGameVar *sceneVar; // eax at 21
-	POINT *v6; // eax at 3
-	int v7; // eax at 3
-	CInventory2 *v8; // eax at 4
-	CInventory2 *v9; // eax at 4
-	int v10; // edi at 8
-	Sound *v11; // eax at 9
-	int v12; // ST08_4 at 12
-	int v13; // eax at 12
-	Scene *v14; // edi at 12
-	int v15; // eax at 13
-	int v16; // eax at 13
-	int v17; // eax at 13
-	int v18; // eax at 13
-	CNode *v19; // edi at 16
-	CNode *v20; // eax at 17
-	Scene *v21; // eax at 18
-	PictureObject *v22; // eax at 18
+bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
+	CGameVar *sceneVar;
+	int v12;
+	int v13;
+	Scene *v14;
+	int v15;
+	int v16;
+	int v17;
+	int v18;
+	CNode *v19;
+	CNode *v20;
+	Scene *v21;
+	PictureObject *v22;
 	Common::Point sceneDim;
 
 	Scene *scene = accessScene(entrance->_sceneId);
@@ -50,7 +54,7 @@ bool FullPipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	if (!scene)
 		return 0;
 
-	((PictureObject *)_picObjList.front())->getDimensions(&sceneDim);
+	((PictureObject *)scene->_picObjList.front())->getDimensions(&sceneDim);
 	_sceneWidth = sceneDim.x;
 	_sceneHeight = sceneDim.y;
 
@@ -64,39 +68,39 @@ bool FullPipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 
 	_aniMan->setOXY(0, 0);
 	_aniMan->clearFlags();
-	_aniMan->callback1 = 0;
-	_aniMan->callback2 = 0;
-	_aniMan->shadowsOn = 1;
+	_aniMan->_callback1 = 0;
+	_aniMan->_callback2 = 0;
+	_aniMan->_shadowsOn = 1;
 
 	_scrollSpeed = 8;
 
-	_savesEnabled = 1;
-	_updateFlag = 1;
-	_flgCanOpenMap = 1;
+	_savesEnabled = true;
+	_updateFlag = true;
+	_flgCanOpenMap = true;
 
-	if (entrance->sceneId == SC_DBGMENU) {
+	if (entrance->_sceneId == SC_DBGMENU) {
 		_inventoryScene = 0;
 	} else {
 		_gameLoader->loadScene(SC_INV);
-		v8 = getGameLoaderInventory();
-		CInventory2_rebuildItemRects(v8);
-		v9 = getGameLoaderInventory();
-		g_inventoryScene = CInventory2_getScene(v9);
+		getGameLoaderInventory()->rebuildItemRects();
+		_inventoryScene = getGameLoaderInventory()->getScene();
 	}
-	if (soundEnabled) {
-		if (scene->soundList) {
-			g_currSoundListCount = 2;
-			v10 = 0;
-			g_currSoundList1 = accessScene(SC_COMMON)->soundList;
-			for (*(&g_currSoundList1 + 1) = scene->soundList; v10 < SoundList_getCount(scene->soundList); ++v10) {
-				v11 = SoundList_getSoundByItemByIndex(scene->soundList, v10);
-				(*(void (__thiscall **)(Sound *))(v11->MemoryObject.obj.vmt + offsetof(SoundVmt, updateVolume)))(v11);
+	if (_soundEnabled) {
+		if (scene->_soundList) {
+			_currSoundListCount = 2;
+			_currSoundList1[0] = accessScene(SC_COMMON)->_soundList;
+			_currSoundList1[1] = scene->_soundList;
+
+			for (int i = 0; i < scene->_soundList->getCount(); i++) {
+				scene->_soundList->getSoundByIndex(i)->updateVolume();
 			}
 		} else {
-			g_currSoundListCount = 1;
-			g_currSoundList1 = accessScene(SC_COMMON)->soundList;
+			_currSoundListCount = 1;
+			_currSoundList1[0] = accessScene(SC_COMMON)->_soundList;
 		}
 	}
+
+#if 0
 	v12 = scene->sceneId;
 	v13 = (int)getGameLoaderInteractionController();
 	CInteractionController_sortInteractions(v13, v12);
@@ -625,7 +629,7 @@ bool FullPipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		_behaviorManager->initBehavior(0, 0);
 		break;
 	}
-
+#endif
 	return true;
 }
 
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index e1b2b33..8323a57 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -23,6 +23,7 @@
 #include "fullpipe/fullpipe.h"
 
 #include "fullpipe/objects.h"
+#include "fullpipe/sound.h"
 #include "fullpipe/ngiarchive.h"
 
 namespace Fullpipe {
@@ -101,4 +102,8 @@ bool Sound::load(MfcArchive &file, NGIArchive *archive) {
 	return true;
 }
 
+void Sound::updateVolume() {
+	warning("STUB Sound::updateVolume()");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.h b/engines/fullpipe/sound.h
index 4585aa7..93e994a 100644
--- a/engines/fullpipe/sound.h
+++ b/engines/fullpipe/sound.h
@@ -37,6 +37,7 @@ class Sound : public MemoryObject {
   public:
 	Sound();
 	bool load(MfcArchive &file, NGIArchive *archive);
+	void updateVolume();
 };
 
 class SoundList : public CObject {
@@ -48,6 +49,9 @@ class SoundList : public CObject {
 	SoundList();
 	bool load(MfcArchive &file, char *fname);
 	bool loadFile(const char *fname, char *libname);
+
+	int getCount() { return _soundItemsCount; }
+	Sound *getSoundByIndex(int idx) { return _soundItems[idx]; }
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 4e9b0a3..08b0991 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -27,6 +27,9 @@
 #include "common/list.h"
 
 #include "fullpipe/objects.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/scene.h"
+
 #include "fullpipe/gameobj.h"
 
 namespace Fullpipe {
@@ -40,7 +43,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 
 		//set_g_messageQueueCallback1(messageQueueCallback1);
 		//addMessageHandler2(global_messageHandler, 0, 4);
-		_inventory = &_gameLoader->_inventory;
+		_inventory = getGameLoaderInventory();
 		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
 		_inventory->addItem(ANI_INV_MAP, 1);
 
@@ -117,119 +120,6 @@ bool FullpipeEngine::loadGam(const char *fname) {
 	return true;
 }
 
-CGameLoader::CGameLoader() {
-	_interactionController = new CInteractionController();
-
-	_gameProject = 0;
-	//_gameName = "untitled";
-
-	//addMessageHandler2(CGameLoader_messageHandler1, 0, 0);
-	//insertMessageHandler(CGameLoader_messageHandler2, 0, 128);
-	//insertMessageHandler(CGameLoader_messageHandler3, 0, 1);
-
-	_field_FA = 0;
-	_field_F8 = 0;
-	_sceneSwitcher = 0;
-	_preloadCallback = 0;
-	_readSavegameCallback = 0;
-	_gameVar = 0;
-	_preloadId1 = 0;
-	_preloadId2 = 0;
-	_updateCounter = 0;
-
-	//g_x = 0;
-	//g_y = 0;
-	//dword_478480 = 0;
-	//g_objectId2 = 0;
-	//g_id = 0;
-}
-
-CGameLoader::~CGameLoader() {
-	free(_gameName);
-	delete _gameProject;
-}
-
-bool CGameLoader::load(MfcArchive &file) {
-	debug(5, "CGameLoader::load()");
-
-	_gameName = file.readPascalString();
-	debug(6, "_gameName: %s", _gameName);
-
-	_gameProject = new GameProject();
-
-	_gameProject->load(file);
-
-	g_fullpipe->_gameProject = _gameProject;
-
-	if (g_fullpipe->_gameProjectVersion < 12) {
-		error("Old gameProjectVersion: %d", g_fullpipe->_gameProjectVersion);
-	}
-
-	_gameName = file.readPascalString();
-	debug(6, "_gameName: %s", _gameName);
-
-	_inventory.load(file);
-
-	_interactionController->load(file);
-
-	debug(6, "sceneTag count: %d", _gameProject->_sceneTagList->size());
-
-	_sc2array.resize(_gameProject->_sceneTagList->size());
-
-	int i = 0;
-	for (SceneTagList::const_iterator it = _gameProject->_sceneTagList->begin(); it != _gameProject->_sceneTagList->end(); ++it, i++) {
-		char tmp[12];
-
-		snprintf(tmp, 11, "%04d.sc2", it->_sceneId);
-
-		debug(2, "sc: %s", tmp);
-
-		_sc2array[i].loadFile((const char *)tmp);
-	}
-
-	_preloadItems.load(file);
-
-	_field_FA = file.readUint16LE();
-	_field_F8 = file.readUint16LE();
-
-	_gameVar = (CGameVar *)file.readClass();
-
-	return true;
-}
-
-bool CGameLoader::loadScene(int num) {
-	SceneTag *st;
-
-	int idx = getSceneTagBySceneId(num, &st);
-
-	if (st->_scene)
-		st->loadScene();
-
-	if (st->_scene) {
-		st->_scene->init();
-
-		applyPicAniInfos(st->_scene, _sc2array[idx]._defPicAniInfos, _sc2array[idx]._defPicAniInfosCount);
-		applyPicAniInfos(st->_scene, _sc2array[idx]._picAniInfos, _sc2array[idx]._picAniInfosCount);
-
-		_sc2array[idx]._scene = st->_scene;
-		_sc2array[idx]._isLoaded = 1;
-
-		return true;
-	}
-
-	return false;
-}
-
-int CGameLoader::getSceneTagBySceneId(int num, SceneTag **st) {
-	warning("STUB: CGameLoader::getSceneTagBySceneId()");
-
-	return 0;
-}
-
-void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount) {
-	warning("STUB: CGameLoader::applyPicAniInfo()");
-}
-
 GameProject::GameProject() {
 	_field_4 = 0;
 	_headerFilename = 0;
@@ -631,11 +521,11 @@ bool PicAniInfo::load(MfcArchive &file) {
 bool EntranceInfo::load(MfcArchive &file) {
 	debug(5, "EntranceInfo::load()");
 
-	sceneId = file.readUint32LE();
-	field_4 = file.readUint32LE();
-	messageQueueId = file.readUint32LE();
-	file.read(gap_C, 292); // FIXME, Ugh
-	field_130 = file.readUint32LE();
+	_sceneId = file.readUint32LE();
+	_field_4 = file.readUint32LE();
+	_messageQueueId = file.readUint32LE();
+	file.read(_gap_C, 292); // FIXME, Ugh
+	_field_130 = file.readUint32LE();
 
 	return true;
 }
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index d964359..f8df64d 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -23,6 +23,8 @@
 #ifndef FULLPIPE_STATICS_H
 #define FULLPIPE_STATICS_H
 
+#include "fullpipe/gfx.h"
+
 namespace Fullpipe {
 
 class CStepArray : public CObject {
@@ -121,6 +123,9 @@ class Movement : public GameObject {
 };
 
 class StaticANIObject : public GameObject {
+	friend class FullpipeEngine;
+
+ protected:
 	Movement *_movementObj;
 	Statics *_staticsObj;
 	int _shadowsOn;


Commit: c4499bb4b290484cd1af35f2c354e0b2897e4a62
    https://github.com/scummvm/scummvm/commit/c4499bb4b290484cd1af35f2c354e0b2897e4a62
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:04-07:00

Commit Message:
FULLPIPE: Further work on sceneSwitcher

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/objects.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 1d0b237..436eaba 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -61,6 +61,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_needQuit = false;
 
 	_aniMan = 0;
+	_aniMan2 = 0;
+	_currentScene = 0;
 	_scene2 = 0;
 
 	_globalMessageQueueList = 0;
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 6a10f23..5050e1c 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -95,8 +95,10 @@ public:
 	Common::Rect _sceneRect;
 	int _sceneWidth;
 	int _sceneHeight;
+	Scene *_currentScene;
 	Scene *_scene2;
 	StaticANIObject *_aniMan;
+	StaticANIObject *_aniMan2;
 
 	SoundList *_currSoundList1[11];
 	int _currSoundListCount;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 0f35fb7..7f38515 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -27,6 +27,14 @@
 
 namespace Fullpipe {
 
+CInventory2 *getGameLoaderInventory() {
+	return &g_fullpipe->_gameLoader->_inventory;
+}
+
+CInteractionController *getGameLoaderInteractionController() {
+	return g_fullpipe->_gameLoader->_interactionController;
+}
+
 CGameLoader::CGameLoader() {
 	_interactionController = new CInteractionController();
 
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 9322e45..a37181d 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -43,10 +43,10 @@ class CGameLoader : public CObject {
 
 	CGameVar *_gameVar;
 	CInventory2 _inventory;
+	CInteractionController *_interactionController;
 
  private:
 	GameProject *_gameProject;
-	CInteractionController *_interactionController;
 	int _field_C;
 	int _field_10;
 	int _field_14;
@@ -71,6 +71,9 @@ class CGameLoader : public CObject {
 	int _preloadId2;
 };
 
+CInventory2 *getGameLoaderInventory();
+CInteractionController *getGameLoaderInteractionController();
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_GAMELOADER_H */
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 5f6d75b..fb94661 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -95,7 +95,7 @@ bool Background::load(MfcArchive &file) {
 
 void Background::addPictureObject(PictureObject *pct) {
 	if (pct->_field_4)
-		renumPictures(pct);
+		pct->renumPictures(&_picObjList);
 
 	bool inserted = false;
 	for (uint i = 0; i < _picObjList.size(); i++) {
@@ -111,24 +111,6 @@ void Background::addPictureObject(PictureObject *pct) {
 	}
 }
 
-void Background::renumPictures(PictureObject *pct) {
-	int *buf = (int *)calloc(_picObjList.size() + 2, sizeof(int));
-
-	for (uint i = 0; i < _picObjList.size(); i++) {
-		if (pct->_id == ((PictureObject *)_picObjList[i])->_id)
-			buf[((PictureObject *)_picObjList[i])->_field_4] = 1;
-	}
-	
-	if (buf[pct->_field_4]) {
-		uint count;
-		for (count = 1; buf[count] && count < _picObjList.size() + 2; count++)
-			;
-		pct->_field_4 = count;
-	}
-
-	free(buf);
-}
-
 PictureObject::PictureObject() {
 	_ox = 0;
 	_oy = 0;
@@ -205,6 +187,24 @@ void GameObject::setOXY(int x, int y) {
 	_oy = y;
 }
 
+void GameObject::renumPictures(CPtrList *lst) {
+	int *buf = (int *)calloc(lst->size() + 2, sizeof(int));
+
+	for (uint i = 0; i < lst->size(); i++) {
+		if (_id == ((PictureObject *)((*lst)[i]))->_id)
+			buf[((PictureObject *)((*lst)[i]))->_field_4] = 1;
+	}
+
+	if (buf[_field_4]) {
+		uint count;
+		for (count = 1; buf[count] && count < lst->size() + 2; count++)
+			;
+		_field_4 = count;
+	}
+
+	free(buf);
+}
+
 Picture::Picture() {
 	_x = 0;
 	_y = 0;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 3340b20..7eea542 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -109,6 +109,7 @@ class GameObject : public CObject {
 	GameObject();
 	virtual bool load(MfcArchive &file);
 	void setOXY(int x, int y);
+	void renumPictures(CPtrList *lst);
 };
 
 class PictureObject : public GameObject {
@@ -143,7 +144,6 @@ class Background : public CObject {
 	Background();
 	virtual bool load(MfcArchive &file);
 	void addPictureObject(PictureObject *pct);
-	void renumPictures(PictureObject *pct);
 };
 
 class Shadows : public CObject {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 5ee85aa..0480753 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -28,10 +28,6 @@
 
 namespace Fullpipe {
 
-CInventory2 *getGameLoaderInventory() {
-	return &g_fullpipe->_gameLoader->_inventory;
-}
-
 bool CInventory::load(MfcArchive &file) {
 	debug(5, "CInventory::load()");
 
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 7991e2f..36170b8 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -103,8 +103,6 @@ class CInventory2 : public CInventory {
 
 };
 
-CInventory2 *getGameLoaderInventory();
-
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_INVENTORY_H */
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 57f96b7..48bb583 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -68,12 +68,17 @@ class CInteraction : public CObject {
 class CInteractionController : public CObject {
 	CObList _interactions;
 	int16 _field_20;
-	int _flag24;
+	bool _flag24;
 
  public:
-	CInteractionController() : _field_20(0), _flag24(1) {}
+	CInteractionController() : _field_20(0), _flag24(true) {}
 
 	virtual bool load(MfcArchive &file);
+
+	void enableFlag24() { _flag24 = true; }
+	void disableFlag24() { _flag24 = false; }
+
+	void sortInteractions(int sceneId);
 };
 
 class CInputControllerItemArray {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index dec8911..ab4f817 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -269,6 +269,20 @@ void Scene::deleteStaticANIObject(StaticANIObject *obj) {
 		}
 }
 
+void Scene::addStaticANIObject(StaticANIObject *obj, bool addList2) {
+	if (obj->_field_4)
+		obj->renumPictures(&_staticANIObjectList1);
+
+	_staticANIObjectList1.push_back(obj);
+
+	if (addList2) {
+		if (!obj->_field_4)
+			obj->clearFlags();
+
+		_staticANIObjectList2.push_back(obj);
+	}
+}
+
 void Scene::draw(int par) {
 	updateScrolling(par);
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 8204143..ac47d7e 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -52,7 +52,8 @@ class Scene : public Background {
 	void updateScrolling(int par);
 	StaticANIObject *getAniMan();
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
-	void deleteStaticANIObject(StaticANIObject * obj);
+	void deleteStaticANIObject(StaticANIObject *obj);
+	void addStaticANIObject(StaticANIObject *obj, bool addList2);
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index e3ebc22..b79f32f 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -36,17 +36,6 @@ namespace Fullpipe {
 
 bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	CGameVar *sceneVar;
-	int v12;
-	int v13;
-	Scene *v14;
-	int v15;
-	int v16;
-	int v17;
-	int v18;
-	CNode *v19;
-	CNode *v20;
-	Scene *v21;
-	PictureObject *v22;
 	Common::Point sceneDim;
 
 	Scene *scene = accessScene(entrance->_sceneId);
@@ -100,48 +89,40 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		}
 	}
 
+	getGameLoaderInteractionController()->sortInteractions(scene->_sceneId);
+	_currentScene = scene;
+	scene->addStaticANIObject(_aniMan, 1);
+	_scene2 = scene;
+	_aniMan->_movementObj = 0;
+	_aniMan->_staticsObj = _aniMan->getStaticsById(ST_MAN_EMPTY);
+	_aniMan->setOXY(0, 0);
+
 #if 0
-	v12 = scene->sceneId;
-	v13 = (int)getGameLoaderInteractionController();
-	CInteractionController_sortInteractions(v13, v12);
-	v14 = g_currentScene;
-	g_currentScene = v4;
-	Scene_addStaticANIObject(scene, (int)g_aniMan, 1);
-	g_scene2 = v4;
-	g_aniMan->movementObj = 0;
-	g_aniMan->staticsObj = StaticANIObject_getStaticsById(g_aniMan, ST_MAN_EMPTY);
-	(*(void (__stdcall **)(_DWORD))(g_aniMan->GameObject.CObject.vmt + 24))(0);
-	if (g_aniMan) {
-		g_aniMan2 = (int)g_aniMan;
-		v15 = getSc2MotionControllerBySceneId(LOWORD(entrance->sceneId));
-		initMovGraph2((void *)v15);
-		v16 = getSc2MotionControllerBySceneId(LOWORD(entrance->sceneId));
-		(*(void (__thiscall **)(int, StaticANIObject *))(*(_DWORD *)v16 + offsetof(CMotionControllerVmt, addObject)))(v16, g_aniMan);
-		v17 = getSc2MotionControllerBySceneId(LOWORD(entrance->sceneId));
-		(*(void (__thiscall **)(int))(*(_DWORD *)v17 + offsetof(CMotionControllerVmt, setField8)))(v17);
-		v18 = (int)getGameLoaderInteractionController();
-		CInteractionController_enableFlag24(v18);
+	if (_aniMan) {
+		_aniMan2 = _aniMan;
+		getSc2MotionControllerBySceneId(entrance->_sceneId)->initMovGraph2();
+		getSc2MotionControllerBySceneId(entrance->_sceneId)->addObject(_aniMan);
+		getSc2MotionControllerBySceneId(entrance->_sceneId)->setEnabled();
+		getGameLoaderInteractionController()->enableFlag24();
 		input_setInputDisabled(0);
 	} else {
-		g_aniMan2 = 0;
+		_aniMan2 = 0;
 	}
-	g_currentScene = v14;
-	Scene_setPictureObjectsFlag4((int)scene);
-	if (scene->staticANIObjectList1.m_nCount) {
-		v19 = scene->staticANIObjectList1.m_pNodeHead;
-		while (v19) {
-			v20 = v19;
-			v19 = v19->pNext;
-			GameObject_setFlags((GameObject *)v20->data, *((_WORD *)v20->data + 6) & 0xFE7F);
-		}
+
+	scene->setPictureObjectsFlag4();
+
+	for (CPtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {
+		StaticANIObject *o = (StaticANIObject *)s;
+		o->setFlags(o->field_6 & 0xFE7F);
 	}
-	v21 = accessScene(SC_INV);
-	v22 = Scene_getPictureObjectById(v21, PIC_INV_MENU, 0);
-	GameObject_setFlags(&v22->GameObject, v22->GameObject.flags & 0xFFFB);
+
+	PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
+	p->setFlags(p->_flags & 0xFFFB);
+
 	removeMessageHandler(2, -1);
-	g_updateScreenCallback = 0;
+	_updateScreenCallback = 0;
 
-	switch (entrance->sceneId) {
+	switch (entrance->_sceneId) {
 	case SC_INTRO1:
 		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1");
 		scene->preloadMovements(sceneVar);
@@ -630,6 +611,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		break;
 	}
 #endif
+
 	return true;
 }
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 08b0991..c383a05 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -169,6 +169,10 @@ bool CInteractionController::load(MfcArchive &file) {
 	return _interactions.load(file);
 }
 
+void CInteractionController::sortInteractions(int sceneId) {
+	warning("STUB: CInteractionController::sortInteractions(%d)", sceneId);
+}
+
 CInputController::CInputController() {
 	// TODO
 }


Commit: 82b596a31e42bf21cec2a31a3a68c07c1936355d
    https://github.com/scummvm/scummvm/commit/82b596a31e42bf21cec2a31a3a68c07c1936355d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:04-07:00

Commit Message:
FULLPIPE: Several methods for motion controller

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/motion.h
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 7f38515..abb7098 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -31,6 +31,14 @@ CInventory2 *getGameLoaderInventory() {
 	return &g_fullpipe->_gameLoader->_inventory;
 }
 
+CMctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId) {
+	for (uint i = 0; i < g_fullpipe->_gameLoader->_sc2array.size(); i++)
+		if (g_fullpipe->_gameLoader->_sc2array[i]._sceneId == sceneId)
+			return (CMctlCompound *)g_fullpipe->_gameLoader->_sc2array[i]._motionController;
+
+	return 0;
+}
+
 CInteractionController *getGameLoaderInteractionController() {
 	return g_fullpipe->_gameLoader->_interactionController;
 }
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index a37181d..13b100c 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -29,6 +29,7 @@
 namespace Fullpipe {
 
 class SceneTag;
+class CMctlCompound;
 
 class CGameLoader : public CObject {
  public:
@@ -44,6 +45,7 @@ class CGameLoader : public CObject {
 	CGameVar *_gameVar;
 	CInventory2 _inventory;
 	CInteractionController *_interactionController;
+	Sc2Array _sc2array;
 
  private:
 	GameProject *_gameProject;
@@ -57,7 +59,6 @@ class CGameLoader : public CObject {
 	int _field_28;
 	int _field_2C;
 	CInputController _inputController;
-	Sc2Array _sc2array;
 	void *_sceneSwitcher;
 	void *_preloadCallback;
 	void *_readSavegameCallback;
@@ -73,6 +74,7 @@ class CGameLoader : public CObject {
 
 CInventory2 *getGameLoaderInventory();
 CInteractionController *getGameLoaderInteractionController();
+CMctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId);
 
 } // End of namespace Fullpipe
 
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index 39fadbe..28e4297 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -27,11 +27,16 @@ namespace Fullpipe {
 
 class CMotionController : public CObject {
 	int _field_4;
-	int _isEnabled;
+	bool _isEnabled;
 
  public:
-	CMotionController() : _isEnabled(1) {}
+	CMotionController() : _isEnabled(true) {}
 	virtual bool load(MfcArchive &file);
+
+	void setEnabled() { _isEnabled = true; }
+	void clearEnabled() { _isEnabled = false; }
+
+	virtual void addObject(StaticANIObject *obj) {}
 };
 
 class CMctlCompoundArray : public Common::Array<CObject>, public CObject {
@@ -49,6 +54,9 @@ class CMctlCompound : public CMotionController {
 
  public:
 	virtual bool load(MfcArchive &file);
+
+	virtual void addObject(StaticANIObject *obj);
+	void initMovGraph2();
 };
 
 class Unk2 : public CObject {
@@ -76,10 +84,11 @@ class CMovGraphReact : public CObject {
 	// Empty
 };
 
-class CMctlCompoundArrayItem : public CMotionController {
+class CMctlCompoundArrayItem : public CObject {
 	friend class CMctlCompound;
 
   protected:
+	CMotionController *_motionControllerObj;
 	CMovGraphReact *_movGraphReactObj;
 	CMctlConnectionPointsArray _connectionPoints;
 	int _field_20;
@@ -149,6 +158,8 @@ class CMovGraph : public CMotionController {
  public:
 	CMovGraph();
 	virtual bool load(MfcArchive &file);
+
+	virtual void addObject(StaticANIObject *obj);
 };
 
 class CMctlConnectionPoint : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index b79f32f..d0d0fab 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -29,6 +29,7 @@
 #include "fullpipe/scene.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/sound.h"
+#include "fullpipe/motion.h"
 
 #include "fullpipe/gameobj.h"
 
@@ -97,18 +98,19 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	_aniMan->_staticsObj = _aniMan->getStaticsById(ST_MAN_EMPTY);
 	_aniMan->setOXY(0, 0);
 
-#if 0
 	if (_aniMan) {
 		_aniMan2 = _aniMan;
-		getSc2MotionControllerBySceneId(entrance->_sceneId)->initMovGraph2();
-		getSc2MotionControllerBySceneId(entrance->_sceneId)->addObject(_aniMan);
-		getSc2MotionControllerBySceneId(entrance->_sceneId)->setEnabled();
+		CMctlCompound *cmp = getSc2MctlCompoundBySceneId(entrance->_sceneId);
+		cmp->initMovGraph2();
+		cmp->addObject(_aniMan);
+		cmp->setEnabled();
 		getGameLoaderInteractionController()->enableFlag24();
 		input_setInputDisabled(0);
 	} else {
 		_aniMan2 = 0;
 	}
 
+#if 0
 	scene->setPictureObjectsFlag4();
 
 	for (CPtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {


Commit: 7aa2377bf7986b77e145adb1350f99013ab35380
    https://github.com/scummvm/scummvm/commit/7aa2377bf7986b77e145adb1350f99013ab35380
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:04-07:00

Commit Message:
FULLPIPE: Initial stubs for input system

Changed paths:
  A engines/fullpipe/input.cpp
  A engines/fullpipe/input.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/module.mk
    engines/fullpipe/motion.cpp
    engines/fullpipe/objects.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 436eaba..2123d08 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -58,6 +58,9 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_soundEnabled = true;
 	_flgSoundList = true;
 
+	_inputController = 0;
+	_inputDisabled = false;
+
 	_needQuit = false;
 
 	_aniMan = 0;
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 5050e1c..468d6ca 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -45,6 +45,7 @@ enum FullpipeGameFeatures {
 
 class CGameLoader;
 class CGameVar;
+class CInputController;
 class CInventory2;
 class EntranceInfo;
 class GameProject;
@@ -100,6 +101,9 @@ public:
 	StaticANIObject *_aniMan;
 	StaticANIObject *_aniMan2;
 
+	CInputController *_inputController;
+	bool _inputDisabled;
+
 	SoundList *_currSoundList1[11];
 	int _currSoundListCount;
 	bool _soundEnabled;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index abb7098..c7b547d 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -24,6 +24,7 @@
 
 #include "fullpipe/gameloader.h"
 #include "fullpipe/scene.h"
+#include "fullpipe/input.h"
 
 namespace Fullpipe {
 
@@ -45,6 +46,7 @@ CInteractionController *getGameLoaderInteractionController() {
 
 CGameLoader::CGameLoader() {
 	_interactionController = new CInteractionController();
+	_inputController = new CInputController();
 
 	_gameProject = 0;
 	//_gameName = "untitled";
@@ -68,11 +70,15 @@ CGameLoader::CGameLoader() {
 	//dword_478480 = 0;
 	//g_objectId2 = 0;
 	//g_id = 0;
+
+	warning("STUB: CGameLoader::CGameLoader()");
 }
 
 CGameLoader::~CGameLoader() {
 	free(_gameName);
 	delete _gameProject;
+	delete _interactionController;
+	delete _inputController;
 }
 
 bool CGameLoader::load(MfcArchive &file) {
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 13b100c..ce933cb 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -30,6 +30,7 @@ namespace Fullpipe {
 
 class SceneTag;
 class CMctlCompound;
+class CInputController;
 
 class CGameLoader : public CObject {
  public:
@@ -42,29 +43,18 @@ class CGameLoader : public CObject {
 	int getSceneTagBySceneId(int num, SceneTag **st);
 	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
 
-	CGameVar *_gameVar;
-	CInventory2 _inventory;
+	GameProject *_gameProject;
 	CInteractionController *_interactionController;
+	CInputController *_inputController;
+	CInventory2 _inventory;
 	Sc2Array _sc2array;
-
- private:
-	GameProject *_gameProject;
-	int _field_C;
-	int _field_10;
-	int _field_14;
-	int _field_18;
-	int _field_1C;
-	int _field_20;
-	int _field_24;
-	int _field_28;
-	int _field_2C;
-	CInputController _inputController;
 	void *_sceneSwitcher;
 	void *_preloadCallback;
 	void *_readSavegameCallback;
 	int16 _field_F8;
 	int16 _field_FA;
 	PreloadItems _preloadItems;
+	CGameVar *_gameVar;
 	char *_gameName;
 	ExCommand _exCommand;
 	int _updateCounter;
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
new file mode 100644
index 0000000..68efacf
--- /dev/null
+++ b/engines/fullpipe/input.cpp
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/input.h"
+
+namespace Fullpipe {
+
+CInputController::CInputController() {
+	g_fullpipe->_inputController = this;
+
+	_flag = 0;
+	_cursorHandle = 0;
+	_hCursor = 0;
+	_field_14 = 0;
+	_cursorId = 0;
+	_cursorIndex = -1;
+	_flags = 1;
+
+	_cursorBounds.left = 0;
+	_cursorBounds.top = 0;
+	_cursorBounds.right = 0;
+	_cursorBounds.bottom = 0;
+
+	_cursorItemPicture = 0;
+}
+
+void CInputController::setInputDisabled(bool state) {
+	_flag = state;
+	g_fullpipe->_inputDisabled = state;
+}
+
+void setInputDisabled(bool state) {
+	g_fullpipe->_inputController->setInputDisabled(state);
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
new file mode 100644
index 0000000..a9106b7
--- /dev/null
+++ b/engines/fullpipe/input.h
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_INPUT_H
+#define FULLPIPE_INPUT_H
+
+namespace Fullpipe {
+
+void setInputDisabled(bool state);
+
+class CInputControllerItemArray : public CObArray {
+};
+
+class CInputController {
+	//CObject obj;
+	int _flag;
+	int _flags;
+	int _cursorHandle;
+	int _hCursor;
+	int _field_14;
+	int _cursorId;
+	int _cursorIndex;
+	CInputControllerItemArray _cursorsArray;
+	Common::Rect _cursorBounds;
+	int _cursorItemPicture;
+
+ public:
+	CInputController();
+	void setInputDisabled(bool state);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_INPUT_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index cced876..62d9aa3 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS = \
 	fullpipe.o \
 	gameloader.o \
 	gfx.o \
+	input.o \
 	inventory.o \
 	messagequeue.o \
 	motion.o \
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 097ef34..6defc93 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -72,6 +72,10 @@ bool CMctlCompound::load(MfcArchive &file) {
 	return true;
 }
 
+void CMctlCompound::addObject(StaticANIObject *obj) {
+	warning("STUB: CMctlCompound::addObject()");
+}
+
 bool CMctlCompoundArray::load(MfcArchive &file) {
 	debug(5, "CMctlCompoundArray::load()");
 
@@ -101,6 +105,10 @@ bool CMovGraph::load(MfcArchive &file) {
 	return true;
 }
 
+void CMovGraph::addObject(StaticANIObject *obj) {
+	warning("STUB: CMovGraph::addObject()");
+}
+
 CMovGraphLink::CMovGraphLink() {
 	_distance = 0;
 	_angle = 0;
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 48bb583..65113a9 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -81,30 +81,6 @@ class CInteractionController : public CObject {
 	void sortInteractions(int sceneId);
 };
 
-class CInputControllerItemArray {
-	CObArray objs;
-};
-
-class CInputController {
-	//CObject obj;
-	int _flag;
-	int _flags;
-	int _cursorHandle;
-	int _hCursor;
-	int _field_14;
-	int _cursorId;
-	int _cursorIndex;
-	CInputControllerItemArray _cursorsArray;
-	int _cursorDrawX;
-	int _cursorDrawY;
-	int _cursorDrawWidth;
-	int _cursorDrawHeight;
-	int _cursorItemPicture;
-
- public:
-	CInputController();
-};
-
 struct PicAniInfo {
 	int32 type;
 	int16 objectId;
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index d0d0fab..03017f6 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -30,6 +30,7 @@
 #include "fullpipe/gameloader.h"
 #include "fullpipe/sound.h"
 #include "fullpipe/motion.h"
+#include "fullpipe/input.h"
 
 #include "fullpipe/gameobj.h"
 
@@ -105,7 +106,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		cmp->addObject(_aniMan);
 		cmp->setEnabled();
 		getGameLoaderInteractionController()->enableFlag24();
-		input_setInputDisabled(0);
+		setInputDisabled(0);
 	} else {
 		_aniMan2 = 0;
 	}
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index c383a05..875b469 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -173,10 +173,6 @@ void CInteractionController::sortInteractions(int sceneId) {
 	warning("STUB: CInteractionController::sortInteractions(%d)", sceneId);
 }
 
-CInputController::CInputController() {
-	// TODO
-}
-
 CInteraction::CInteraction() {
 	_objectId1 = 0;
 	_objectId2 = 0;


Commit: 9d83eb1aeacf7bed6105875289a5960a06571035
    https://github.com/scummvm/scummvm/commit/9d83eb1aeacf7bed6105875289a5960a06571035
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:04-07:00

Commit Message:
FULLPIPE: More work on sceneSwitcher. MessageHandler

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.h
    engines/fullpipe/messagequeue.cpp
    engines/fullpipe/messagequeue.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 2123d08..bbd43b6 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -69,6 +69,9 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_scene2 = 0;
 
 	_globalMessageQueueList = 0;
+	_messageHandlers = 0;
+
+	_updateScreenCallback = 0;
 
 	g_fullpipe = this;
 }
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 468d6ca..4253499 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -50,6 +50,7 @@ class CInventory2;
 class EntranceInfo;
 class GameProject;
 class GlobalMessageQueueList;
+class MessageHandler;
 class NGIArchive;
 class Scene;
 class SoundList;
@@ -110,6 +111,7 @@ public:
 	bool _flgSoundList;
 
 	GlobalMessageQueueList *_globalMessageQueueList;
+	MessageHandler *_messageHandlers;
 
 	bool _needQuit;
 
@@ -124,6 +126,8 @@ public:
 	Scene *_inventoryScene;
 	CInventory2 *_inventory;
 
+	int (*_updateScreenCallback)(void *);
+
 	void setObjectState(const char *name, int state);
 	int getObjectEnumState(const char *name, const char *state);
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 7eea542..44919fd 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -110,6 +110,7 @@ class GameObject : public CObject {
 	virtual bool load(MfcArchive &file);
 	void setOXY(int x, int y);
 	void renumPictures(CPtrList *lst);
+	void setFlags(int16 flags) { _flags = flags; }
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/messagequeue.cpp b/engines/fullpipe/messagequeue.cpp
index 3c9e088..7688a6a 100644
--- a/engines/fullpipe/messagequeue.cpp
+++ b/engines/fullpipe/messagequeue.cpp
@@ -87,4 +87,36 @@ void GlobalMessageQueueList::disableQueueById(int id) {
 	}
 }
 
+bool removeMessageHandler(int16 id, int pos) {
+	if (g_fullpipe->_messageHandlers) {
+		MessageHandler *curItem = g_fullpipe->_messageHandlers;
+		MessageHandler *prevItem = 0;
+		int curPos = 0;
+
+		while (id != curItem->id) {
+			prevItem = curItem;
+			curItem = curItem->nextItem;
+			curPos++;
+
+			if (!curItem)
+				return false;
+		}
+
+		if (pos == -1 || curPos == pos) {
+			prevItem->nextItem = curItem->nextItem;
+			delete curItem;
+			updateMessageHandlerIndex(prevItem->nextItem, -1);
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+void updateMessageHandlerIndex(MessageHandler *msg, int offset) {
+	for (; msg; msg = msg->nextItem)
+		msg->index += offset;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/messagequeue.h b/engines/fullpipe/messagequeue.h
index 1f4cf02..bb8d410 100644
--- a/engines/fullpipe/messagequeue.h
+++ b/engines/fullpipe/messagequeue.h
@@ -62,6 +62,17 @@ class GlobalMessageQueueList : public CPtrList {
 	void disableQueueById(int id);
 };
 
+struct MessageHandler {
+	int (*callback)(ExCommand *cmd);
+	int16 id;
+	int16 field_6;
+	int index;
+	MessageHandler *nextItem;
+};
+
+bool removeMessageHandler(int16 id, int pos);
+void updateMessageHandlerIndex(MessageHandler *msg, int offset);
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_MESSAGEQUEUE_H */
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index ab4f817..3bc7c9d 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -283,6 +283,21 @@ void Scene::addStaticANIObject(StaticANIObject *obj, bool addList2) {
 	}
 }
 
+void Scene::setPictureObjectsFlag4() {
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		((PictureObject *)_picObjList[i])->_flags |= 4;
+	}
+}
+
+PictureObject *Scene::getPictureObjectById(int objId, int flags) {
+	for (uint i = 1; i < _picObjList.size(); i++) {
+		if(((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_field_4 == flags)
+			return (PictureObject *)_picObjList[i];
+	}
+
+	return 0;
+}
+
 void Scene::draw(int par) {
 	updateScrolling(par);
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index ac47d7e..4085b05 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -54,6 +54,8 @@ class Scene : public Background {
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
 	void deleteStaticANIObject(StaticANIObject *obj);
 	void addStaticANIObject(StaticANIObject *obj, bool addList2);
+	void setPictureObjectsFlag4();
+	PictureObject *getPictureObjectById(int objId, int flags);
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 03017f6..46ef73a 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -31,6 +31,7 @@
 #include "fullpipe/sound.h"
 #include "fullpipe/motion.h"
 #include "fullpipe/input.h"
+#include "fullpipe/messagequeue.h"
 
 #include "fullpipe/gameobj.h"
 
@@ -111,12 +112,11 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		_aniMan2 = 0;
 	}
 
-#if 0
 	scene->setPictureObjectsFlag4();
 
 	for (CPtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {
 		StaticANIObject *o = (StaticANIObject *)s;
-		o->setFlags(o->field_6 & 0xFE7F);
+		o->setFlags(o->_field_6 & 0xFE7F);
 	}
 
 	PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
@@ -125,6 +125,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	removeMessageHandler(2, -1);
 	_updateScreenCallback = 0;
 
+#if 0
 	switch (entrance->_sceneId) {
 	case SC_INTRO1:
 		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1");


Commit: 4dc47c5c08d44766fe75e2e982f0cea05b8238aa
    https://github.com/scummvm/scummvm/commit/4dc47c5c08d44766fe75e2e982f0cea05b8238aa
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:04-07:00

Commit Message:
FULLPIPE: More message handler-related functions

Changed paths:
    engines/fullpipe/messagequeue.cpp
    engines/fullpipe/messagequeue.h



diff --git a/engines/fullpipe/messagequeue.cpp b/engines/fullpipe/messagequeue.cpp
index 7688a6a..9d2ec38 100644
--- a/engines/fullpipe/messagequeue.cpp
+++ b/engines/fullpipe/messagequeue.cpp
@@ -119,4 +119,140 @@ void updateMessageHandlerIndex(MessageHandler *msg, int offset) {
 		msg->index += offset;
 }
 
+void addMessageHandler(int (*callback)(ExCommand *), int16 id) {
+	if (getMessageHandlerById(id))
+		return;
+
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	if (!curItem)
+		return;
+
+	int index = 0;
+	for (MessageHandler *i = g_fullpipe->_messageHandlers->nextItem; i; i = i->nextItem) {
+		curItem = i;
+		index++;
+	}
+
+	allocMessageHandler(curItem, id, callback, index);
+
+	if (curItem)
+      updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
+
+}
+
+MessageHandler *getMessageHandlerById(int16 id) {
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	if (!curItem)
+		return 0;
+
+	while (id != curItem->id) {
+		curItem = curItem->nextItem;
+
+		if (!curItem)
+			return 0;
+	}
+
+	return curItem;
+}
+
+bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index) {
+	MessageHandler *msg = new MessageHandler;
+
+	if (where) {
+		msg->nextItem = where->nextItem;
+		where->nextItem = msg;
+		msg->id = id;
+		msg->callback = callback;
+		msg->index = index;
+	} else {
+		msg->nextItem = 0;
+		msg->id = id;
+		msg->callback = callback;
+		msg->index = 0;
+
+		g_fullpipe->_messageHandlers = msg;
+	}
+
+	return true;
+}
+
+int getMessageHandlersCount() {
+	int result;
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	for (result = 0; curItem; result++)
+		curItem = curItem->nextItem;
+
+	return result;
+}
+
+bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id) {
+	if (getMessageHandlerById(id))
+		return false;
+
+	if (index) {
+		MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+		for (int i = index - 1; i > 0; i--)
+			if (curItem)
+				curItem = curItem->nextItem;
+
+		bool res = allocMessageHandler(curItem, id, callback, index);
+
+		if (res)
+			updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
+
+		return res;
+	} else {
+		MessageHandler *newItem = new MessageHandler;
+
+		newItem->nextItem = g_fullpipe->_messageHandlers;
+		newItem->id = id;
+		newItem->callback = callback;
+		newItem->index = 0;
+
+		updateMessageHandlerIndex(g_fullpipe->_messageHandlers, 1);
+		g_fullpipe->_messageHandlers = newItem;
+
+		return true;
+	}
+}
+
+bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id) {
+	if (getMessageHandlerById(id))
+		return false;
+
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	for (int i = index; i > 0; i--)
+		if (curItem)
+			curItem = curItem->nextItem;
+
+	bool res = allocMessageHandler(curItem, id, callback, index + 1);
+	if (curItem)
+		updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
+
+	return res;
+}
+
+void clearMessageHandlers() {
+	MessageHandler *curItem;
+	MessageHandler *nextItem;
+
+	curItem = g_fullpipe->_messageHandlers;
+	if (curItem) {
+		do {
+			nextItem = curItem->nextItem;
+
+			delete curItem;
+
+			curItem = nextItem;
+		} while (nextItem);
+
+		g_fullpipe->_messageHandlers = 0;
+	}
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/messagequeue.h b/engines/fullpipe/messagequeue.h
index bb8d410..b47bf49 100644
--- a/engines/fullpipe/messagequeue.h
+++ b/engines/fullpipe/messagequeue.h
@@ -72,6 +72,14 @@ struct MessageHandler {
 
 bool removeMessageHandler(int16 id, int pos);
 void updateMessageHandlerIndex(MessageHandler *msg, int offset);
+void addMessageHandler(int (*callback)(ExCommand *), int16 id);
+MessageHandler *getMessageHandlerById(int16 id);
+bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index);
+int getMessageHandlersCount();
+bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id);
+bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
+void clearMessageHandlers();
+
 
 } // End of namespace Fullpipe
 


Commit: 22eedf56002b0d1b92d5bf51ff790cc7ac036151
    https://github.com/scummvm/scummvm/commit/22eedf56002b0d1b92d5bf51ff790cc7ac036151
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:05-07:00

Commit Message:
FULLPIPE: Further work on Scene switcher

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index bbd43b6..bcaca93 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -72,6 +72,9 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_messageHandlers = 0;
 
 	_updateScreenCallback = 0;
+	_updateCursorCallback = 0;
+
+	_cursorId = 0;
 
 	g_fullpipe = this;
 }
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 4253499..ecc2a03 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -127,6 +127,9 @@ public:
 	CInventory2 *_inventory;
 
 	int (*_updateScreenCallback)(void *);
+	int (*_updateCursorCallback)();
+
+	int _cursorId;
 
 	void setObjectState(const char *name, int state);
 	int getObjectEnumState(const char *name, const char *state);
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 3bc7c9d..4409215 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -255,6 +255,16 @@ StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
 	return 0;
 }
 
+StaticANIObject *Scene::getStaticANIObject1ByName(char *name, int a3) {
+	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
+		StaticANIObject *o = (StaticANIObject *)s;
+		if (!strcmp(o->_objectName, name) && (a3 == -1 || o->_field_4 == a3))
+			return o;
+	}
+
+	return 0;
+}
+
 void Scene::deleteStaticANIObject(StaticANIObject *obj) {
 	for (uint n = 0; n < _staticANIObjectList1.size(); n++)
 		if ((StaticANIObject *)_staticANIObjectList1[n] == obj) {
@@ -298,6 +308,35 @@ PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 	return 0;
 }
 
+void Scene::preloadMovements(CGameVar *var) {
+	CGameVar *preload = var->getSubVarByName("PRELOAD");
+	if (!preload)
+		return;
+
+	for (CGameVar *i = preload->_subVars; i; i = i->_nextVarObj) {
+		StaticANIObject *ani = getStaticANIObject1ByName(i->_varName, -1);
+
+		if (ani) {
+			CGameVar *subVars = i->_subVars;
+
+			if (subVars) {
+				for (;subVars; subVars = subVars->_nextVarObj) {
+					Movement *mov = ani->getMovementByName(subVars->_varName);
+
+					if (mov)
+						mov->loadPixelData();
+				}
+			} else {
+				ani->loadMovementsPixelData();
+			}
+		}
+    }
+}
+
+void Scene::initObjectCursors(const char *name) {
+	warning("STUB: Scene::initObjectCursors(%s)", name);
+}
+
 void Scene::draw(int par) {
 	updateScrolling(par);
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 4085b05..cc2e2ed 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -44,18 +44,27 @@ class Scene : public Background {
 
   public:
 	Scene();
+
 	virtual bool load(MfcArchive &file);
+
 	void initStaticANIObjects();
 	void init();
 	void draw(int par);
 	void drawContent(int minPri, int maxPri, bool drawBG);
 	void updateScrolling(int par);
+
 	StaticANIObject *getAniMan();
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
+	StaticANIObject *getStaticANIObject1ByName(char *name, int a3);
+
 	void deleteStaticANIObject(StaticANIObject *obj);
 	void addStaticANIObject(StaticANIObject *obj, bool addList2);
+
 	void setPictureObjectsFlag4();
 	PictureObject *getPictureObjectById(int objId, int flags);
+	void preloadMovements(CGameVar *var);
+
+	void initObjectCursors(const char *name);
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 46ef73a..c0a6a82 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -37,6 +37,9 @@
 
 namespace Fullpipe {
 
+int sceneIntro_updateCursor();
+void sceneIntro_initScene(Scene *sc);
+
 bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	CGameVar *sceneVar;
 	Common::Point sceneDim;
@@ -125,7 +128,6 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	removeMessageHandler(2, -1);
 	_updateScreenCallback = 0;
 
-#if 0
 	switch (entrance->_sceneId) {
 	case SC_INTRO1:
 		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1");
@@ -138,6 +140,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		_updateCursorCallback = sceneIntro_updateCursor;
 		break;
 
+#if 0
 	case SC_1:
 		scene01_sub_40E160();
 		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_1");
@@ -609,14 +612,39 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_DBGMENU");
 		addMessageHandler(sceneHandlerDbgMenu, 2);
 		break;
+#endif
 
 	default:
 		_behaviorManager->initBehavior(0, 0);
 		break;
 	}
-#endif
 
 	return true;
 }
 
+int sceneIntro_updateCursor() {
+	g_fullpipe->_cursorId = 0;
+
+	return 0;
+}
+
+void sceneIntro_initScene(Scene *sc) {
+	g_fullpipe->_gameLoader->loadScene(SC_INTRO2);
+
+	warning("STUB: FullpipeEngine::sceneIntro_initScene()");
+
+#if 0
+	sceneIntro_aniin1man = sc->_getStaticANIObject1ById(ANI_IN1MAN, -1);
+	sceneIntro_needSleep = 1;
+	sceneIntro_needGetup = 0;
+	sceneIntro_dword_477938 = 1;
+	sceneIntro_dword_477934 = 0;
+
+	if (g_fullpipe->_recordEvents || g_fullpipe->_inputArFlag)
+		sceneIntro_skipIntro = 0;
+
+	g_fullpipe->_modalObject = new CModalIntro;
+#endif
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index d0abbb8..b84703e 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -187,6 +187,19 @@ Movement *StaticANIObject::getMovementById(int itemId) {
 	return 0;
 }
 
+Movement *StaticANIObject::getMovementByName(char *name) {
+	for (uint i = 0; i < _movements.size(); i++)
+		if (!strcmp(((Movement *)_movements[i])->_objectName, name))
+			return (Movement *)_movements[i];
+
+	return 0;
+}
+
+void StaticANIObject::loadMovementsPixelData() {
+	for (uint i = 0; i < _movements.size(); i++)
+		((Movement *)_movements[i])->loadPixelData();
+}
+
 Statics *StaticANIObject::addStatics(Statics *ani) {
 	warning("STUB: StaticANIObject::addStatics");
 
@@ -351,6 +364,20 @@ void Movement::updateCurrDynamicPhase() {
 	}
 }
 
+void Movement::loadPixelData() {
+	Movement *mov = this;
+	for (Movement *i = _currMovementObj; i; i = i->_currMovementObj)
+		mov = i;
+
+	for (uint i = 0; i < _dynamicPhases.size(); i++) {
+		if ((Statics *)_dynamicPhases[i] != mov->_staticsObj2 || !(mov->_staticsObj2->_staticsId & 0x4000) )
+			((Statics *)_dynamicPhases[i])->getPixelData();
+	}
+
+	if (!(mov->_staticsObj1->_staticsId & 0x4000))
+		mov->_staticsObj1->getPixelData();
+}
+
 DynamicPhase::DynamicPhase() {
 	_someX = 0;
 	_rect = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index f8df64d..04a4863 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -120,6 +120,8 @@ class Movement : public GameObject {
 
 	void initStatics(StaticANIObject *ani);
 	void updateCurrDynamicPhase();
+
+	void loadPixelData();
 };
 
 class StaticANIObject : public GameObject {
@@ -155,12 +157,15 @@ class StaticANIObject : public GameObject {
 	void setOXY(int x, int y);
 	Statics *getStaticsById(int id);
 	Movement *getMovementById(int id);
+	Movement *getMovementByName(char *name);
 
 	void clearFlags();
 	bool isIdle();
 
 	void deleteFromGlobalMessageQueue();
 
+	void loadMovementsPixelData();
+
 	Statics *addStatics(Statics *ani);
 	void draw();
 	void draw2();


Commit: f54055d1eece57b4d939e1d0a96cbb379b955b39
    https://github.com/scummvm/scummvm/commit/f54055d1eece57b4d939e1d0a96cbb379b955b39
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:05-07:00

Commit Message:
FULLPIPE: Finished stubbing SceneSwitcher. Added Behavior Manager

Changed paths:
  A engines/fullpipe/behavior.cpp
  A engines/fullpipe/behavior.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/module.mk
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
new file mode 100644
index 0000000..e9d4be8
--- /dev/null
+++ b/engines/fullpipe/behavior.cpp
@@ -0,0 +1,39 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/behavior.h"
+
+namespace Fullpipe {
+
+BehaviorManager::BehaviorManager() {
+	_scene = 0;
+	_isActive = 1;
+}
+
+void BehaviorManager::initBehavior(Scene *scene, CGameVar *var) {
+	warning("STUB: initBehavior()");
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
new file mode 100644
index 0000000..5e3b090
--- /dev/null
+++ b/engines/fullpipe/behavior.h
@@ -0,0 +1,66 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_BEHAVIOR_H
+#define FULLPIPE_BEHAVIOR_H
+
+namespace Fullpipe {
+
+class BehaviorManager : public CObject {
+	CObArray _behaviors;
+	Scene *_scene;
+	bool _isActive;
+
+  public:
+	BehaviorManager();
+
+	void initBehavior(Scene *scene, CGameVar *var);
+};
+
+struct BehaviorEntryInfo {
+	int _messageQueue;
+	int _delay;
+	int _percent;
+	int _flags;
+};
+
+struct BehaviorEntry {
+	int _staticsId;
+	int _itemsCount;
+	int _flags;
+	BehaviorEntryInfo *_items;
+};
+
+struct BehaviorInfo {
+	StaticANIObject *_ani;
+	int _staticsId;
+	int _counter;
+	int _counterMax;
+	int _flags;
+	int _subIndex;
+	int _itemsCount;
+	BehaviorEntryInfo *_items;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_BEHAVIOR_H */
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index bcaca93..fa332d1 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -32,6 +32,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/messagequeue.h"
+#include "fullpipe/behavior.h"
 
 namespace Fullpipe {
 
@@ -74,6 +75,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_updateScreenCallback = 0;
 	_updateCursorCallback = 0;
 
+	_behaviorManager = 0;
+
 	_cursorId = 0;
 
 	g_fullpipe = this;
@@ -86,6 +89,7 @@ FullpipeEngine::~FullpipeEngine() {
 
 void FullpipeEngine::initialize() {
 	_globalMessageQueueList = new GlobalMessageQueueList;
+	_behaviorManager = new BehaviorManager;
 }
 
 Common::Error FullpipeEngine::run() {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index ecc2a03..4415115 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -43,6 +43,7 @@ namespace Fullpipe {
 enum FullpipeGameFeatures {
 };
 
+class BehaviorManager;
 class CGameLoader;
 class CGameVar;
 class CInputController;
@@ -113,6 +114,8 @@ public:
 	GlobalMessageQueueList *_globalMessageQueueList;
 	MessageHandler *_messageHandlers;
 
+	BehaviorManager *_behaviorManager;
+
 	bool _needQuit;
 
 	void initObjectStates();
@@ -136,6 +139,7 @@ public:
 
 	bool sceneSwitcher(EntranceInfo *entrance);
 	Scene *accessScene(int sceneId);
+	void setSceneMusicParameters(CGameVar *var);
 
 	NGIArchive *_currArchive;
 
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 62d9aa3..934d916 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -1,6 +1,7 @@
 MODULE := engines/fullpipe
 
 MODULE_OBJS = \
+	behavior.o \
 	detection.o \
 	fullpipe.o \
 	gameloader.o \
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index c0a6a82..9359709 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -32,6 +32,7 @@
 #include "fullpipe/motion.h"
 #include "fullpipe/input.h"
 #include "fullpipe/messagequeue.h"
+#include "fullpipe/behavior.h"
 
 #include "fullpipe/gameobj.h"
 
@@ -39,6 +40,7 @@ namespace Fullpipe {
 
 int sceneIntro_updateCursor();
 void sceneIntro_initScene(Scene *sc);
+int sceneHandlerIntro(ExCommand *cmd);
 
 bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	CGameVar *sceneVar;
@@ -631,7 +633,7 @@ int sceneIntro_updateCursor() {
 void sceneIntro_initScene(Scene *sc) {
 	g_fullpipe->_gameLoader->loadScene(SC_INTRO2);
 
-	warning("STUB: FullpipeEngine::sceneIntro_initScene()");
+	warning("STUB: sceneIntro_initScene()");
 
 #if 0
 	sceneIntro_aniin1man = sc->_getStaticANIObject1ById(ANI_IN1MAN, -1);
@@ -647,4 +649,10 @@ void sceneIntro_initScene(Scene *sc) {
 #endif
 }
 
+int sceneHandlerIntro(ExCommand *cmd) {
+	warning("STUB: sceneHandlerIntro()");
+
+	return 0;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 8323a57..ced3bf1 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -106,4 +106,8 @@ void Sound::updateVolume() {
 	warning("STUB Sound::updateVolume()");
 }
 
+void FullpipeEngine::setSceneMusicParameters(CGameVar *var) {
+	warning("STUB: FullpipeEngine::setSceneMusicParameters()");
+}
+
 } // End of namespace Fullpipe


Commit: dbe5524fe036e51ebaafa900ce237b85e79020e8
    https://github.com/scummvm/scummvm/commit/dbe5524fe036e51ebaafa900ce237b85e79020e8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:05-07:00

Commit Message:
FULLPIPE: First part of scene drawing code

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/motion.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index fa332d1..2e04444 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -105,6 +105,25 @@ Common::Error FullpipeEngine::run() {
 
 	loadGam("fullpipe.gam");
 
+	EntranceInfo ent;
+
+	ent._sceneId = 3896;
+	sceneSwitcher(&ent);
+
+	while (!g_fullpipe->_needQuit) {
+		updateEvents();
+		_system->delayMillis(10);
+		_system->updateScreen();
+
+		_currentScene->draw();
+
+		if (g_fullpipe->_keyState == ' ') {
+			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+			break;
+		}
+	}
+
+
 	return Common::kNoError;
 }
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 44919fd..4f89f39 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -111,6 +111,7 @@ class GameObject : public CObject {
 	void setOXY(int x, int y);
 	void renumPictures(CPtrList *lst);
 	void setFlags(int16 flags) { _flags = flags; }
+	void clearFlags() { _flags = 0; }
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 6defc93..fed3cb7 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -76,6 +76,10 @@ void CMctlCompound::addObject(StaticANIObject *obj) {
 	warning("STUB: CMctlCompound::addObject()");
 }
 
+	void CMctlCompound::initMovGraph2() {
+	warning("STUB: CMctlCompound::initMovGraph2()");
+}
+
 bool CMctlCompoundArray::load(MfcArchive &file) {
 	debug(5, "CMctlCompoundArray::load()");
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 4409215..87ef2bd 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -29,6 +29,8 @@
 
 #include "fullpipe/gameobj.h"
 
+#include "common/algorithm.h"
+
 namespace Fullpipe {
 
 Scene *FullpipeEngine::accessScene(int sceneId) {
@@ -224,7 +226,8 @@ bool Scene::load(MfcArchive &file) {
 
 	initStaticANIObjects();
 
-	warning("STUB: Scene::load  (%d bytes left)", file.size() - file.pos());
+	if (file.size() - file.pos() > 0)
+		error("Scene::load  (%d bytes left)", file.size() - file.pos());
 
 	return true;
 }
@@ -234,7 +237,23 @@ void Scene::initStaticANIObjects() {
 }
 
 void Scene::init() {
-	warning("STUB: Scene::init()");
+	_x = 0;
+	_y = 0;
+
+	g_fullpipe->_sceneRect.moveTo(0, 0);
+
+	for (uint i = 0; i < _picObjList.size(); i++)
+		((PictureObject *)_picObjList[i])->clearFlags();
+
+	for (uint i = 0; i < _staticANIObjectList1.size(); i++)
+		((PictureObject *)_staticANIObjectList1[i])->clearFlags();
+
+	if (_staticANIObjectList2.size() != _staticANIObjectList1.size()) {
+		_staticANIObjectList2.clear();
+
+		for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s)
+			_staticANIObjectList2.push_back(*s);
+	}
 }
 
 StaticANIObject *Scene::getAniMan() {
@@ -337,12 +356,23 @@ void Scene::initObjectCursors(const char *name) {
 	warning("STUB: Scene::initObjectCursors(%s)", name);
 }
 
-void Scene::draw(int par) {
-	updateScrolling(par);
+bool Scene::compareObjPriority(const void *p1, const void *p2) {
+	if (((StaticANIObject *)p1)->_priority < ((StaticANIObject *)p2)->_priority)
+		return true;
+
+	return false;
+}
+
+void Scene::objectList_sortByPriority(CPtrList &list) {
+	Common::sort(list.begin(), list.end(), Scene::compareObjPriority);
+}
+
+void Scene::draw() {
+	updateScrolling();
 
 	drawContent(60000, 0, true);
 
-	//_staticANIObjectList2.sortByPriority();
+	objectList_sortByPriority(_staticANIObjectList2);
 
 	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
 		((StaticANIObject *)s)->draw2();
@@ -359,7 +389,7 @@ void Scene::draw(int par) {
 	drawContent(-1, priority, false);
 }
 
-void Scene::updateScrolling(int par) {
+void Scene::updateScrolling() {
 	warning("STUB Scene::updateScrolling()");
 }
 
@@ -372,8 +402,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	}
 
 	if (_picObjList.size() > 2) { // We need to z-sort them
-		// Sort by priority
-		warning("Scene::drawContent: STUB sort by priority");
+		objectList_sortByPriority(_picObjList);
 	}
 
 	if (minPri == -1 && _picObjList.size())
@@ -383,7 +412,138 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		maxPri = 60000;
 
 	if (drawBg && _bigPictureArray1Count && _picObjList.size()) {
-	}
+		Common::Point point;
+
+		_bigPictureArray[0][0]->getDimensions(&point);
+
+		int width = point.x;
+		int height = point.y;
+
+		((PictureObject *)_picObjList[0])->getDimensions(&point);
+
+		int bgStX = g_fullpipe->_sceneRect.left % point.x;
+
+		if (bgStX < 0)
+			bgStX += point.x;
+
+		int bgNumX = bgStX / width;
+		int bgOffsetX = bgStX % width;
+
+		int bgStY = g_fullpipe->_sceneRect.top % point.y;
+
+		if (bgStY < 0)
+			bgStY += point.y;
+
+		int bgNumY = bgStY / height;
+		int bgOffsetY = bgStY % height;
+
+		int bgPosX = g_fullpipe->_sceneRect.left - bgOffsetX;
+
+		if (bgPosX < g_fullpipe->_sceneRect.right - 1) {
+			int v24 = height * bgNumY;
+			int v51 = height * bgNumY;
+			while (1) {
+				int v25 = bgNumY;
+				for (int y = g_fullpipe->_sceneRect.top - point.y; y < g_fullpipe->_sceneRect.bottom - 1; ) {
+					BigPicture *v27 = _bigPictureArray[bgNumX][v25];
+					v27->draw(bgPosX, y, 0, 0);
+					y += v27->getDimensions(&point)->y;
+					v25++;
+
+					if (v25 >= _bigPictureArray2Count) {
+						if (!((PictureObject *)_picObjList[0])->_flags & 0x20)
+							break;
+						v25 = 0;
+					}
+				}
+				_bigPictureArray[bgNumX][0]->getDimensions(&point);
+				int v32 = point.x + bgPosX;
+				bgPosX += point.x;
+				bgNumX++;
+
+				if (bgNumX >= _bigPictureArray1Count) {
+					if (!((PictureObject *)_picObjList[0])->_flags & 0x2)
+						break;
+					bgNumX = 0;
+				}
+				if (v32 >= g_fullpipe->_sceneRect.right - 1)
+					break;
+				v24 = v51;
+			}
+		}
+    }
+
+#if 0
+	v34 = this_->bg.picObjList.m_pNodeHead;
+	if (v34) {
+		while (1) {
+			v35 = v34->pNext;
+			v36 = (PictureObject *)v34->data;
+			drawBgb = v35;
+			v37 = v36->GameObject.priority;
+			if (v37 >= minPri && v37 < maxPri) {
+				v38 = v36->GameObject.ox;
+				v39 = v36->GameObject.oy;
+				v40 = PictureObject_getDimensions(v36, &v58);
+				v41 = v40->x;
+				bgOffsetXa = v40->y;
+				if (v36->GameObject.flags & 8) {
+					while (v38 > g_sceneRect.right) {
+						v38 -= v41;
+						v36->setOXY(v38, v39);
+					}
+					for (j = v41 + v38; v41 + v38 < g_sceneRect.left; j = v41 + v38) {
+						v38 = j;
+						v36->setOXY(j, v39);
+					}
+				}
+				if (v36->GameObject.flags & 0x10) {
+					while (v39 > g_sceneRect.bottom) {
+						v39 -= bgOffsetXa;
+						v36->setOXY(v38, v39);
+					}
+					for (k = v39 + bgOffsetXa; v39 + bgOffsetXa < g_sceneRect.top; k = v39 + bgOffsetXa) {
+						v39 = k;
+						v36->setOXY(v38, k);
+					}
+				}
+				if (v36->GameObject.flags & 4)
+					v36->draw();
+				if (v36->GameObject.flags & 2) {
+					if (v38 > g_sceneRect.left) {
+						v44 = v38 - v41;
+						v36->setOXY(v44, v39);
+						v36->draw();
+						v38 = v41 + v44;
+						v36->setOXY(v38, v39);
+					}
+					if (v41 + v38 < g_sceneRect.right) {
+						v36->setOXY(v41 + v38, v39);
+						v36->draw();
+						v36->setOXY(v38, v39);
+					}
+				}
+				if (v36->GameObject.flags & 0x20) {
+					if (v39 > g_sceneRect.top) {
+						v45 = v39 - bgOffsetXa;
+						v36->setOXY(v38, v45);
+						v36->draw();
+						v39 = bgOffsetXa + v45;
+						v36->setOXY(v38, v39);
+					}
+					if (bgOffsetXa + v39 < g_sceneRect.bottom) {
+						v36->setOXY(v38, bgOffsetXa + v39);
+						v36->draw();
+						v36->setOXY(v38, v39);
+					}
+				}
+			}
+			if (!drawBgb)
+				break;
+			v34 = drawBgb;
+		}
+    }
+#endif
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index cc2e2ed..e054403 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -49,9 +49,9 @@ class Scene : public Background {
 
 	void initStaticANIObjects();
 	void init();
-	void draw(int par);
+	void draw();
 	void drawContent(int minPri, int maxPri, bool drawBG);
-	void updateScrolling(int par);
+	void updateScrolling();
 
 	StaticANIObject *getAniMan();
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
@@ -65,6 +65,10 @@ class Scene : public Background {
 	void preloadMovements(CGameVar *var);
 
 	void initObjectCursors(const char *name);
+
+  private:
+	static bool compareObjPriority(const void *p1, const void *p2);
+	void objectList_sortByPriority(CPtrList &list);
 };
 
 class SceneTag : public CObject {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 875b469..32970a9 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -47,7 +47,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
 		_inventory->addItem(ANI_INV_MAP, 1);
 
-#if 1
+#if 0
 		g_fullpipe->accessScene(301);
 		g_fullpipe->accessScene(302);
 		g_fullpipe->accessScene(303);
@@ -491,7 +491,8 @@ bool Sc2::load(MfcArchive &file) {
 		_entranceData = 0;
 	}
 
-	debug(4, "pos: %d, 0x%x: %d", file.size(), file.pos(), file.size() - file.pos());
+	if (file.size() - file.pos() > 0)
+		error("Sc2::load(): (%d bytes left)", file.size() - file.pos());
 
 	return true;
 }


Commit: aaf5bae026416e158d69633eb1b07c73a63fcccd
    https://github.com/scummvm/scummvm/commit/aaf5bae026416e158d69633eb1b07c73a63fcccd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:05-07:00

Commit Message:
FULLPIPE: Fixed initial scene drawing. Scene bg is shown

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 2e04444..de4da66 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -110,16 +110,44 @@ Common::Error FullpipeEngine::run() {
 	ent._sceneId = 3896;
 	sceneSwitcher(&ent);
 
+	_currentScene->draw();
+
 	while (!g_fullpipe->_needQuit) {
 		updateEvents();
 		_system->delayMillis(10);
 		_system->updateScreen();
 
-		_currentScene->draw();
-
-		if (g_fullpipe->_keyState == ' ') {
+		switch (g_fullpipe->_keyState) {
+		case Common::KEYCODE_q:
+			g_fullpipe->_needQuit = true;
+			break;
+		case Common::KEYCODE_UP:
+			_sceneRect.moveTo(_sceneRect.left, _sceneRect.top + 10);
+			_currentScene->draw();
+			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+			break;
+		case Common::KEYCODE_DOWN:
+			_sceneRect.moveTo(_sceneRect.left, _sceneRect.top - 10);
+			_currentScene->draw();
+			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+			break;
+		case Common::KEYCODE_LEFT:
+			_sceneRect.moveTo(_sceneRect.left + 10, _sceneRect.top);
+			_currentScene->draw();
 			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
 			break;
+		case Common::KEYCODE_RIGHT:
+			_sceneRect.moveTo(_sceneRect.left - 10, _sceneRect.top);
+			_currentScene->draw();
+			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+			break;
+		case Common::KEYCODE_z:
+			_sceneRect.moveTo(0, 0);
+			_currentScene->draw();
+			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+			break;
+		default:
+			break;
 		}
 	}
 
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index c7b547d..675839f 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -129,10 +129,13 @@ bool CGameLoader::load(MfcArchive &file) {
 	return true;
 }
 
-bool CGameLoader::loadScene(int num) {
+bool CGameLoader::loadScene(int sceneId) {
 	SceneTag *st;
 
-	int idx = getSceneTagBySceneId(num, &st);
+	int idx = getSceneTagBySceneId(sceneId, &st);
+
+	if (idx < 0)
+		return false;
 
 	if (st->_scene)
 		st->loadScene();
@@ -152,10 +155,23 @@ bool CGameLoader::loadScene(int num) {
 	return false;
 }
 
-int CGameLoader::getSceneTagBySceneId(int num, SceneTag **st) {
-	warning("STUB: CGameLoader::getSceneTagBySceneId()");
+int CGameLoader::getSceneTagBySceneId(int sceneId, SceneTag **st) {
+	if (_sc2array.size() > 0 && _gameProject->_sceneTagList->size() > 0) {
+		for (uint i = 0; i < _sc2array.size(); i++) {
+			if (_sc2array[i]._sceneId == sceneId) {
+				int num = 0;
+				for (SceneTagList::iterator s = _gameProject->_sceneTagList->begin(); s != _gameProject->_sceneTagList->end(); ++s, num++) {
+					if (s->_sceneId == sceneId) {
+						*st = &(*s);
+						return num;
+					}
+				}
+			}
+		}
+	}
 
-	return 0;
+	*st = 0;
+	return -1;
 }
 
 void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount) {
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index ce933cb..3a96a53 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -40,7 +40,7 @@ class CGameLoader : public CObject {
 	virtual bool load(MfcArchive &file);
 	bool loadScene(int num);
 
-	int getSceneTagBySceneId(int num, SceneTag **st);
+	int getSceneTagBySceneId(int sceneId, SceneTag **st);
 	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
 
 	GameProject *_gameProject;
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index fb94661..1e1f1b5 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -249,6 +249,8 @@ bool Picture::load(MfcArchive &file) {
 		file.read(_paletteData, 1024);
 	}
 
+	getData();
+
 	debug(5, "Picture::load: <%s>", _memfilename);
 
 #if 0
@@ -318,6 +320,8 @@ void Picture::draw(int x, int y, int style, int angle) {
 	int x1 = x;
 	int y1 = y;
 
+	debug(0, "Picture::draw(%d, %d, %d, %d)", x, y, style, angle);
+
 	if (x != -1)
 		x1 = x;
 
@@ -387,6 +391,8 @@ void Picture::displayPicture() {
 }
 
 void Bitmap::putDib(int x, int y, int32 *palette) {
+	debug(0, "Bitmap::putDib(%d, %d)", x, y);
+
 	_x = x - g_fullpipe->_sceneRect.left;
 	_y = y - g_fullpipe->_sceneRect.top;
 
@@ -408,10 +414,12 @@ void Bitmap::putDibRB(int32 *palette) {
 	uint16 *srcPtr2;
 	uint16 *srcPtr;
 
+	debug(0, "Bitmap::putDibRB()");
+
 	endx = _width + _x - 1;
 	endy = _height + _y - 1;
 
-	if (_x > 799 || _width + _x - 1 < 0 || _y > 599 || endy < 0)
+	if (_x > 799 || endx < 0 || _y > 599 || endy < 0)
 		return;
 
 	if (endy > 599)
@@ -420,12 +428,20 @@ void Bitmap::putDibRB(int32 *palette) {
 	if (endx > 799)
 		endx = 799;
 
+	int startx = _x;
+	if (startx < 0)
+		startx = 0;
+
+	int starty = _y;
+	if (starty < 0)
+		starty = 0;
+
 	y = endy;
 	srcPtr = (uint16 *)_pixels;
 
 	bool breakup = false;
-	for (y = endy; y >= _y && !breakup; y--) {
-		x = _x;
+	for (y = endy; y >= starty && !breakup; y--) {
+		x = startx;
 
 		while ((pixel = *srcPtr++) != 0) {
 			if (pixel == 0x100) {
@@ -433,7 +449,7 @@ void Bitmap::putDibRB(int32 *palette) {
 				break;
 			}
 
-			while (pixel == 0x200 && y >= _y) {
+			while (pixel == 0x200 && y >= starty) {
 				uint16 value = *srcPtr++;
 
 				x += (byte)(value & 0xff);
@@ -442,7 +458,7 @@ void Bitmap::putDibRB(int32 *palette) {
 				pixel = *srcPtr++;
 			}
 
-			if (y < _y || pixel == 0)
+			if (y < starty || pixel == 0)
 				break;
 
 			start1 = x;
@@ -495,7 +511,7 @@ void Bitmap::putDibRB(int32 *palette) {
 		}
 	}
 
-	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(_x, _y), g_fullpipe->_backgroundSurface.pitch, _x, _y, endx + 1, endy + 1);
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1, endy + 1);
 }
 
 void Bitmap::putDibCB(int32 *palette) {
@@ -505,13 +521,13 @@ void Bitmap::putDibCB(int32 *palette) {
 	int bpp;
 	uint pitch;
 	bool cb05_format;
-	byte *srcPtr;
-	int start;
 
 	endx = _width + _x - 1;
 	endy = _height + _y - 1;
 
-	if (_x > 799 || _width + _x - 1 < 0 || _y > 599 || endy < 0)
+	debug(0, "Bitmap::putDibCB(): %d, %d, %d, %d [%d, %d]", _x, _y, endx, endy, _width, _height);
+
+	if (_x > 799 || endx < 0 || _y > 599 || endy < 0)
 		return;
 
 	if (endy > 599)
@@ -525,27 +541,31 @@ void Bitmap::putDibCB(int32 *palette) {
 	bpp = cb05_format ? 2 : 1;
 	pitch = (bpp * _width + 3) & 0xFFFFFFFC;
 
-	srcPtr = &_pixels[pitch * (endy - _y)];
+	byte *srcPtr = &_pixels[pitch * (endy - _y)];
 
-	start = _x;
-	if (_x < 0) {
+	int startx = _x;
+	if (startx < 0) {
 		srcPtr += bpp * -_x;
-		start = 0;
+		startx = 0;
 	}
 
+	int starty = _y;
+	if (starty < 0)
+		starty = 0;
+
 	if (_flags & 0x1000000) {
-		for (int y = _y; y < endy; srcPtr -= pitch, y++) {
-			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, y);
-			copierKeyColor(curDestPtr, srcPtr, endx - start + 1, _flags & 0xff, (int32 *)palette, cb05_format);
+		for (int y = starty; y < endy; srcPtr -= pitch, y++) {
+			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(startx, y);
+			copierKeyColor(curDestPtr, srcPtr, endx - startx + 1, _flags & 0xff, (int32 *)palette, cb05_format);
 		}
 	} else {
-		for (int y = _y; y <= endy; srcPtr -= pitch, y++) {
-			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start, y);
-			copier(curDestPtr, srcPtr, endx - start + 1, (int32 *)palette, cb05_format);
+		for (int y = starty; y <= endy; srcPtr -= pitch, y++) {
+			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(startx, y);
+			copier(curDestPtr, srcPtr, endx - startx + 1, (int32 *)palette, cb05_format);
 		}
 	}
 
-	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(start, _y), g_fullpipe->_backgroundSurface.pitch, start, _y, endx, endy);
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1, endy + 1);
 }
 
 void Bitmap::colorFill(uint16 *dest, int len, int32 color) {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 87ef2bd..78d38a7 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -266,7 +266,7 @@ StaticANIObject *Scene::getAniMan() {
 
 StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
 	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
-		StaticANIObject *o = (StaticANIObject *)s;
+		StaticANIObject *o = (StaticANIObject *)*s;
 		if (o->_id == obj && (a3 == -1 || o->_field_4 == a3))
 			return o;
 	}
@@ -276,7 +276,7 @@ StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
 
 StaticANIObject *Scene::getStaticANIObject1ByName(char *name, int a3) {
 	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
-		StaticANIObject *o = (StaticANIObject *)s;
+		StaticANIObject *o = (StaticANIObject *)*s;
 		if (!strcmp(o->_objectName, name) && (a3 == -1 || o->_field_4 == a3))
 			return o;
 	}
@@ -375,15 +375,15 @@ void Scene::draw() {
 	objectList_sortByPriority(_staticANIObjectList2);
 
 	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
-		((StaticANIObject *)s)->draw2();
+		((StaticANIObject *)*s)->draw2();
 	}
 
 	int priority = -1;
 	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
 		drawContent(((StaticANIObject *)s)->_priority, priority, false);
-		((StaticANIObject *)s)->draw();
+		((StaticANIObject *)*s)->draw();
 
-		priority = ((StaticANIObject *)s)->_priority;
+		priority = ((StaticANIObject *)*s)->_priority;
 	}
 
 	drawContent(-1, priority, false);
@@ -411,6 +411,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	if (maxPri == -1)
 		maxPri = 60000;
 
+	debug(0, "_bigPict: %d objlist: %d", _bigPictureArray1Count, _picObjList.size());
 	if (drawBg && _bigPictureArray1Count && _picObjList.size()) {
 		Common::Point point;
 
@@ -419,8 +420,12 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		int width = point.x;
 		int height = point.y;
 
+		debug(0, "w: %d h:%d", width, height);
+
 		((PictureObject *)_picObjList[0])->getDimensions(&point);
 
+		debug(0, "w2: %d h2:%d", point.x, point.y);
+
 		int bgStX = g_fullpipe->_sceneRect.left % point.x;
 
 		if (bgStX < 0)
@@ -444,7 +449,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 			int v51 = height * bgNumY;
 			while (1) {
 				int v25 = bgNumY;
-				for (int y = g_fullpipe->_sceneRect.top - point.y; y < g_fullpipe->_sceneRect.bottom - 1; ) {
+				for (int y = g_fullpipe->_sceneRect.top - bgOffsetY; y < g_fullpipe->_sceneRect.bottom - 1; ) {
 					BigPicture *v27 = _bigPictureArray[bgNumX][v25];
 					v27->draw(bgPosX, y, 0, 0);
 					y += v27->getDimensions(&point)->y;


Commit: 7f332e1f208344f88d1cfd1899743eb7dd5403de
    https://github.com/scummvm/scummvm/commit/7f332e1f208344f88d1cfd1899743eb7dd5403de
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:05-07:00

Commit Message:
FULLPIPE: Second part of scene drawing

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index de4da66..ce310c9 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -108,6 +108,7 @@ Common::Error FullpipeEngine::run() {
 	EntranceInfo ent;
 
 	ent._sceneId = 3896;
+	//ent._sceneId = 2072;
 	sceneSwitcher(&ent);
 
 	_currentScene->draw();
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 1e1f1b5..79de4ef 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -151,6 +151,13 @@ Common::Point *PictureObject::getDimensions(Common::Point *p) {
 	return p;
 }
 
+void PictureObject::draw() {
+	if (_flags & 1)
+		_picture->draw(_ox, _oy, 2, 0);
+	else
+		_picture->draw(_ox, _oy, 0, 0);
+}
+
 GameObject::GameObject() {
 	_field_4 = 0;
 	_flags = 0;
@@ -511,7 +518,7 @@ void Bitmap::putDibRB(int32 *palette) {
 		}
 	}
 
-	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1, endy + 1);
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
 }
 
 void Bitmap::putDibCB(int32 *palette) {
@@ -565,7 +572,7 @@ void Bitmap::putDibCB(int32 *palette) {
 		}
 	}
 
-	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1, endy + 1);
+	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
 }
 
 void Bitmap::colorFill(uint16 *dest, int len, int32 color) {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 4f89f39..5848e57 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -124,6 +124,7 @@ class PictureObject : public GameObject {
 	PictureObject();
 	bool load(MfcArchive &file, bool bigPicture);
 	Common::Point *getDimensions(Common::Point *p);
+	void draw();
 };
 
 class Background : public CObject {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 78d38a7..f9b4c0b8 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -320,7 +320,7 @@ void Scene::setPictureObjectsFlag4() {
 
 PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 	for (uint i = 1; i < _picObjList.size(); i++) {
-		if(((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_field_4 == flags)
+		if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_field_4 == flags)
 			return (PictureObject *)_picObjList[i];
 	}
 
@@ -380,7 +380,7 @@ void Scene::draw() {
 
 	int priority = -1;
 	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
-		drawContent(((StaticANIObject *)s)->_priority, priority, false);
+		drawContent(((StaticANIObject *)*s)->_priority, priority, false);
 		((StaticANIObject *)*s)->draw();
 
 		priority = ((StaticANIObject *)*s)->_priority;
@@ -401,6 +401,8 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		warning("Scene palette is ignored");
 	}
 
+	debug(0, "Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
+
 	if (_picObjList.size() > 2) { // We need to z-sort them
 		objectList_sortByPriority(_picObjList);
 	}
@@ -411,9 +413,12 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	if (maxPri == -1)
 		maxPri = 60000;
 
+	debug(0, "-> Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
+
+	Common::Point point;
+
 	debug(0, "_bigPict: %d objlist: %d", _bigPictureArray1Count, _picObjList.size());
 	if (drawBg && _bigPictureArray1Count && _picObjList.size()) {
-		Common::Point point;
 
 		_bigPictureArray[0][0]->getDimensions(&point);
 
@@ -449,7 +454,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 			int v51 = height * bgNumY;
 			while (1) {
 				int v25 = bgNumY;
-				for (int y = g_fullpipe->_sceneRect.top - bgOffsetY; y < g_fullpipe->_sceneRect.bottom - 1; ) {
+				for (int y = g_fullpipe->_sceneRect.top - bgOffsetY; y < g_fullpipe->_sceneRect.bottom - 1;) {
 					BigPicture *v27 = _bigPictureArray[bgNumX][v25];
 					v27->draw(bgPosX, y, 0, 0);
 					y += v27->getDimensions(&point)->y;
@@ -478,77 +483,74 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		}
     }
 
-#if 0
-	v34 = this_->bg.picObjList.m_pNodeHead;
-	if (v34) {
-		while (1) {
-			v35 = v34->pNext;
-			v36 = (PictureObject *)v34->data;
-			drawBgb = v35;
-			v37 = v36->GameObject.priority;
-			if (v37 >= minPri && v37 < maxPri) {
-				v38 = v36->GameObject.ox;
-				v39 = v36->GameObject.oy;
-				v40 = PictureObject_getDimensions(v36, &v58);
-				v41 = v40->x;
-				bgOffsetXa = v40->y;
-				if (v36->GameObject.flags & 8) {
-					while (v38 > g_sceneRect.right) {
-						v38 -= v41;
-						v36->setOXY(v38, v39);
-					}
-					for (j = v41 + v38; v41 + v38 < g_sceneRect.left; j = v41 + v38) {
-						v38 = j;
-						v36->setOXY(j, v39);
-					}
-				}
-				if (v36->GameObject.flags & 0x10) {
-					while (v39 > g_sceneRect.bottom) {
-						v39 -= bgOffsetXa;
-						v36->setOXY(v38, v39);
-					}
-					for (k = v39 + bgOffsetXa; v39 + bgOffsetXa < g_sceneRect.top; k = v39 + bgOffsetXa) {
-						v39 = k;
-						v36->setOXY(v38, k);
-					}
-				}
-				if (v36->GameObject.flags & 4)
-					v36->draw();
-				if (v36->GameObject.flags & 2) {
-					if (v38 > g_sceneRect.left) {
-						v44 = v38 - v41;
-						v36->setOXY(v44, v39);
-						v36->draw();
-						v38 = v41 + v44;
-						v36->setOXY(v38, v39);
-					}
-					if (v41 + v38 < g_sceneRect.right) {
-						v36->setOXY(v41 + v38, v39);
-						v36->draw();
-						v36->setOXY(v38, v39);
-					}
-				}
-				if (v36->GameObject.flags & 0x20) {
-					if (v39 > g_sceneRect.top) {
-						v45 = v39 - bgOffsetXa;
-						v36->setOXY(v38, v45);
-						v36->draw();
-						v39 = bgOffsetXa + v45;
-						v36->setOXY(v38, v39);
-					}
-					if (bgOffsetXa + v39 < g_sceneRect.bottom) {
-						v36->setOXY(v38, bgOffsetXa + v39);
-						v36->draw();
-						v36->setOXY(v38, v39);
-					}
-				}
+
+	for (uint i = 1; i < _picObjList.size(); i++) {
+		PictureObject *obj = (PictureObject *)_picObjList[i];
+
+		debug(0, "pri: %d", obj->_priority);
+		if (obj->_priority < minPri || obj->_priority >= maxPri)
+			continue;
+
+		int objX = obj->_ox;
+		int objY = obj->_oy;
+
+		debug(0, "obj: %d %d", objX, objY);
+
+		obj->getDimensions(&point);
+
+		int width = point.x;
+		int height = point.y;
+
+		if (obj->_flags & 8) {
+			while (objX > g_fullpipe->_sceneRect.right) {
+				objX -= width;
+				obj->setOXY(objX, objY);
+			}
+			for (int j = width + objX; width + objX < g_fullpipe->_sceneRect.left; j = width + objX) {
+				objX = j;
+				obj->setOXY(j, objY);
 			}
-			if (!drawBgb)
-				break;
-			v34 = drawBgb;
 		}
-    }
-#endif
+
+		if (obj->_flags & 0x10) {
+			while (objY > g_fullpipe->_sceneRect.bottom) {
+				objY -= height;
+				obj->setOXY(objX, objY);
+			}
+			for (int j = objY + height; objY + height < g_fullpipe->_sceneRect.top; j = objY + height) {
+				objY = j;
+				obj->setOXY(objX, j);
+			}
+		}
+		if (obj->_flags & 4)
+			obj->draw();
+
+		if (obj->_flags & 2) {
+			if (objX > g_fullpipe->_sceneRect.left) {
+				obj->setOXY(objX - width, objY);
+				obj->draw();
+				obj->setOXY(objX, objY);
+			}
+			if (width + objX < g_fullpipe->_sceneRect.right) {
+				obj->setOXY(width + objX, objY);
+				obj->draw();
+				obj->setOXY(objX, objY);
+			}
+		}
+
+		if (obj->_flags & 0x20) {
+			if (objY > g_fullpipe->_sceneRect.top) {
+				obj->setOXY(objX, objY - height);
+				obj->draw();
+				obj->setOXY(objX, objY);
+			}
+			if (height + objY < g_fullpipe->_sceneRect.bottom) {
+				obj->setOXY(objX, height + objY);
+				obj->draw();
+				obj->setOXY(objX, objY);
+			}
+		}
+	}
 }
 
 } // End of namespace Fullpipe


Commit: b18f08d93bc1e7f681a830413b0e57fad61faff3
    https://github.com/scummvm/scummvm/commit/b18f08d93bc1e7f681a830413b0e57fad61faff3
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:06-07:00

Commit Message:
FULLPIPE: Started Statics drawing

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index ce310c9..f1c0aac 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -107,8 +107,11 @@ Common::Error FullpipeEngine::run() {
 
 	EntranceInfo ent;
 
-	ent._sceneId = 3896;
-	//ent._sceneId = 2072;
+	if (ConfMan.hasKey("boot_param"))
+		ent._sceneId = ConfMan.getInt("boot_param");
+	else 
+		ent._sceneId = 3896;
+
 	sceneSwitcher(&ent);
 
 	_currentScene->draw();
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 79de4ef..a4dec69 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -24,6 +24,8 @@
 
 #include "fullpipe/objects.h"
 #include "fullpipe/gfx.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/scene.h"
 
 #include "common/memstream.h"
 
@@ -700,5 +702,20 @@ bool Shadows::load(MfcArchive &file) {
 	return true;
 }
 
+void Shadows::init() {
+	Scene *scene = g_fullpipe->accessScene(_sceneId);
+
+	StaticANIObject *st;
+	Movement *mov;
+
+	if (scene && (st = scene->getStaticANIObject1ById(_staticAniObjectId, -1)) != 0
+		&& ((mov = st->getMovementById(_movementId)) != 0))
+		initMovement(mov);
+}
+
+void Shadows::initMovement(Movement *mov) {
+	warning("STUB: Shadows::initMovement()");
+}
+
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 5848e57..8a14177 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -27,6 +27,9 @@ class Common::ReadStream;
 
 namespace Fullpipe {
 
+class DynamicPhase;
+class Movement;
+
 class ShadowsItemArray : public CObArray {
 	// empty
 };
@@ -158,6 +161,15 @@ class Shadows : public CObject {
   public:
 	Shadows();
 	virtual bool load(MfcArchive &file);
+	void init();
+
+	void initMovement(Movement *mov);
+};
+
+struct ShadowsItem {
+	int width;
+	int height;
+	DynamicPhase *dynPhase;
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index f9b4c0b8..93c56da 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -106,6 +106,9 @@ void SceneTag::loadScene() {
 
 	_scene->load(archive);
 
+	if (_scene->_shadows)
+		_scene->_shadows->init();
+
 	delete file;
 
 	g_fullpipe->_currArchive = 0;
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index e054403..d51d113 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -29,8 +29,8 @@ namespace Fullpipe {
 
 class Scene : public Background {
 	friend class FullpipeEngine;
+	friend class SceneTag;
 
-  protected:
 	CPtrList _staticANIObjectList1;
 	CPtrList _staticANIObjectList2;
 	CPtrList _messageQueueList;
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 9359709..c12c0a0 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -101,8 +101,8 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	_currentScene = scene;
 	scene->addStaticANIObject(_aniMan, 1);
 	_scene2 = scene;
-	_aniMan->_movementObj = 0;
-	_aniMan->_staticsObj = _aniMan->getStaticsById(ST_MAN_EMPTY);
+	_aniMan->_movement = 0;
+	_aniMan->_statics = _aniMan->getStaticsById(ST_MAN_EMPTY);
 	_aniMan->setOXY(0, 0);
 
 	if (_aniMan) {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index b84703e..0f5b861 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -69,8 +69,8 @@ StaticANIObject::StaticANIObject() {
 	_messageQueueId = 0;
 	_animExFlag = 0;
 	_counter = 0;
-	_movementObj = 0;
-	_staticsObj = 0;
+	_movement = 0;
+	_statics = 0;
 	_flags = 0;
 	_callback1 = 0;
 	_callback2 = 0;
@@ -130,8 +130,8 @@ void StaticANIObject::setOXY(int x, int y) {
 	_ox = x;
 	_oy = y;
 	
-	if (_movementObj)
-		_movementObj->setOXY(x, y);
+	if (_movement)
+		_movement->setOXY(x, y);
 }
 
 void StaticANIObject::clearFlags() {
@@ -139,8 +139,8 @@ void StaticANIObject::clearFlags() {
 
 	deleteFromGlobalMessageQueue();
 	_messageQueueId = 0;
-	_movementObj = 0;
-	_staticsObj = 0;
+	_movement = 0;
+	_statics = 0;
 	_animExFlag = 0;
 	_counter = 0;
 	_messageNum = 0;
@@ -195,6 +195,11 @@ Movement *StaticANIObject::getMovementByName(char *name) {
 	return 0;
 }
 
+void Movement::draw(bool flipFlag, int angle) {
+	warning("STUB: Movement::draw(%d, %d)", flipFlag, angle);
+}
+
+
 void StaticANIObject::loadMovementsPixelData() {
 	for (uint i = 0; i < _movements.size(); i++)
 		((Movement *)_movements[i])->loadPixelData();
@@ -211,7 +216,19 @@ void StaticANIObject::draw() {
 }
 
 void StaticANIObject::draw2() {
-	warning("STUB: StaticANIObject::draw2()");
+	debug(0, "StatciANIObject::draw2()");
+
+	if ((_flags & 4) && (_flags & 0x10)) {
+		if (_movement) {
+			_movement->draw(1, 0);
+		} else {
+			Common::Point point;
+
+			_statics->getSomeXY(point);
+
+			_statics->draw(_ox - point.x, _oy - point.y, 1, 0);
+		}
+	}
 }
 
 Statics::Statics() {
@@ -227,7 +244,7 @@ bool Statics::load(MfcArchive &file) {
 	_staticsId = file.readUint16LE();
 
 	_staticsName = file.readPascalString();
-	debug(7, "statics: <%s>", transCyrillic((byte *)_staticsName));
+	debug(7, "statics: <%s> id: %d (%x)", transCyrillic((byte *)_staticsName), _staticsId, _staticsId);
 
 	_picture = new Picture();
 	_picture->load(file);
@@ -235,6 +252,13 @@ bool Statics::load(MfcArchive &file) {
 	return true;
 }
 
+Common::Point *Statics::getSomeXY(Common::Point &p) {
+	p.x = _someX;
+	p.y = _someY;
+
+	return &p;
+}
+
 Movement::Movement() {
 	_lastFrameSpecialFlag = 0;
 	_flipFlag = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 04a4863..0ae5e61 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -56,6 +56,7 @@ class StaticPhase : public Picture {
 
 class DynamicPhase : public StaticPhase {
 	friend class Movement;
+	friend class Statics;
 
 	int _someX;
 	int _someY;
@@ -82,6 +83,8 @@ class Statics : public DynamicPhase {
 	Statics();
 	virtual bool load(MfcArchive &file);
 	Statics *getStaticsById(int itemId);
+
+	Common::Point *getSomeXY(Common::Point &p);
 };
 
 class StaticANIObject;
@@ -122,14 +125,16 @@ class Movement : public GameObject {
 	void updateCurrDynamicPhase();
 
 	void loadPixelData();
+
+	void draw(bool flipFlag, int angle);
 };
 
 class StaticANIObject : public GameObject {
 	friend class FullpipeEngine;
 
  protected:
-	Movement *_movementObj;
-	Statics *_staticsObj;
+	Movement *_movement;
+	Statics *_statics;
 	int _shadowsOn;
 	int16 _field_30;
 	int16 _field_32;


Commit: 5a182df0994081512fae724689507b9acc141d3a
    https://github.com/scummvm/scummvm/commit/5a182df0994081512fae724689507b9acc141d3a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:06-07:00

Commit Message:
FULLPIPE: Unstubbed StaticANIObject::addReverseStatics()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index a4dec69..252333e 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -225,6 +225,44 @@ Picture::Picture() {
 	_convertedBitmap = 0;
 }
 
+Picture::~Picture() {
+	freePicture();
+
+	_bitmap = 0;
+
+	if (_memoryObject2)
+		delete _memoryObject2;
+
+	if (_paletteData)
+		free(_paletteData);
+
+	if (_convertedBitmap) {
+		delete _convertedBitmap;
+		_convertedBitmap = 0;
+	}
+}
+
+void Picture::freePicture() {
+	if (_bitmap) {
+		if (testFlags() && !_field_54) {
+			freeData();
+			delete _bitmap;
+			_bitmap = 0;
+		}
+	}
+
+	if (_bitmap) {
+		_bitmap = 0;
+		_data = 0;
+	}
+
+	if (_convertedBitmap) {
+		free(_convertedBitmap->_pixels);
+		delete _convertedBitmap;
+		_convertedBitmap = 0;
+	}
+}
+
 bool Picture::load(MfcArchive &file) {
 	debug(5, "Picture::load()");
 	MemoryObject::load(file);
@@ -350,22 +388,21 @@ void Picture::draw(int x, int y, int style, int angle) {
 	switch (style) {
 	case 1:
 		//flip
-		warning("Picture::draw: style 1");
+		warning("STUB: Picture::draw: style 1");
 		break;
 	case 2:
-		error("Picture::draw: style 2");
+		error("STUB: Picture::draw: style 2");
 		break;
 	default:
-		if (angle) {
-			warning("Picture:draw: angle = %d", angle);
+		if (angle)
 			drawRotated(x1, y1, angle);
-		} else {
+		else
 			_bitmap->putDib(x1, y1, (int32 *)_paletteData);
-		}
 	}
 }
 
 void Picture::drawRotated(int x, int y, int angle) {
+	warning("STUB: Picture::drawRotated(%d, %d, %d)", x, y, angle);
 }
 
 void Picture::displayPicture() {
@@ -399,6 +436,26 @@ void Picture::displayPicture() {
 	}
 }
 
+void Picture::setPaletteData(byte *pal) {
+	if (_paletteData)
+		free(_paletteData);
+
+	if (pal) {
+		_paletteData = (byte *)malloc(1024);
+		memcpy(_paletteData, pal, 1024);
+	}
+}
+
+void Picture::copyMemoryObject2(Picture *src) {
+	if (_width == src->_width && _height == src->_height) {
+		if (src->_memoryObject2 && src->_memoryObject2->_rows && _memoryObject2) {
+			byte *data = loadData();
+			_memoryObject2->copyData(data, _dataSize);
+			setAOIDs();
+		}
+	}
+}
+
 void Bitmap::putDib(int x, int y, int32 *palette) {
 	debug(0, "Bitmap::putDib(%d, %d)", x, y);
 
@@ -677,7 +734,10 @@ void Bitmap::copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_
 	}
 }
 
-BigPicture::BigPicture() {
+Bitmap *Bitmap::reverseImage() {
+	warning("STUB: Bitmap::reverseImage()");
+
+	return this;
 }
 
 bool BigPicture::load(MfcArchive &file) {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 8a14177..36ec1bd 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -53,13 +53,16 @@ struct Bitmap {
 	void paletteFill(uint16 *dest, byte *src, int len, int32 *palette);
 	void copierKeyColor(uint16 *dest, byte *src, int len, int keyColor, int32 *palette, bool cb05_format);
 	void copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_format);
+
+	Bitmap *reverseImage();
 };
 
 class Picture : public MemoryObject {
 	friend class Movement;
+	friend class DynamicPhase;
 
 	Common::Rect _rect;
-	int _convertedBitmap;
+	Bitmap *_convertedBitmap;
 	int _x;
 	int _y;
 	int _field_44;
@@ -75,6 +78,10 @@ class Picture : public MemoryObject {
 
   public:
 	Picture();
+	virtual ~Picture();
+
+	void freePicture();
+
 	virtual bool load(MfcArchive &file);
 	void setAOIDs();
 	void init();
@@ -87,11 +94,16 @@ class Picture : public MemoryObject {
 	void setAlpha(byte alpha) { _alpha = alpha; }
 
 	Common::Point *getDimensions(Common::Point *p);
+
+	byte *getPaletteData() { return _paletteData; }
+	void setPaletteData(byte *pal);
+
+	void copyMemoryObject2(Picture *src);
 };
 
 class BigPicture : public Picture {
   public:
-	BigPicture();
+	BigPicture() {}
 	virtual bool load(MfcArchive &file);
 };
 
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 65113a9..9acedc9 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -143,7 +143,7 @@ union VarValue {
 	char *stringValue;
 };
 
-class Message {
+class Message : public CObject {
  public:
 	int _messageKind;
 	int16 _parentId;
@@ -161,17 +161,19 @@ class Message {
 
  public:
 	Message();
+	Message(Message *src);
 };
 
-class ExCommand : public CObject {
-	Message _msg;
+class ExCommand : public Message {
 	int _messageNum;
 	int _field_3C;
-	int _flags;
+	int _excFlags;
 	int _parId;
 
  public:
 	ExCommand();
+	ExCommand(ExCommand *src);
+	virtual ~ExCommand() {}
 
 	virtual bool load(MfcArchive &file);
 };
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 32970a9..c1da2d5 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -213,33 +213,41 @@ bool CInteraction::load(MfcArchive &file) {
 ExCommand::ExCommand() {
 	_field_3C = 1;
 	_messageNum = 0;
-	_flags = 0;
+	_excFlags = 0;
 	_parId = 0;
 }
 
+ExCommand::ExCommand(ExCommand *src) : Message(src) {
+	_field_3C = 1;
+	_messageNum = src->_messageNum;
+	_excFlags = src->_excFlags;
+	_parId = src->_parId;
+
+}
+
 bool ExCommand::load(MfcArchive &file) {
 	debug(5, "ExCommand::load()");
 
-	_msg._parentId = file.readUint16LE();
-	_msg._messageKind = file.readUint32LE();
-	_msg._x = file.readUint32LE();
-	_msg._y = file.readUint32LE();
-	_msg._field_14 = file.readUint32LE();
-	_msg._sceneClickX = file.readUint32LE();
-	_msg._sceneClickY = file.readUint32LE();
-	_msg._field_20 = file.readUint32LE();
-	_msg._field_24 = file.readUint32LE();
-	_msg._param28 = file.readUint32LE();
-	_msg._field_2C = file.readUint32LE();
-	_msg._field_30 = file.readUint32LE();
-	_msg._field_34 = file.readUint32LE();
+	_parentId = file.readUint16LE();
+	_messageKind = file.readUint32LE();
+	_x = file.readUint32LE();
+	_y = file.readUint32LE();
+	_field_14 = file.readUint32LE();
+	_sceneClickX = file.readUint32LE();
+	_sceneClickY = file.readUint32LE();
+	_field_20 = file.readUint32LE();
+	_field_24 = file.readUint32LE();
+	_param28 = file.readUint32LE();
+	_field_2C = file.readUint32LE();
+	_field_30 = file.readUint32LE();
+	_field_34 = file.readUint32LE();
 
 	_messageNum = file.readUint32LE();
 
 	_field_3C = 0;
 
 	if (g_fullpipe->_gameProjectVersion >= 12) {
-		_flags = file.readUint32LE();
+		_excFlags = file.readUint32LE();
 		_parId = file.readUint32LE();
 	}
 
@@ -262,6 +270,22 @@ Message::Message() {
 	_field_34 = 0;
 }
 
+Message::Message(Message *src) {
+	_parentId = src->_parentId;
+	_messageKind = src->_messageKind;
+	_x = src->_x;
+	_y = src->_y;
+	_field_14 = src->_field_14;
+	_sceneClickX = src->_sceneClickX;
+	_sceneClickY = src->_sceneClickY;
+	_field_20 = src->_field_20;
+	_field_24 = src->_field_24;
+	_param28 = src->_param28;
+	_field_2C = src->_field_2C;
+	_field_30 = src->_field_30;
+	_field_34 = src->_field_34;
+}
+
 CObjstateCommand::CObjstateCommand() {
 	_value = 0;
 }
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 0f5b861..7d91a11 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -28,6 +28,7 @@
 #include "fullpipe/messagequeue.h"
 
 #include "fullpipe/gameobj.h"
+#include "fullpipe/objectnames.h"
 
 namespace Fullpipe {
 
@@ -205,10 +206,16 @@ void StaticANIObject::loadMovementsPixelData() {
 		((Movement *)_movements[i])->loadPixelData();
 }
 
-Statics *StaticANIObject::addStatics(Statics *ani) {
-	warning("STUB: StaticANIObject::addStatics");
+Statics *StaticANIObject::addReverseStatics(Statics *st) {
+	Statics *res = getStaticsById(st->_staticsId ^ 0x4000);
 
-	return 0;
+	if (!res) {
+		res = new Statics(st, true);
+
+		_staticsList.push_back(res);
+	}
+
+	return res;
 }
 
 void StaticANIObject::draw() {
@@ -234,6 +241,27 @@ void StaticANIObject::draw2() {
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
+	_staticsName = 0;
+}
+
+Statics::Statics(Statics *src, bool reverse) : DynamicPhase(src, reverse) {
+	_staticsId = src->_staticsId;
+
+	if (reverse) {
+		_staticsId ^= 0x4000;
+		int newlen = strlen(src->_staticsName) + strlen(sO_MirroredTo) + 1;
+		_staticsName = (char *)calloc(newlen, 1);
+
+		snprintf(_staticsName, newlen, "%s%s", sO_MirroredTo, src->_staticsName);
+	} else {
+		_staticsName = (char *)calloc(strlen(src->_staticsName) + 1, 1);
+		strncpy(_staticsName, src->_staticsName, strlen(src->_staticsName) + 1);
+	}
+
+	_memfilename = (char *)calloc(strlen(src->_memfilename) + 1, 1);
+	strncpy(_memfilename, src->_memfilename, strlen(src->_memfilename) + 1);
+
+	_picture = new Picture();
 }
 
 bool Statics::load(MfcArchive &file) {
@@ -314,7 +342,7 @@ bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
 
 		if (!_staticsObj1 && (staticsid & 0x4000)) {
 			Statics *s = ani->getStaticsById(staticsid ^ 0x4000);
-			_staticsObj1 = ani->addStatics(s);
+			_staticsObj1 = ani->addReverseStatics(s);
 		}
 
 		_mx = file.readUint32LE();
@@ -326,7 +354,7 @@ bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
 
 		if (!_staticsObj2 && (staticsid & 0x4000)) {
 			Statics *s = ani->getStaticsById(staticsid ^ 0x4000);
-			_staticsObj2 = ani->addStatics(s);
+			_staticsObj2 = ani->addReverseStatics(s);
 		}
 
 		_m2x = file.readUint32LE();
@@ -406,10 +434,73 @@ DynamicPhase::DynamicPhase() {
 	_someX = 0;
 	_rect = 0;
 	_field_7C = 0;
-	_flags = 0;
+	_dynFlags = 0;
 	_someY = 0;
 }
 
+DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
+	_field_7C = src->_field_7C;
+	_rect = new Common::Rect();
+
+	if (reverse) {
+		if (!src->_bitmap)
+			src->init();
+
+		_bitmap = src->_bitmap->reverseImage();
+		_data = _bitmap->_pixels;
+		_dataSize = src->_dataSize;
+
+		if (g_fullpipe->_currArchive) {
+			_field_14 = 0;
+			_libHandle = g_fullpipe->_currArchive;
+		}
+
+		_flags |= 1;
+
+		_someX = src->_someX;
+		_someY = src->_someY;
+	} else {
+		_field_14 = src->_field_14;
+		_field_8 = src->_field_8;
+		_flags = src->_flags;
+
+		_memfilename = (char *)calloc(strlen(src->_memfilename) + 1, 1);
+		strncpy(_memfilename, src->_memfilename, strlen(src->_memfilename) + 1);
+		_dataSize = src->_dataSize;
+		_field_10 = src->_field_10;
+		_libHandle = src->_libHandle;
+
+		_bitmap = src->_bitmap;
+		if (_bitmap)
+			_field_54 = 1;
+
+		_someX = src->_someX;
+		_someY = src->_someY;
+	}
+
+	_rect->top = src->_rect->top;
+	_rect->bottom = src->_rect->bottom;
+	_rect->left = src->_rect->left;
+	_rect->right = src->_rect->right;
+
+	_width = src->_width;
+	_height = src->_height;
+	_field_7C = src->_field_7C;
+
+	if (src->getExCommand())
+		_exCommand = new ExCommand(src->getExCommand());
+	else
+		_exCommand = 0;
+
+	_initialCountdown = src->_initialCountdown;
+	_field_6A = src->_field_6A;
+	_dynFlags = src->_dynFlags;
+
+	setPaletteData(getPaletteData());
+
+	copyMemoryObject2(src);
+}
+
 bool DynamicPhase::load(MfcArchive &file) {
 	debug(5, "DynamicPhase::load()");
 
@@ -429,7 +520,7 @@ bool DynamicPhase::load(MfcArchive &file) {
 
 	assert (g_fullpipe->_gameProjectVersion >= 12);
 
-	_flags = file.readUint32LE();
+	_dynFlags = file.readUint32LE();
 
 	return true;
 }
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 0ae5e61..128f0f5 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -43,6 +43,8 @@ class CStepArray : public CObject {
 };
 
 class StaticPhase : public Picture {
+	friend class DynamicPhase;
+
 	int16 _initialCountdown;
 	int16 _countdown;
 	int16 _field_68;
@@ -51,7 +53,10 @@ class StaticPhase : public Picture {
 
   public:
 	StaticPhase();
+
 	virtual bool load(MfcArchive &file);
+
+	ExCommand *getExCommand() { return _exCommand; }
 };
 
 class DynamicPhase : public StaticPhase {
@@ -63,10 +68,12 @@ class DynamicPhase : public StaticPhase {
 	Common::Rect *_rect;
 	int16 _field_7C;
 	int16 _field_7E;
-	int _flags;
+	int _dynFlags;
 
   public:
 	DynamicPhase();
+	DynamicPhase(DynamicPhase *src, bool reverse);
+
 	virtual bool load(MfcArchive &file);
 };
 
@@ -81,6 +88,8 @@ class Statics : public DynamicPhase {
 
   public:
 	Statics();
+	Statics(Statics *src, bool reverse);
+
 	virtual bool load(MfcArchive &file);
 	Statics *getStaticsById(int itemId);
 
@@ -171,7 +180,7 @@ class StaticANIObject : public GameObject {
 
 	void loadMovementsPixelData();
 
-	Statics *addStatics(Statics *ani);
+	Statics *addReverseStatics(Statics *ani);
 	void draw();
 	void draw2();
 };
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 3e153c1..ec6b590 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -120,6 +120,12 @@ MemoryObject::MemoryObject() {
 	_data = 0;
 }
 
+MemoryObject::~MemoryObject() {
+	freeData();
+	if (_memfilename)
+		free(_memfilename);
+}
+
 bool MemoryObject::load(MfcArchive &file) {
 	debug(5, "MemoryObject::load()");
 	_memfilename = file.readPascalString();
@@ -168,10 +174,37 @@ byte *MemoryObject::getData() {
 	}
 }
 
+byte *MemoryObject::loadData() {
+	load();
+	return _data;
+}
+
+void MemoryObject::freeData() {
+	if (_data)
+		free(_data);
+
+	_data = 0;
+}
+
+bool MemoryObject::testFlags() {
+	if (_field_8)
+		return false;
+
+	if (_flags & 1)
+		return true;
+
+	return false;
+}
+
 MemoryObject2::MemoryObject2() {
 	_rows = 0;
 }
 
+MemoryObject2::~MemoryObject2() {
+	if (_rows)
+		free(_rows);
+}
+
 bool MemoryObject2::load(MfcArchive &file) {
 	debug(5, "MemoryObject2::load()");
 	MemoryObject::load(file);
@@ -187,6 +220,16 @@ bool MemoryObject2::load(MfcArchive &file) {
 	return true;
 }
 
+void MemoryObject2::copyData(byte *src, int dataSize) {
+	if (_data)
+		freeData();
+
+	_dataSize = dataSize;
+	_data = (byte *)malloc(dataSize);
+
+	memcpy(_data, src, _dataSize);
+}
+
 int MfcArchive::readCount() {
 	int count = readUint16LE();
 
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 524436b..70a057c 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -96,10 +96,17 @@ class MemoryObject : CObject {
 
  public:
 	MemoryObject();
+	virtual ~MemoryObject();
+
 	virtual bool load(MfcArchive &file);
 	void loadFile(char *filename);
 	void load() { loadFile(_memfilename); }
 	byte *getData();
+	byte *loadData();
+
+	bool testFlags();
+
+	void freeData();
 };
 
 class MemoryObject2 : public MemoryObject {
@@ -110,7 +117,10 @@ class MemoryObject2 : public MemoryObject {
 
  public:
 	MemoryObject2();
+	virtual ~MemoryObject2();
 	virtual bool load(MfcArchive &file);
+
+	void copyData(byte *src, int dataSize);
 };
 
 class CObArray : public Common::Array<CObject>, public CObject {


Commit: 67bbf26ecd546d59304ec437125508eb70aab9a1
    https://github.com/scummvm/scummvm/commit/67bbf26ecd546d59304ec437125508eb70aab9a1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:06-07:00

Commit Message:
FULLPIPE: Rename messagequeue.* to messages.*

Changed paths:
  A engines/fullpipe/messages.cpp
  A engines/fullpipe/messages.h
  R engines/fullpipe/messagequeue.cpp
  R engines/fullpipe/messagequeue.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/module.mk
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index f1c0aac..d89e1f3 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -31,7 +31,7 @@
 #include "fullpipe/objectnames.h"
 #include "fullpipe/objects.h"
 #include "fullpipe/gameloader.h"
-#include "fullpipe/messagequeue.h"
+#include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
 
 namespace Fullpipe {
diff --git a/engines/fullpipe/messagequeue.cpp b/engines/fullpipe/messagequeue.cpp
deleted file mode 100644
index 9d2ec38..0000000
--- a/engines/fullpipe/messagequeue.cpp
+++ /dev/null
@@ -1,258 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "fullpipe/fullpipe.h"
-
-#include "fullpipe/objects.h"
-#include "fullpipe/messagequeue.h"
-
-namespace Fullpipe {
-
-MessageQueue::MessageQueue() {
-	_field_14 = 0;
-	_parId = 0;
-	_dataId = 0;
-	_id = 0;
-	_isFinished = 0;
-	_flags = 0;
-}
-
-bool MessageQueue::load(MfcArchive &file) {
-	debug(5, "MessageQueue::load()");
-
-	_dataId = file.readUint16LE();
-
-	int count = file.readUint16LE();
-
-	assert(g_fullpipe->_gameProjectVersion >= 12);
-
-	_queueName = file.readPascalString();
-
-	for (int i = 0; i < count; i++) {
-		CObject *tmp = file.readClass();
-
-		_exCommands.push_back(tmp);
-	}
-
-	_id = -1;
-	_field_14 = 0;
-	_parId = 0;
-	_isFinished = 0;
-
-	return true;
-}
-
-MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
-	for (CPtrList::iterator s = begin(); s != end(); ++s) {
-		if (((MessageQueue *)s)->_id == id)
-			return (MessageQueue *)s;
-	}
-
-	return 0;
-}
-
-void GlobalMessageQueueList::deleteQueueById(int id) {
-	for (uint i = 0; i < size(); i++)
-		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
-			delete (MessageQueue *)remove_at(i);
-
-			disableQueueById(id);
-			return;
-		}
-}
-
-void GlobalMessageQueueList::disableQueueById(int id) {
-	for (CPtrList::iterator s = begin(); s != end(); ++s) {
-		if (((MessageQueue *)s)->_parId == id)
-			((MessageQueue *)s)->_parId = 0;
-	}
-}
-
-bool removeMessageHandler(int16 id, int pos) {
-	if (g_fullpipe->_messageHandlers) {
-		MessageHandler *curItem = g_fullpipe->_messageHandlers;
-		MessageHandler *prevItem = 0;
-		int curPos = 0;
-
-		while (id != curItem->id) {
-			prevItem = curItem;
-			curItem = curItem->nextItem;
-			curPos++;
-
-			if (!curItem)
-				return false;
-		}
-
-		if (pos == -1 || curPos == pos) {
-			prevItem->nextItem = curItem->nextItem;
-			delete curItem;
-			updateMessageHandlerIndex(prevItem->nextItem, -1);
-
-			return true;
-		}
-	}
-
-	return false;
-}
-
-void updateMessageHandlerIndex(MessageHandler *msg, int offset) {
-	for (; msg; msg = msg->nextItem)
-		msg->index += offset;
-}
-
-void addMessageHandler(int (*callback)(ExCommand *), int16 id) {
-	if (getMessageHandlerById(id))
-		return;
-
-	MessageHandler *curItem = g_fullpipe->_messageHandlers;
-
-	if (!curItem)
-		return;
-
-	int index = 0;
-	for (MessageHandler *i = g_fullpipe->_messageHandlers->nextItem; i; i = i->nextItem) {
-		curItem = i;
-		index++;
-	}
-
-	allocMessageHandler(curItem, id, callback, index);
-
-	if (curItem)
-      updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
-
-}
-
-MessageHandler *getMessageHandlerById(int16 id) {
-	MessageHandler *curItem = g_fullpipe->_messageHandlers;
-
-	if (!curItem)
-		return 0;
-
-	while (id != curItem->id) {
-		curItem = curItem->nextItem;
-
-		if (!curItem)
-			return 0;
-	}
-
-	return curItem;
-}
-
-bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index) {
-	MessageHandler *msg = new MessageHandler;
-
-	if (where) {
-		msg->nextItem = where->nextItem;
-		where->nextItem = msg;
-		msg->id = id;
-		msg->callback = callback;
-		msg->index = index;
-	} else {
-		msg->nextItem = 0;
-		msg->id = id;
-		msg->callback = callback;
-		msg->index = 0;
-
-		g_fullpipe->_messageHandlers = msg;
-	}
-
-	return true;
-}
-
-int getMessageHandlersCount() {
-	int result;
-	MessageHandler *curItem = g_fullpipe->_messageHandlers;
-
-	for (result = 0; curItem; result++)
-		curItem = curItem->nextItem;
-
-	return result;
-}
-
-bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id) {
-	if (getMessageHandlerById(id))
-		return false;
-
-	if (index) {
-		MessageHandler *curItem = g_fullpipe->_messageHandlers;
-
-		for (int i = index - 1; i > 0; i--)
-			if (curItem)
-				curItem = curItem->nextItem;
-
-		bool res = allocMessageHandler(curItem, id, callback, index);
-
-		if (res)
-			updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
-
-		return res;
-	} else {
-		MessageHandler *newItem = new MessageHandler;
-
-		newItem->nextItem = g_fullpipe->_messageHandlers;
-		newItem->id = id;
-		newItem->callback = callback;
-		newItem->index = 0;
-
-		updateMessageHandlerIndex(g_fullpipe->_messageHandlers, 1);
-		g_fullpipe->_messageHandlers = newItem;
-
-		return true;
-	}
-}
-
-bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id) {
-	if (getMessageHandlerById(id))
-		return false;
-
-	MessageHandler *curItem = g_fullpipe->_messageHandlers;
-
-	for (int i = index; i > 0; i--)
-		if (curItem)
-			curItem = curItem->nextItem;
-
-	bool res = allocMessageHandler(curItem, id, callback, index + 1);
-	if (curItem)
-		updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
-
-	return res;
-}
-
-void clearMessageHandlers() {
-	MessageHandler *curItem;
-	MessageHandler *nextItem;
-
-	curItem = g_fullpipe->_messageHandlers;
-	if (curItem) {
-		do {
-			nextItem = curItem->nextItem;
-
-			delete curItem;
-
-			curItem = nextItem;
-		} while (nextItem);
-
-		g_fullpipe->_messageHandlers = 0;
-	}
-}
-
-} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messagequeue.h b/engines/fullpipe/messagequeue.h
deleted file mode 100644
index b47bf49..0000000
--- a/engines/fullpipe/messagequeue.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef FULLPIPE_MESSAGEQUEUE_H
-#define FULLPIPE_MESSAGEQUEUE_H
-
-#include "fullpipe/utils.h"
-#include "fullpipe/inventory.h"
-#include "fullpipe/gfx.h"
-#include "fullpipe/sound.h"
-#include "fullpipe/scene.h"
-
-namespace Fullpipe {
-
-class MessageQueue : public CObject {
-	friend class GlobalMessageQueueList;
-
-  protected:
-	int _id;
-	int _flags;
-	char *_queueName;
-	int16 _dataId;
-	int16 _field_12;
-	int _field_14;
-	CPtrList _exCommands;
-	int _counter;
-	int _field_38;
-	int _isFinished;
-	int _parId;
-	int _flag1;
-
- public:
-	MessageQueue();
-	virtual bool load(MfcArchive &file);
-
-	int getFlags() { return _flags; }
-};
-
-class GlobalMessageQueueList : public CPtrList {
-  public:
-	MessageQueue *getMessageQueueById(int id);
-	void deleteQueueById(int id);
-	void disableQueueById(int id);
-};
-
-struct MessageHandler {
-	int (*callback)(ExCommand *cmd);
-	int16 id;
-	int16 field_6;
-	int index;
-	MessageHandler *nextItem;
-};
-
-bool removeMessageHandler(int16 id, int pos);
-void updateMessageHandlerIndex(MessageHandler *msg, int offset);
-void addMessageHandler(int (*callback)(ExCommand *), int16 id);
-MessageHandler *getMessageHandlerById(int16 id);
-bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index);
-int getMessageHandlersCount();
-bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id);
-bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
-void clearMessageHandlers();
-
-
-} // End of namespace Fullpipe
-
-#endif /* FULLPIPE_MESSAGEQUEUE_H */
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
new file mode 100644
index 0000000..7f5f3b4
--- /dev/null
+++ b/engines/fullpipe/messages.cpp
@@ -0,0 +1,258 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/messages.h"
+
+namespace Fullpipe {
+
+MessageQueue::MessageQueue() {
+	_field_14 = 0;
+	_parId = 0;
+	_dataId = 0;
+	_id = 0;
+	_isFinished = 0;
+	_flags = 0;
+}
+
+bool MessageQueue::load(MfcArchive &file) {
+	debug(5, "MessageQueue::load()");
+
+	_dataId = file.readUint16LE();
+
+	int count = file.readUint16LE();
+
+	assert(g_fullpipe->_gameProjectVersion >= 12);
+
+	_queueName = file.readPascalString();
+
+	for (int i = 0; i < count; i++) {
+		CObject *tmp = file.readClass();
+
+		_exCommands.push_back(tmp);
+	}
+
+	_id = -1;
+	_field_14 = 0;
+	_parId = 0;
+	_isFinished = 0;
+
+	return true;
+}
+
+MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
+	for (CPtrList::iterator s = begin(); s != end(); ++s) {
+		if (((MessageQueue *)s)->_id == id)
+			return (MessageQueue *)s;
+	}
+
+	return 0;
+}
+
+void GlobalMessageQueueList::deleteQueueById(int id) {
+	for (uint i = 0; i < size(); i++)
+		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
+			delete (MessageQueue *)remove_at(i);
+
+			disableQueueById(id);
+			return;
+		}
+}
+
+void GlobalMessageQueueList::disableQueueById(int id) {
+	for (CPtrList::iterator s = begin(); s != end(); ++s) {
+		if (((MessageQueue *)s)->_parId == id)
+			((MessageQueue *)s)->_parId = 0;
+	}
+}
+
+bool removeMessageHandler(int16 id, int pos) {
+	if (g_fullpipe->_messageHandlers) {
+		MessageHandler *curItem = g_fullpipe->_messageHandlers;
+		MessageHandler *prevItem = 0;
+		int curPos = 0;
+
+		while (id != curItem->id) {
+			prevItem = curItem;
+			curItem = curItem->nextItem;
+			curPos++;
+
+			if (!curItem)
+				return false;
+		}
+
+		if (pos == -1 || curPos == pos) {
+			prevItem->nextItem = curItem->nextItem;
+			delete curItem;
+			updateMessageHandlerIndex(prevItem->nextItem, -1);
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+void updateMessageHandlerIndex(MessageHandler *msg, int offset) {
+	for (; msg; msg = msg->nextItem)
+		msg->index += offset;
+}
+
+void addMessageHandler(int (*callback)(ExCommand *), int16 id) {
+	if (getMessageHandlerById(id))
+		return;
+
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	if (!curItem)
+		return;
+
+	int index = 0;
+	for (MessageHandler *i = g_fullpipe->_messageHandlers->nextItem; i; i = i->nextItem) {
+		curItem = i;
+		index++;
+	}
+
+	allocMessageHandler(curItem, id, callback, index);
+
+	if (curItem)
+      updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
+
+}
+
+MessageHandler *getMessageHandlerById(int16 id) {
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	if (!curItem)
+		return 0;
+
+	while (id != curItem->id) {
+		curItem = curItem->nextItem;
+
+		if (!curItem)
+			return 0;
+	}
+
+	return curItem;
+}
+
+bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index) {
+	MessageHandler *msg = new MessageHandler;
+
+	if (where) {
+		msg->nextItem = where->nextItem;
+		where->nextItem = msg;
+		msg->id = id;
+		msg->callback = callback;
+		msg->index = index;
+	} else {
+		msg->nextItem = 0;
+		msg->id = id;
+		msg->callback = callback;
+		msg->index = 0;
+
+		g_fullpipe->_messageHandlers = msg;
+	}
+
+	return true;
+}
+
+int getMessageHandlersCount() {
+	int result;
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	for (result = 0; curItem; result++)
+		curItem = curItem->nextItem;
+
+	return result;
+}
+
+bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id) {
+	if (getMessageHandlerById(id))
+		return false;
+
+	if (index) {
+		MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+		for (int i = index - 1; i > 0; i--)
+			if (curItem)
+				curItem = curItem->nextItem;
+
+		bool res = allocMessageHandler(curItem, id, callback, index);
+
+		if (res)
+			updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
+
+		return res;
+	} else {
+		MessageHandler *newItem = new MessageHandler;
+
+		newItem->nextItem = g_fullpipe->_messageHandlers;
+		newItem->id = id;
+		newItem->callback = callback;
+		newItem->index = 0;
+
+		updateMessageHandlerIndex(g_fullpipe->_messageHandlers, 1);
+		g_fullpipe->_messageHandlers = newItem;
+
+		return true;
+	}
+}
+
+bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id) {
+	if (getMessageHandlerById(id))
+		return false;
+
+	MessageHandler *curItem = g_fullpipe->_messageHandlers;
+
+	for (int i = index; i > 0; i--)
+		if (curItem)
+			curItem = curItem->nextItem;
+
+	bool res = allocMessageHandler(curItem, id, callback, index + 1);
+	if (curItem)
+		updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
+
+	return res;
+}
+
+void clearMessageHandlers() {
+	MessageHandler *curItem;
+	MessageHandler *nextItem;
+
+	curItem = g_fullpipe->_messageHandlers;
+	if (curItem) {
+		do {
+			nextItem = curItem->nextItem;
+
+			delete curItem;
+
+			curItem = nextItem;
+		} while (nextItem);
+
+		g_fullpipe->_messageHandlers = 0;
+	}
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
new file mode 100644
index 0000000..b47bf49
--- /dev/null
+++ b/engines/fullpipe/messages.h
@@ -0,0 +1,86 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_MESSAGEQUEUE_H
+#define FULLPIPE_MESSAGEQUEUE_H
+
+#include "fullpipe/utils.h"
+#include "fullpipe/inventory.h"
+#include "fullpipe/gfx.h"
+#include "fullpipe/sound.h"
+#include "fullpipe/scene.h"
+
+namespace Fullpipe {
+
+class MessageQueue : public CObject {
+	friend class GlobalMessageQueueList;
+
+  protected:
+	int _id;
+	int _flags;
+	char *_queueName;
+	int16 _dataId;
+	int16 _field_12;
+	int _field_14;
+	CPtrList _exCommands;
+	int _counter;
+	int _field_38;
+	int _isFinished;
+	int _parId;
+	int _flag1;
+
+ public:
+	MessageQueue();
+	virtual bool load(MfcArchive &file);
+
+	int getFlags() { return _flags; }
+};
+
+class GlobalMessageQueueList : public CPtrList {
+  public:
+	MessageQueue *getMessageQueueById(int id);
+	void deleteQueueById(int id);
+	void disableQueueById(int id);
+};
+
+struct MessageHandler {
+	int (*callback)(ExCommand *cmd);
+	int16 id;
+	int16 field_6;
+	int index;
+	MessageHandler *nextItem;
+};
+
+bool removeMessageHandler(int16 id, int pos);
+void updateMessageHandlerIndex(MessageHandler *msg, int offset);
+void addMessageHandler(int (*callback)(ExCommand *), int16 id);
+MessageHandler *getMessageHandlerById(int16 id);
+bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index);
+int getMessageHandlersCount();
+bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id);
+bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
+void clearMessageHandlers();
+
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_MESSAGEQUEUE_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 934d916..335d347 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -8,7 +8,7 @@ MODULE_OBJS = \
 	gfx.o \
 	input.o \
 	inventory.o \
-	messagequeue.o \
+	messages.o \
 	motion.o \
 	ngiarchive.o \
 	scene.o \
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 93c56da..1f6cb21 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -25,7 +25,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
-#include "fullpipe/messagequeue.h"
+#include "fullpipe/messages.h"
 
 #include "fullpipe/gameobj.h"
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index c12c0a0..6e033a0 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -31,7 +31,7 @@
 #include "fullpipe/sound.h"
 #include "fullpipe/motion.h"
 #include "fullpipe/input.h"
-#include "fullpipe/messagequeue.h"
+#include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
 
 #include "fullpipe/gameobj.h"
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 7d91a11..32dbf4a 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -25,7 +25,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
-#include "fullpipe/messagequeue.h"
+#include "fullpipe/messages.h"
 
 #include "fullpipe/gameobj.h"
 #include "fullpipe/objectnames.h"
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index ec6b590..900ca84 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -28,7 +28,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/motion.h"
 #include "fullpipe/ngiarchive.h"
-#include "fullpipe/messagequeue.h"
+#include "fullpipe/messages.h"
 
 namespace Fullpipe {
 


Commit: 4dc3481ec1c8ff5cabdf9000e5d62a6d79537f9b
    https://github.com/scummvm/scummvm/commit/4dc3481ec1c8ff5cabdf9000e5d62a6d79537f9b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:06-07:00

Commit Message:
FULLPIPE: Moved Messge class to messages.cpp

Changed paths:
    engines/fullpipe/gameloader.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 3a96a53..fa1bb33 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -25,6 +25,7 @@
 
 #include "fullpipe/objects.h"
 #include "fullpipe/inventory.h"
+#include "fullpipe/messages.h"
 
 namespace Fullpipe {
 
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 7f5f3b4..6b07a4e 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -27,6 +27,98 @@
 
 namespace Fullpipe {
 
+ExCommand::ExCommand() {
+	_field_3C = 1;
+	_messageNum = 0;
+	_excFlags = 0;
+	_parId = 0;
+}
+
+ExCommand::ExCommand(ExCommand *src) : Message(src) {
+	_field_3C = 1;
+	_messageNum = src->_messageNum;
+	_excFlags = src->_excFlags;
+	_parId = src->_parId;
+
+}
+
+bool ExCommand::load(MfcArchive &file) {
+	debug(5, "ExCommand::load()");
+
+	_parentId = file.readUint16LE();
+	_messageKind = file.readUint32LE();
+	_x = file.readUint32LE();
+	_y = file.readUint32LE();
+	_field_14 = file.readUint32LE();
+	_sceneClickX = file.readUint32LE();
+	_sceneClickY = file.readUint32LE();
+	_field_20 = file.readUint32LE();
+	_field_24 = file.readUint32LE();
+	_param28 = file.readUint32LE();
+	_field_2C = file.readUint32LE();
+	_field_30 = file.readUint32LE();
+	_field_34 = file.readUint32LE();
+
+	_messageNum = file.readUint32LE();
+
+	_field_3C = 0;
+
+	if (g_fullpipe->_gameProjectVersion >= 12) {
+		_excFlags = file.readUint32LE();
+		_parId = file.readUint32LE();
+	}
+
+	return true;
+}
+
+Message::Message() {
+	_messageKind = 0;
+	_parentId = 0;
+	_x = 0;
+	_y = 0;
+	_field_14 = 0;
+	_sceneClickX = 0;
+	_sceneClickY = 0;
+	_field_20 = 0;
+	_field_24 = 0;
+	_param28 = 0;
+	_field_2C = 0;
+	_field_30 = 0;
+	_field_34 = 0;
+}
+
+Message::Message(Message *src) {
+	_parentId = src->_parentId;
+	_messageKind = src->_messageKind;
+	_x = src->_x;
+	_y = src->_y;
+	_field_14 = src->_field_14;
+	_sceneClickX = src->_sceneClickX;
+	_sceneClickY = src->_sceneClickY;
+	_field_20 = src->_field_20;
+	_field_24 = src->_field_24;
+	_param28 = src->_param28;
+	_field_2C = src->_field_2C;
+	_field_30 = src->_field_30;
+	_field_34 = src->_field_34;
+}
+
+CObjstateCommand::CObjstateCommand() {
+	_value = 0;
+}
+
+bool CObjstateCommand::load(MfcArchive &file) {
+	debug(5, "CObjStateCommand::load()");
+
+	_cmd.load(file);
+
+	_value = file.readUint32LE();
+
+	_objCommandName = file.readPascalString();
+
+	return true;
+}
+
 MessageQueue::MessageQueue() {
 	_field_14 = 0;
 	_parId = 0;
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index b47bf49..97e4164 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -31,6 +31,51 @@
 
 namespace Fullpipe {
 
+class Message : public CObject {
+ public:
+	int _messageKind;
+	int16 _parentId;
+	int _x;
+	int _y;
+	int _field_14;
+	int _sceneClickX;
+	int _sceneClickY;
+	int _field_20;
+	int _field_24;
+	int _param28;
+	int _field_2C;
+	int _field_30;
+	int _field_34;
+
+ public:
+	Message();
+	Message(Message *src);
+};
+
+class ExCommand : public Message {
+	int _messageNum;
+	int _field_3C;
+	int _excFlags;
+	int _parId;
+
+ public:
+	ExCommand();
+	ExCommand(ExCommand *src);
+	virtual ~ExCommand() {}
+
+	virtual bool load(MfcArchive &file);
+};
+
+class CObjstateCommand : public CObject {
+	ExCommand _cmd;
+	char *_objCommandName;
+	int _value;
+
+ public:
+	CObjstateCommand();
+	virtual bool load(MfcArchive &file);
+};
+
 class MessageQueue : public CObject {
 	friend class GlobalMessageQueueList;
 
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 9acedc9..cc6fef5 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -143,41 +143,6 @@ union VarValue {
 	char *stringValue;
 };
 
-class Message : public CObject {
- public:
-	int _messageKind;
-	int16 _parentId;
-	int _x;
-	int _y;
-	int _field_14;
-	int _sceneClickX;
-	int _sceneClickY;
-	int _field_20;
-	int _field_24;
-	int _param28;
-	int _field_2C;
-	int _field_30;
-	int _field_34;
-
- public:
-	Message();
-	Message(Message *src);
-};
-
-class ExCommand : public Message {
-	int _messageNum;
-	int _field_3C;
-	int _excFlags;
-	int _parId;
-
- public:
-	ExCommand();
-	ExCommand(ExCommand *src);
-	virtual ~ExCommand() {}
-
-	virtual bool load(MfcArchive &file);
-};
-
 class CGameVar : public CObject {
  public:
 	CGameVar *_nextVarObj;
@@ -212,16 +177,6 @@ class PreloadItems : public Common::Array<PreloadItem>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class CObjstateCommand : public CObject {
-	ExCommand _cmd;
-	char *_objCommandName;
-	int _value;
-
- public:
-	CObjstateCommand();
-	virtual bool load(MfcArchive &file);
-};
-
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_OBJECTS_H */
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index c1da2d5..00d4619 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -210,98 +210,6 @@ bool CInteraction::load(MfcArchive &file) {
 	return true;
 }
 
-ExCommand::ExCommand() {
-	_field_3C = 1;
-	_messageNum = 0;
-	_excFlags = 0;
-	_parId = 0;
-}
-
-ExCommand::ExCommand(ExCommand *src) : Message(src) {
-	_field_3C = 1;
-	_messageNum = src->_messageNum;
-	_excFlags = src->_excFlags;
-	_parId = src->_parId;
-
-}
-
-bool ExCommand::load(MfcArchive &file) {
-	debug(5, "ExCommand::load()");
-
-	_parentId = file.readUint16LE();
-	_messageKind = file.readUint32LE();
-	_x = file.readUint32LE();
-	_y = file.readUint32LE();
-	_field_14 = file.readUint32LE();
-	_sceneClickX = file.readUint32LE();
-	_sceneClickY = file.readUint32LE();
-	_field_20 = file.readUint32LE();
-	_field_24 = file.readUint32LE();
-	_param28 = file.readUint32LE();
-	_field_2C = file.readUint32LE();
-	_field_30 = file.readUint32LE();
-	_field_34 = file.readUint32LE();
-
-	_messageNum = file.readUint32LE();
-
-	_field_3C = 0;
-
-	if (g_fullpipe->_gameProjectVersion >= 12) {
-		_excFlags = file.readUint32LE();
-		_parId = file.readUint32LE();
-	}
-
-	return true;
-}
-
-Message::Message() {
-	_messageKind = 0;
-	_parentId = 0;
-	_x = 0;
-	_y = 0;
-	_field_14 = 0;
-	_sceneClickX = 0;
-	_sceneClickY = 0;
-	_field_20 = 0;
-	_field_24 = 0;
-	_param28 = 0;
-	_field_2C = 0;
-	_field_30 = 0;
-	_field_34 = 0;
-}
-
-Message::Message(Message *src) {
-	_parentId = src->_parentId;
-	_messageKind = src->_messageKind;
-	_x = src->_x;
-	_y = src->_y;
-	_field_14 = src->_field_14;
-	_sceneClickX = src->_sceneClickX;
-	_sceneClickY = src->_sceneClickY;
-	_field_20 = src->_field_20;
-	_field_24 = src->_field_24;
-	_param28 = src->_param28;
-	_field_2C = src->_field_2C;
-	_field_30 = src->_field_30;
-	_field_34 = src->_field_34;
-}
-
-CObjstateCommand::CObjstateCommand() {
-	_value = 0;
-}
-
-bool CObjstateCommand::load(MfcArchive &file) {
-	debug(5, "CObjStateCommand::load()");
-
-	_cmd.load(file);
-
-	_value = file.readUint32LE();
-
-	_objCommandName = file.readPascalString();
-
-	return true;
-}
-
 bool PreloadItems::load(MfcArchive &file) {
 	debug(5, "PreloadItems::load()");
 
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 128f0f5..83bdc73 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -27,6 +27,8 @@
 
 namespace Fullpipe {
 
+class ExCommand;
+
 class CStepArray : public CObject {
 	int _currPointIndex;
 	Common::Point **_points;


Commit: ad537b1a7e04873c4e3ff3b02ce8893bd6ce12f9
    https://github.com/scummvm/scummvm/commit/ad537b1a7e04873c4e3ff3b02ce8893bd6ce12f9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:06-07:00

Commit Message:
FULLPIPE: Further work on loadGam()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index d89e1f3..1e342bc 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -90,6 +90,11 @@ FullpipeEngine::~FullpipeEngine() {
 void FullpipeEngine::initialize() {
 	_globalMessageQueueList = new GlobalMessageQueueList;
 	_behaviorManager = new BehaviorManager;
+
+	_sceneRect.left = 0;
+	_sceneRect.top = 0;
+	_sceneRect.right = 799;
+	_sceneRect.bottom = 599;
 }
 
 Common::Error FullpipeEngine::run() {
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 252333e..2b007bd 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -144,6 +144,10 @@ bool PictureObject::load(MfcArchive &file, bool bigPicture) {
 	_ox2 = _ox;
 	_oy2 = _oy;
 
+#if 0
+	_picture->displayPicture();
+#endif
+
 	return true;
 }
 
@@ -300,10 +304,6 @@ bool Picture::load(MfcArchive &file) {
 
 	debug(5, "Picture::load: <%s>", _memfilename);
 
-#if 0
-	displayPicture();
-#endif
-
 	return true;
 }
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 36ec1bd..bfe21aa 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -60,6 +60,7 @@ struct Bitmap {
 class Picture : public MemoryObject {
 	friend class Movement;
 	friend class DynamicPhase;
+	friend class PictureObject;
 
 	Common::Rect _rect;
 	Bitmap *_convertedBitmap;
@@ -130,6 +131,7 @@ class GameObject : public CObject {
 };
 
 class PictureObject : public GameObject {
+  public:
 	Picture *_picture;
 	CPtrList *_pictureObject2List;
 	int _ox2;
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 0480753..8df06e6 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -101,7 +101,7 @@ void CInventory2::addItem(int itemId, int value) {
 }
 
 void CInventory2::rebuildItemRects() {
-	g_fullpipe->accessScene(_sceneId);
+	_scene = g_fullpipe->accessScene(_sceneId);
 
 	warning("STUB: CInventory2::rebuildItemRects()");
 }
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 00d4619..eb50cfb 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -29,6 +29,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/scene.h"
+#include "fullpipe/statics.h"
 
 #include "fullpipe/gameobj.h"
 
@@ -104,16 +105,42 @@ bool FullpipeEngine::loadGam(const char *fname) {
 
 		_inventory->rebuildItemRects();
 
-		//for (CPtrList::iterator s = _inventory->getScene()->_picObjList.begin(); s != _inventory->getScene()->_picObjList.end(); ++s) {
-		//}
+		for (CPtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) {
+			((MemoryObject *)((PicPicturetureObject *)*p)->_picture)->load();
+		}
 
 		//_sceneSwitcher = sceneSwitcher;
 		//_preloadCallback = gameLoaderPreloadCallback
 		//_readSavegameCallback = gameLoaderReadSavegameCallback;
 		_aniMan = accessScene(SC_COMMON)->getAniMan();
 		_scene2 = 0;
-		
-		warning("STUB: loadGam()");
+#if 0
+		_movTable = _aniMan->preloadMovements();
+
+		_aniMan->setSpeed(1);
+
+		PictureObject *pic = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
+
+		pic->setFlags(pic->_flags & 0xFFFB);
+
+		// Not used in full game
+		//_evalVersionPic = accessScene(SC_COMMON)->getPictureObjectById(PIC_CMN_EVAL, 0);
+
+		initMaps();
+		initCursors();
+
+		setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED"));
+
+		if (_flgPlayIntro) {
+			_gameLoader->loadScene(SC_INTRO1);
+			_gameLoader->gotoScene(SC_INTRO1, TrubaUp);
+		} else {
+			_gameLoader->loadScene(SC_1);
+			_gameLoader->gotoScene(SC_1, TrubaLeft);
+		}
+#endif
+		if (!_currentScene)
+			return false;
 	} else
 		return false;
 


Commit: 94fedf012872487d6511bbd428980e5706b5caba
    https://github.com/scummvm/scummvm/commit/94fedf012872487d6511bbd428980e5706b5caba
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:07-07:00

Commit Message:
FULLPIPE: Finished stubbing loadGam()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 1e342bc..2563a9c 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -34,6 +34,8 @@
 #include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
 
+#include "fullpipe/gameobj.h"
+
 namespace Fullpipe {
 
 FullpipeEngine *g_fullpipe = 0;
@@ -63,11 +65,15 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_inputDisabled = false;
 
 	_needQuit = false;
+	_flgPlayIntro = true;
+
+	_musicAllowed = -1;
 
 	_aniMan = 0;
 	_aniMan2 = 0;
 	_currentScene = 0;
 	_scene2 = 0;
+	_movTable = 0;
 
 	_globalMessageQueueList = 0;
 	_messageHandlers = 0;
@@ -336,4 +342,30 @@ void FullpipeEngine::setObjectState(const char *name, int state) {
 	var->setSubVarAsInt(name, state);
 }
 
+void FullpipeEngine::initCursors() {
+	warning("STUB: FullpipeEngine::initCursors()");
+}
+
+void FullpipeEngine::initMap() {
+	memset(_mapTable, 0, sizeof(_mapTable));
+
+	updateMapPiece(PIC_MAP_S01, 1);
+	updateMapPiece(PIC_MAP_A13, 1u);
+}
+
+void FullpipeEngine::updateMapPiece(int mapId, int update) {
+	for (int i = 0; i < 200; i++) {
+		int hiWord = (_mapTable[i] >> 16) & 0xffff;
+
+		if (hiWord == mapId) {
+			_mapTable[i] |= update;
+			return;
+		}
+		if (!hiWord) {
+			_mapTable[i] = (mapId << 16) | update;
+			return;
+		}
+	}
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 4415115..0ae837d 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -52,6 +52,7 @@ class EntranceInfo;
 class GameProject;
 class GlobalMessageQueueList;
 class MessageHandler;
+struct MovTable;
 class NGIArchive;
 class Scene;
 class SoundList;
@@ -68,6 +69,8 @@ public:
 
 	void initialize();
 
+	void setMusicAllowed(int val) { _musicAllowed = val; }
+
 	// Detection related functions
 	const ADGameDescription *_gameDescription;
 	const char *getGameId() const;
@@ -116,16 +119,27 @@ public:
 
 	BehaviorManager *_behaviorManager;
 
+	MovTable *_movTable;
+
+	void initMap();
+	void updateMapPiece(int mapId, int update);
+
 	bool _needQuit;
+	bool _flgPlayIntro;
+	int _musicAllowed;
 
 	void initObjectStates();
 	void setLevelStates();
 	void setSwallowedEggsState();
 
+	void initCursors();
+
 	CGameVar *_swallowedEgg1;
 	CGameVar *_swallowedEgg2;
 	CGameVar *_swallowedEgg3;
 
+	int32 _mapTable[200];
+
 	Scene *_inventoryScene;
 	CInventory2 *_inventory;
 
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 675839f..1641d4d 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -155,6 +155,12 @@ bool CGameLoader::loadScene(int sceneId) {
 	return false;
 }
 
+bool CGameLoader::gotoScene(int sceneId, int entranceId) {
+	warning("STUB: CGameLoader::gotoScene(%d, %d)", sceneId, entranceId);
+
+	return true;
+}
+
 int CGameLoader::getSceneTagBySceneId(int sceneId, SceneTag **st) {
 	if (_sc2array.size() > 0 && _gameProject->_sceneTagList->size() > 0) {
 		for (uint i = 0; i < _sc2array.size(); i++) {
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index fa1bb33..36c99f2 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -39,7 +39,8 @@ class CGameLoader : public CObject {
 	virtual ~CGameLoader();
 
 	virtual bool load(MfcArchive &file);
-	bool loadScene(int num);
+	bool loadScene(int sceneId);
+	bool gotoScene(int sceneId, int entranceId);
 
 	int getSceneTagBySceneId(int sceneId, SceneTag **st);
 	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index eb50cfb..82c72b8 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -106,7 +106,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->rebuildItemRects();
 
 		for (CPtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) {
-			((MemoryObject *)((PicPicturetureObject *)*p)->_picture)->load();
+			((MemoryObject *)((PictureObject *)*p)->_picture)->load();
 		}
 
 		//_sceneSwitcher = sceneSwitcher;
@@ -114,8 +114,8 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		//_readSavegameCallback = gameLoaderReadSavegameCallback;
 		_aniMan = accessScene(SC_COMMON)->getAniMan();
 		_scene2 = 0;
-#if 0
-		_movTable = _aniMan->preloadMovements();
+
+		_movTable = _aniMan->countMovements();
 
 		_aniMan->setSpeed(1);
 
@@ -126,7 +126,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		// Not used in full game
 		//_evalVersionPic = accessScene(SC_COMMON)->getPictureObjectById(PIC_CMN_EVAL, 0);
 
-		initMaps();
+		initMap();
 		initCursors();
 
 		setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED"));
@@ -138,7 +138,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 			_gameLoader->loadScene(SC_1);
 			_gameLoader->gotoScene(SC_1, TrubaLeft);
 		}
-#endif
+
 		if (!_currentScene)
 			return false;
 	} else
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 32dbf4a..1f87721 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -238,6 +238,16 @@ void StaticANIObject::draw2() {
 	}
 }
 
+MovTable *StaticANIObject::countMovements() {
+	warning("STUB: StaticANIObject::countMovements()");
+
+	return 0;
+}
+
+void StaticANIObject::setSpeed(int speed) {
+	warning("STUB: StaticANIObject::setSpeed(%d)", speed);
+}
+
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 83bdc73..8a0f36a 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -185,6 +185,14 @@ class StaticANIObject : public GameObject {
 	Statics *addReverseStatics(Statics *ani);
 	void draw();
 	void draw2();
+
+	MovTable *countMovements();
+	void setSpeed(int speed);
+};
+
+struct MovTable {
+	int count;
+	int16 *movs;
 };
 
 } // End of namespace Fullpipe


Commit: 4d215a849ddc7289615e9ba0a6916974c4d64b2a
    https://github.com/scummvm/scummvm/commit/4d215a849ddc7289615e9ba0a6916974c4d64b2a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:07-07:00

Commit Message:
FULLPIPE: Moved all engine initialization functions to init.cpp

Changed paths:
  A engines/fullpipe/init.cpp
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/module.mk



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 2563a9c..32ccbda 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -28,14 +28,10 @@
 #include "engines/util.h"
 
 #include "fullpipe/fullpipe.h"
-#include "fullpipe/objectnames.h"
-#include "fullpipe/objects.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
 
-#include "fullpipe/gameobj.h"
-
 namespace Fullpipe {
 
 FullpipeEngine *g_fullpipe = 0;
@@ -195,126 +191,6 @@ void FullpipeEngine::updateEvents() {
 	}
 }
 
-void FullpipeEngine::initObjectStates() {
-	setLevelStates();
-
-	setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg));
-	setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_NotCrackedEggs));
-	setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken));
-	setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First));
-	setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No));
-	setObjectState(sO_Jar_4, getObjectEnumState(sO_Jar_4, sO_OnTheSpring));
-	setObjectState(sO_GulpedEggs, getObjectEnumState(sO_GulpedEgg, sO_NotPresent));
-
-	setSwallowedEggsState();
-
-	setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses));
-	setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking));
-	setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
-	setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle));
-	setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot));
-	setObjectState(sO_Fly_12, 0);
-	setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable));
-	setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7));
-	setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping));
-	setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty));
-	setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
-	setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
-	setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe));
-	setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
-	setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
-	setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging));
-	setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No));
-	setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted));
-	setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight));
-	setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14));
-	setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent));
-	setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe));
-	setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree));
-	setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom));
-	setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree));
-	setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin));
-	setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe));
-	setObjectState(sO_Fly_17, 1);
-	setObjectState(sO_DudeSwinged, 0);
-	setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging));
-	setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present));
-	setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together));
-	setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen));
-	setObjectState(sO_Grandpa, getObjectEnumState(sO_Grandpa, sO_InSock));
-	setObjectState(sO_CoinSlot_22, getObjectEnumState(sO_CoinSlot_22, sO_Empty));
-	setObjectState(sO_UpperHatch_23, getObjectEnumState(sO_UpperHatch_23, sO_Closed));
-	setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed));
-	setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken));
-	setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool));
-	setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe));
-	setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe));
-	setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed));
-	setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging));
-	setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe));
-	setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened));
-	setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed));
-	setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed));
-	setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed));
-	setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened));
-	setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull));
-	setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs));
-	setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering));
-	setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop));
-	setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe));
-	setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe));
-	setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel));
-	setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe));
-	setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown));
-	setObjectState(sO_Fireman, getObjectEnumState(sO_Fireman, sO_WithHose));
-	setObjectState(sO_Cube, getObjectEnumState(sO_Cube, sO_In_33));
-	setObjectState(sO_MommyOfHandle_32, getObjectEnumState(sO_MommyOfHandle_32, sO_WithoutHandle));
-	setObjectState(sO_Pedestal_33, getObjectEnumState(sO_Pedestal_33, sO_IsFree));
-	setObjectState(sO_Valve_34, getObjectEnumState(sO_Valve_34, sO_WithNothing));
-	setObjectState(sO_Stool_34, getObjectEnumState(sO_Stool_34, sO_WithoutDrawer));
-	setObjectState(sO_Plank_34, getObjectEnumState(sO_Plank_34, sO_Passive));
-	setObjectState(sO_Hatch_34, getObjectEnumState(sO_Hatch_34, sO_Closed));
-	setObjectState(sO_Valve_35, getObjectEnumState(sO_Valve_35, sO_TurnedOff));
-	setObjectState(sO_Carpet_35, getObjectEnumState(sO_Carpet_35, sO_CannotTake));
-	setObjectState(sO_CoinSlot_35, getObjectEnumState(sO_CoinSlot_35, sO_WithCoin));
-	setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork));
-	setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet));
-	setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On));
-	setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On));
-	setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On));
-	setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable));
-	setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer));
-}
-
-void FullpipeEngine::setLevelStates() {
-	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
-
-	if (v) {
-		v->setSubVarAsInt(sO_Level0, 2833);
-		v->setSubVarAsInt(sO_Level1, 2754);
-		v->setSubVarAsInt(sO_Level2, 2757);
-		v->setSubVarAsInt(sO_Level3, 2760);
-		v->setSubVarAsInt(sO_Level4, 2763);
-		v->setSubVarAsInt(sO_Level5, 2766);
-		v->setSubVarAsInt(sO_Level6, 2769);
-		v->setSubVarAsInt(sO_Level7, 2772);
-		v->setSubVarAsInt(sO_Level8, 2775);
-		v->setSubVarAsInt(sO_Level9, 2778);
-	}
-}
-
-void FullpipeEngine::setSwallowedEggsState() {
-	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
-
-	_swallowedEgg1 = v->getSubVarByName(sO_Egg1);
-	_swallowedEgg2 = v->getSubVarByName(sO_Egg2);
-	_swallowedEgg3 = v->getSubVarByName(sO_Egg3);
-
-	_swallowedEgg1->_value.intValue = 0;
-	_swallowedEgg2->_value.intValue = 0;
-	_swallowedEgg3->_value.intValue = 0;
-}
-
 int FullpipeEngine::getObjectEnumState(const char *name, const char *state) {
 	CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
 
@@ -342,17 +218,6 @@ void FullpipeEngine::setObjectState(const char *name, int state) {
 	var->setSubVarAsInt(name, state);
 }
 
-void FullpipeEngine::initCursors() {
-	warning("STUB: FullpipeEngine::initCursors()");
-}
-
-void FullpipeEngine::initMap() {
-	memset(_mapTable, 0, sizeof(_mapTable));
-
-	updateMapPiece(PIC_MAP_S01, 1);
-	updateMapPiece(PIC_MAP_A13, 1u);
-}
-
 void FullpipeEngine::updateMapPiece(int mapId, int update) {
 	for (int i = 0; i < 200; i++) {
 		int hiWord = (_mapTable[i] >> 16) & 0xffff;
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
new file mode 100644
index 0000000..07a7c9c
--- /dev/null
+++ b/engines/fullpipe/init.cpp
@@ -0,0 +1,163 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/gameobj.h"
+
+namespace Fullpipe {
+
+void FullpipeEngine::initObjectStates() {
+	setLevelStates();
+
+	setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg));
+	setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_NotCrackedEggs));
+	setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken));
+	setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First));
+	setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No));
+	setObjectState(sO_Jar_4, getObjectEnumState(sO_Jar_4, sO_OnTheSpring));
+	setObjectState(sO_GulpedEggs, getObjectEnumState(sO_GulpedEgg, sO_NotPresent));
+
+	setSwallowedEggsState();
+
+	setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses));
+	setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking));
+	setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
+	setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle));
+	setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot));
+	setObjectState(sO_Fly_12, 0);
+	setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable));
+	setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7));
+	setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping));
+	setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty));
+	setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
+	setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
+	setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe));
+	setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
+	setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
+	setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging));
+	setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No));
+	setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted));
+	setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight));
+	setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14));
+	setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent));
+	setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe));
+	setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree));
+	setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom));
+	setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree));
+	setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin));
+	setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe));
+	setObjectState(sO_Fly_17, 1);
+	setObjectState(sO_DudeSwinged, 0);
+	setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging));
+	setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present));
+	setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together));
+	setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen));
+	setObjectState(sO_Grandpa, getObjectEnumState(sO_Grandpa, sO_InSock));
+	setObjectState(sO_CoinSlot_22, getObjectEnumState(sO_CoinSlot_22, sO_Empty));
+	setObjectState(sO_UpperHatch_23, getObjectEnumState(sO_UpperHatch_23, sO_Closed));
+	setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed));
+	setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken));
+	setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool));
+	setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe));
+	setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe));
+	setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed));
+	setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging));
+	setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe));
+	setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened));
+	setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed));
+	setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed));
+	setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed));
+	setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened));
+	setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull));
+	setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs));
+	setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering));
+	setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop));
+	setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe));
+	setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe));
+	setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel));
+	setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe));
+	setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown));
+	setObjectState(sO_Fireman, getObjectEnumState(sO_Fireman, sO_WithHose));
+	setObjectState(sO_Cube, getObjectEnumState(sO_Cube, sO_In_33));
+	setObjectState(sO_MommyOfHandle_32, getObjectEnumState(sO_MommyOfHandle_32, sO_WithoutHandle));
+	setObjectState(sO_Pedestal_33, getObjectEnumState(sO_Pedestal_33, sO_IsFree));
+	setObjectState(sO_Valve_34, getObjectEnumState(sO_Valve_34, sO_WithNothing));
+	setObjectState(sO_Stool_34, getObjectEnumState(sO_Stool_34, sO_WithoutDrawer));
+	setObjectState(sO_Plank_34, getObjectEnumState(sO_Plank_34, sO_Passive));
+	setObjectState(sO_Hatch_34, getObjectEnumState(sO_Hatch_34, sO_Closed));
+	setObjectState(sO_Valve_35, getObjectEnumState(sO_Valve_35, sO_TurnedOff));
+	setObjectState(sO_Carpet_35, getObjectEnumState(sO_Carpet_35, sO_CannotTake));
+	setObjectState(sO_CoinSlot_35, getObjectEnumState(sO_CoinSlot_35, sO_WithCoin));
+	setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork));
+	setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet));
+	setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On));
+	setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On));
+	setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On));
+	setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable));
+	setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer));
+}
+
+void FullpipeEngine::setLevelStates() {
+	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+
+	if (v) {
+		v->setSubVarAsInt(sO_Level0, 2833);
+		v->setSubVarAsInt(sO_Level1, 2754);
+		v->setSubVarAsInt(sO_Level2, 2757);
+		v->setSubVarAsInt(sO_Level3, 2760);
+		v->setSubVarAsInt(sO_Level4, 2763);
+		v->setSubVarAsInt(sO_Level5, 2766);
+		v->setSubVarAsInt(sO_Level6, 2769);
+		v->setSubVarAsInt(sO_Level7, 2772);
+		v->setSubVarAsInt(sO_Level8, 2775);
+		v->setSubVarAsInt(sO_Level9, 2778);
+	}
+}
+
+void FullpipeEngine::setSwallowedEggsState() {
+	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+
+	_swallowedEgg1 = v->getSubVarByName(sO_Egg1);
+	_swallowedEgg2 = v->getSubVarByName(sO_Egg2);
+	_swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+
+	_swallowedEgg1->_value.intValue = 0;
+	_swallowedEgg2->_value.intValue = 0;
+	_swallowedEgg3->_value.intValue = 0;
+}
+
+void FullpipeEngine::initCursors() {
+	warning("STUB: FullpipeEngine::initCursors()");
+}
+
+void FullpipeEngine::initMap() {
+	memset(_mapTable, 0, sizeof(_mapTable));
+
+	updateMapPiece(PIC_MAP_S01, 1);
+	updateMapPiece(PIC_MAP_A13, 1u);
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 335d347..1771036 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS = \
 	fullpipe.o \
 	gameloader.o \
 	gfx.o \
+	init.o \
 	input.o \
 	inventory.o \
 	messages.o \


Commit: 74b662516dec82d17d897510e7ef3a322e7fdd26
    https://github.com/scummvm/scummvm/commit/74b662516dec82d17d897510e7ef3a322e7fdd26
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:07-07:00

Commit Message:
FULLPIPE: Implemented StaticANIObject::countMovements()

Changed paths:
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 0ae837d..c058022 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -91,6 +91,8 @@ public:
 	GameProject *_gameProject;
 	bool loadGam(const char *fname);
 
+	CGameVar *getGameLoaderGameVar();
+
 	int _gameProjectVersion;
 	int _pictureScale;
 	int _scrollSpeed;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 1641d4d..1049e1c 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -184,4 +184,11 @@ void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAn
 	warning("STUB: CGameLoader::applyPicAniInfo()");
 }
 
+CGameVar *FullpipeEngine::getGameLoaderGameVar() {
+	if (_gameLoader)
+		return _gameLoader->_gameVar;
+	else
+		return 0;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index bfe21aa..27be7c4 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -128,6 +128,7 @@ class GameObject : public CObject {
 	void renumPictures(CPtrList *lst);
 	void setFlags(int16 flags) { _flags = flags; }
 	void clearFlags() { _flags = 0; }
+	const char *getName() { return _objectName; }
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index cc6fef5..ba65181 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -162,7 +162,7 @@ class CGameVar : public CObject {
 	int getSubVarAsInt(const char *name);
 	CGameVar *addSubVarAsInt(const char *name, int value);
 	bool addSubVar(CGameVar *subvar);
-
+	int getSubVarsCount();
 };
 
 struct PreloadItem {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 82c72b8..6470b1c 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -384,6 +384,16 @@ bool CGameVar::addSubVar(CGameVar *subvar) {
 	return false;
 }
 
+int CGameVar::getSubVarsCount() {
+	int res;
+	CGameVar *sub = _subVars;
+
+	for (res = 0; sub; res++)
+		sub = sub->_nextVarObj;
+
+	return res;
+}
+
 Sc2::Sc2() {
 	_sceneId = 0;
 	_field_2 = 0;
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 1f87721..cca12ce 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -239,9 +239,29 @@ void StaticANIObject::draw2() {
 }
 
 MovTable *StaticANIObject::countMovements() {
-	warning("STUB: StaticANIObject::countMovements()");
+	CGameVar *preloadSubVar = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("PRELOAD");
 
-	return 0;
+	if (preloadSubVar || preloadSubVar->getSubVarsCount() == 0)
+		return 0;
+
+	MovTable *movTable = new MovTable;
+
+	movTable->count = _movements.size();
+	movTable->movs = (int16 *)calloc(_movements.size(), sizeof(int16));
+
+	for (uint i = 0; i < _movements.size(); i++) {
+		GameObject *obj = (GameObject *)_movements[i];
+		movTable->movs[i] = 2;
+
+		for (CGameVar *sub = preloadSubVar->_subVars; sub; sub = sub->_nextVarObj) {
+			if (scumm_stricmp(obj->getName(), sub->_varName) == 0) {
+				movTable->movs[i] = 1;
+				break;
+			}
+		}
+	}
+
+	return movTable;
 }
 
 void StaticANIObject::setSpeed(int speed) {


Commit: 3c77ad17afab558f638b3f09dd938847ec3a6685
    https://github.com/scummvm/scummvm/commit/3c77ad17afab558f638b3f09dd938847ec3a6685
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:07-07:00

Commit Message:
FULLPIPE: Implement FullpipeEngine::initCursors()

Changed paths:
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/init.cpp
    engines/fullpipe/input.cpp
    engines/fullpipe/input.h



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index c058022..a0dba6a 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -48,6 +48,7 @@ class CGameLoader;
 class CGameVar;
 class CInputController;
 class CInventory2;
+struct CursorInfo;
 class EntranceInfo;
 class GameProject;
 class GlobalMessageQueueList;
@@ -92,6 +93,7 @@ public:
 	bool loadGam(const char *fname);
 
 	CGameVar *getGameLoaderGameVar();
+	CInputController *getGameLoaderInputController();
 
 	int _gameProjectVersion;
 	int _pictureScale;
@@ -135,6 +137,7 @@ public:
 	void setSwallowedEggsState();
 
 	void initCursors();
+	void addCursor(CursorInfo *cursorInfo, Scene *inv, int pictureId, int hotspotX, int hotspotY, int itemPictureOffsX, int itemPictureOffsY);
 
 	CGameVar *_swallowedEgg1;
 	CGameVar *_swallowedEgg2;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 1049e1c..72b2827 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -191,4 +191,11 @@ CGameVar *FullpipeEngine::getGameLoaderGameVar() {
 		return 0;
 }
 
+CInputController *FullpipeEngine::getGameLoaderInputController() {
+	if (_gameLoader)
+		return _gameLoader->_inputController;
+	else
+		return 0;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 27be7c4..81de8ec 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -61,6 +61,7 @@ class Picture : public MemoryObject {
 	friend class Movement;
 	friend class DynamicPhase;
 	friend class PictureObject;
+	friend class CInputController;
 
 	Common::Rect _rect;
 	Bitmap *_convertedBitmap;
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index 07a7c9c..9892f55 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -25,6 +25,8 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/objectnames.h"
+#include "fullpipe/input.h"
+
 #include "fullpipe/gameobj.h"
 
 namespace Fullpipe {
@@ -149,8 +151,47 @@ void FullpipeEngine::setSwallowedEggsState() {
 	_swallowedEgg3->_value.intValue = 0;
 }
 
+void FullpipeEngine::addCursor(CursorInfo *cursorInfo, Scene *inv, int pictureId, int hotspotX, int hotspotY, int itemPictureOffsX, int itemPictureOffsY) {
+	cursorInfo->pictureId = pictureId;
+	cursorInfo->picture = inv->getPictureObjectById(pictureId, 0)->_picture;
+	cursorInfo->hotspotX = hotspotX;
+	cursorInfo->hotspotY = hotspotY;
+	cursorInfo->itemPictureOffsX = itemPictureOffsX;
+	cursorInfo->itemPictureOffsY = itemPictureOffsY;
+
+	getGameLoaderInputController()->addCursor(cursorInfo);
+}
+
 void FullpipeEngine::initCursors() {
-	warning("STUB: FullpipeEngine::initCursors()");
+	CursorInfo crs;
+	Scene *inv = accessScene(SC_INV);
+
+	addCursor(&crs, inv, PIC_CSR_DEFAULT,     15,  1, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_DEFAULT_INV, 18, 18, 23, 23);
+	addCursor(&crs, inv, PIC_CSR_ITN,         11, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ITN_RED,     11, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ITN_GREEN,   11, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ITN_INV,     23, 17, 23, 17);
+	addCursor(&crs, inv, PIC_CSR_GOU,         15, 17, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_GOD,         15,  1, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_GOL,         26,  1, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_GOR,         15,  1, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_GOFAR_L,      1,  1, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_GOFAR_R,     39,  1, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE1,     12, 24, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE2,     11, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE2_D,   22, 15, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE3,     11, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE4,     18, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE5,     23, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE6,     11, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE6_D,    0,  0, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE7,     21, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE7_D,    7, 20, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_ARCADE8,     23, 11, 10, 10);
+	addCursor(&crs, inv, PIC_CSR_LIFT,         6, 13, 10, 10);
+
+	getGameLoaderInputController()->setCursorMode(0);
 }
 
 void FullpipeEngine::initMap() {
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 68efacf..bb6d8ba 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -24,6 +24,7 @@
 
 #include "fullpipe/objects.h"
 #include "fullpipe/input.h"
+#include "fullpipe/gfx.h"
 
 namespace Fullpipe {
 
@@ -36,7 +37,7 @@ CInputController::CInputController() {
 	_field_14 = 0;
 	_cursorId = 0;
 	_cursorIndex = -1;
-	_flags = 1;
+	_inputFlags = 1;
 
 	_cursorBounds.left = 0;
 	_cursorBounds.top = 0;
@@ -55,4 +56,48 @@ void setInputDisabled(bool state) {
 	g_fullpipe->_inputController->setInputDisabled(state);
 }
 
+void CInputController::addCursor(CursorInfo *cursor) {
+	CursorInfo *newc = new CursorInfo(cursor);
+	Common::Point p;
+	
+	cursor->picture->getDimensions(&p);
+
+	newc->width = p.x;
+	newc->height = p.y;
+
+	newc->picture->_x = -1;
+	newc->picture->_y = -1;
+
+	_cursorsArray.push_back(newc);
+}
+
+void CInputController::setCursorMode(bool enabled) {
+	if (enabled)
+		_inputFlags |= 1;
+	else
+		_inputFlags &= ~1;
+}
+
+CursorInfo::CursorInfo() {
+	pictureId = 0;
+	picture = 0;
+	hotspotX = 0;
+	hotspotY = 0;
+	itemPictureOffsX = 0;
+	itemPictureOffsY = 0;
+	width = 0;
+	height = 0;
+}
+
+CursorInfo::CursorInfo(CursorInfo *src) {
+	pictureId = src->pictureId;
+	picture = src->picture;
+	hotspotX = src->hotspotX;
+	hotspotY = src->hotspotY;
+	itemPictureOffsX = src->itemPictureOffsX;
+	itemPictureOffsY = src->itemPictureOffsY;
+	width = src->width;
+	height = src->height;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
index a9106b7..72742b0 100644
--- a/engines/fullpipe/input.h
+++ b/engines/fullpipe/input.h
@@ -25,27 +25,44 @@
 
 namespace Fullpipe {
 
+class Picture;
+
 void setInputDisabled(bool state);
 
-class CInputControllerItemArray : public CObArray {
+struct CursorInfo {
+	int pictureId;
+	Picture *picture;
+	int hotspotX;
+	int hotspotY;
+	int itemPictureOffsX;
+	int itemPictureOffsY;
+	int width;
+	int height;
+
+	CursorInfo();
+	CursorInfo(CursorInfo *src);
 };
 
+typedef Common::Array<CursorInfo *> CursorsArray;
+
 class CInputController {
 	//CObject obj;
 	int _flag;
-	int _flags;
+	int _inputFlags;
 	int _cursorHandle;
 	int _hCursor;
 	int _field_14;
 	int _cursorId;
 	int _cursorIndex;
-	CInputControllerItemArray _cursorsArray;
+	CursorsArray _cursorsArray;
 	Common::Rect _cursorBounds;
 	int _cursorItemPicture;
 
  public:
 	CInputController();
 	void setInputDisabled(bool state);
+	void addCursor(CursorInfo *cursor);
+	void setCursorMode(bool mode);
 };
 
 } // End of namespace Fullpipe


Commit: d8cca2357e27b6794f1b7ebebbf17ac462ad1012
    https://github.com/scummvm/scummvm/commit/d8cca2357e27b6794f1b7ebebbf17ac462ad1012
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:07-07:00

Commit Message:
FULLPIPE: Moved debug code to loadAllScenes()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/init.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 32ccbda..ddbae7a 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -121,6 +121,10 @@ Common::Error FullpipeEngine::run() {
 
 	sceneSwitcher(&ent);
 
+#if 1
+	loadAllScenes();
+#endif
+
 	_currentScene->draw();
 
 	while (!g_fullpipe->_needQuit) {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index a0dba6a..ba4b317 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -135,6 +135,7 @@ public:
 	void initObjectStates();
 	void setLevelStates();
 	void setSwallowedEggsState();
+	void loadAllScenes();
 
 	void initCursors();
 	void addCursor(CursorInfo *cursorInfo, Scene *inv, int pictureId, int hotspotX, int hotspotY, int itemPictureOffsX, int itemPictureOffsY);
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index 9892f55..b1c9d6d 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -201,4 +201,59 @@ void FullpipeEngine::initMap() {
 	updateMapPiece(PIC_MAP_A13, 1u);
 }
 
+void FullpipeEngine::loadAllScenes() {
+	accessScene(301);
+	accessScene(302);
+	accessScene(303);
+	accessScene(304);
+	accessScene(305);
+	accessScene(321);
+	accessScene(635);
+	accessScene(649);
+	accessScene(650);
+	accessScene(651);
+	accessScene(652);
+	accessScene(653);
+	accessScene(654);
+	accessScene(655);
+	accessScene(726);
+	accessScene(858);
+	accessScene(903);
+	accessScene(1137);
+	accessScene(1138);
+	accessScene(1139);
+	accessScene(1140);
+	accessScene(1141);
+	accessScene(1142);
+	accessScene(1143);
+	accessScene(1144);
+	accessScene(1546);
+	accessScene(1547);
+	accessScene(1548);
+	accessScene(1549);
+	accessScene(1550);
+	accessScene(1551);
+	accessScene(1552);
+	accessScene(2062);
+	accessScene(2063);
+	accessScene(2064);
+	accessScene(2065);
+	accessScene(2066);
+	accessScene(2067);
+	accessScene(2068);
+	accessScene(2069);
+	accessScene(2070);
+	accessScene(2071);
+	accessScene(2072);
+	accessScene(2460);
+	accessScene(3896);
+	accessScene(3907);
+	accessScene(4620);
+	accessScene(4999);
+	accessScene(5000);
+	accessScene(5001);
+	accessScene(5166);
+	accessScene(5222);
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 6470b1c..859e6ea 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -48,61 +48,6 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
 		_inventory->addItem(ANI_INV_MAP, 1);
 
-#if 0
-		g_fullpipe->accessScene(301);
-		g_fullpipe->accessScene(302);
-		g_fullpipe->accessScene(303);
-		g_fullpipe->accessScene(304);
-		g_fullpipe->accessScene(305);
-		g_fullpipe->accessScene(321);
-		g_fullpipe->accessScene(635);
-		g_fullpipe->accessScene(649);
-		g_fullpipe->accessScene(650);
-		g_fullpipe->accessScene(651);
-		g_fullpipe->accessScene(652);
-		g_fullpipe->accessScene(653);
-		g_fullpipe->accessScene(654);
-		g_fullpipe->accessScene(655);
-		g_fullpipe->accessScene(726);
-		g_fullpipe->accessScene(858);
-		g_fullpipe->accessScene(903);
-		g_fullpipe->accessScene(1137);
-		g_fullpipe->accessScene(1138);
-		g_fullpipe->accessScene(1139);
-		g_fullpipe->accessScene(1140);
-		g_fullpipe->accessScene(1141);
-		g_fullpipe->accessScene(1142);
-		g_fullpipe->accessScene(1143);
-		g_fullpipe->accessScene(1144);
-		g_fullpipe->accessScene(1546);
-		g_fullpipe->accessScene(1547);
-		g_fullpipe->accessScene(1548);
-		g_fullpipe->accessScene(1549);
-		g_fullpipe->accessScene(1550);
-		g_fullpipe->accessScene(1551);
-		g_fullpipe->accessScene(1552);
-		g_fullpipe->accessScene(2062);
-		g_fullpipe->accessScene(2063);
-		g_fullpipe->accessScene(2064);
-		g_fullpipe->accessScene(2065);
-		g_fullpipe->accessScene(2066);
-		g_fullpipe->accessScene(2067);
-		g_fullpipe->accessScene(2068);
-		g_fullpipe->accessScene(2069);
-		g_fullpipe->accessScene(2070);
-		g_fullpipe->accessScene(2071);
-		g_fullpipe->accessScene(2072);
-		g_fullpipe->accessScene(2460);
-		g_fullpipe->accessScene(3896);
-		g_fullpipe->accessScene(3907);
-		g_fullpipe->accessScene(4620);
-		g_fullpipe->accessScene(4999);
-		g_fullpipe->accessScene(5000);
-		g_fullpipe->accessScene(5001);
-		g_fullpipe->accessScene(5166);
-		g_fullpipe->accessScene(5222);
-#endif
-
 		_inventory->rebuildItemRects();
 
 		for (CPtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) {


Commit: 795a926744d4b39604fe8710a402bdb0cda5f79c
    https://github.com/scummvm/scummvm/commit/795a926744d4b39604fe8710a402bdb0cda5f79c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:07-07:00

Commit Message:
FULLPIPE: Unstubbed loadGam() and CGameLoader()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index ddbae7a..efecffa 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -77,6 +77,11 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_updateScreenCallback = 0;
 	_updateCursorCallback = 0;
 
+	_msgX = 0;
+	_msgY = 0;
+	_msgObjectId2 = 0;
+	_msgId = 0;
+
 	_behaviorManager = 0;
 
 	_cursorId = 0;
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index ba4b317..760bd4e 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -50,6 +50,7 @@ class CInputController;
 class CInventory2;
 struct CursorInfo;
 class EntranceInfo;
+class ExCommand;
 class GameProject;
 class GlobalMessageQueueList;
 class MessageHandler;
@@ -59,6 +60,11 @@ class Scene;
 class SoundList;
 class StaticANIObject;
 
+int global_messageHandler1(ExCommand *cmd);
+int global_messageHandler2(ExCommand *cmd);
+int global_messageHandler3(ExCommand *cmd);
+int global_messageHandler4(ExCommand *cmd);
+
 class FullpipeEngine : public ::Engine {
 protected:
 
@@ -121,6 +127,11 @@ public:
 	GlobalMessageQueueList *_globalMessageQueueList;
 	MessageHandler *_messageHandlers;
 
+	int _msgX;
+	int _msgY;
+	int _msgObjectId2;
+	int _msgId;
+
 	BehaviorManager *_behaviorManager;
 
 	MovTable *_movTable;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 72b2827..61a4915 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -51,9 +51,9 @@ CGameLoader::CGameLoader() {
 	_gameProject = 0;
 	//_gameName = "untitled";
 
-	//addMessageHandler2(CGameLoader_messageHandler1, 0, 0);
-	//insertMessageHandler(CGameLoader_messageHandler2, 0, 128);
-	//insertMessageHandler(CGameLoader_messageHandler3, 0, 1);
+	addMessageHandlerByIndex(global_messageHandler2, 0, 0);
+	insertMessageHandler(global_messageHandler3, 0, 128);
+	insertMessageHandler(global_messageHandler4, 0, 1);
 
 	_field_FA = 0;
 	_field_F8 = 0;
@@ -65,13 +65,10 @@ CGameLoader::CGameLoader() {
 	_preloadId2 = 0;
 	_updateCounter = 0;
 
-	//g_x = 0;
-	//g_y = 0;
-	//dword_478480 = 0;
-	//g_objectId2 = 0;
-	//g_id = 0;
-
-	warning("STUB: CGameLoader::CGameLoader()");
+	g_fullpipe->_msgX = 0;
+	g_fullpipe->_msgY = 0;
+	g_fullpipe->_msgObjectId2 = 0;
+	g_fullpipe->_msgId = 0;
 }
 
 CGameLoader::~CGameLoader() {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 6e033a0..8a7d780 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -624,6 +624,30 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	return true;
 }
 
+int global_messageHandler1(ExCommand *cmd) {
+	warning("STUB: global_messageHandler1()");
+
+	return 0;
+}
+
+int global_messageHandler2(ExCommand *cmd) {
+	warning("STUB: global_messageHandler2()");
+
+	return 0;
+}
+
+int global_messageHandler3(ExCommand *cmd) {
+	warning("STUB: global_messageHandler3()");
+
+	return 0;
+}
+
+int global_messageHandler4(ExCommand *cmd) {
+	warning("STUB: global_messageHandler4()");
+
+	return 0;
+}
+
 int sceneIntro_updateCursor() {
 	g_fullpipe->_cursorId = 0;
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 859e6ea..d4c4948 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -38,55 +38,57 @@ namespace Fullpipe {
 bool FullpipeEngine::loadGam(const char *fname) {
 	_gameLoader = new CGameLoader();
 
-	if (_gameLoader->loadFile(fname)) {
-		g_fullpipe->_currSoundListCount = 0;
-		initObjectStates();
+	if (!_gameLoader->loadFile(fname))
+		return false;
 
-		//set_g_messageQueueCallback1(messageQueueCallback1);
-		//addMessageHandler2(global_messageHandler, 0, 4);
-		_inventory = getGameLoaderInventory();
-		_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
-		_inventory->addItem(ANI_INV_MAP, 1);
+	_currSoundListCount = 0;
+	initObjectStates();
+	// set_g_messageQueueCallback1(messageQueueCallback1);
 
-		_inventory->rebuildItemRects();
+	addMessageHandlerByIndex(global_messageHandler1, 0, 4);
 
-		for (CPtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) {
-			((MemoryObject *)((PictureObject *)*p)->_picture)->load();
-		}
+	_inventory = getGameLoaderInventory();
+	_inventory->setItemFlags(ANI_INV_MAP, 0x10003);
+	_inventory->addItem(ANI_INV_MAP, 1);
 
-		//_sceneSwitcher = sceneSwitcher;
-		//_preloadCallback = gameLoaderPreloadCallback
-		//_readSavegameCallback = gameLoaderReadSavegameCallback;
-		_aniMan = accessScene(SC_COMMON)->getAniMan();
-		_scene2 = 0;
+	_inventory->rebuildItemRects();
 
-		_movTable = _aniMan->countMovements();
+	for (CPtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) {
+		((MemoryObject *)((PictureObject *)*p)->_picture)->load();
+	}
 
-		_aniMan->setSpeed(1);
+	// _sceneSwitcher = sceneSwitcher;
+	// _preloadCallback = gameLoaderPreloadCallback
+	// _readSavegameCallback = gameLoaderReadSavegameCallback;
 
-		PictureObject *pic = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
+	_aniMan = accessScene(SC_COMMON)->getAniMan();
+	_scene2 = 0;
 
-		pic->setFlags(pic->_flags & 0xFFFB);
+	_movTable = _aniMan->countMovements();
 
-		// Not used in full game
-		//_evalVersionPic = accessScene(SC_COMMON)->getPictureObjectById(PIC_CMN_EVAL, 0);
+	_aniMan->setSpeed(1);
 
-		initMap();
-		initCursors();
+	PictureObject *pic = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
 
-		setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED"));
+	pic->setFlags(pic->_flags & 0xFFFB);
 
-		if (_flgPlayIntro) {
-			_gameLoader->loadScene(SC_INTRO1);
-			_gameLoader->gotoScene(SC_INTRO1, TrubaUp);
-		} else {
-			_gameLoader->loadScene(SC_1);
-			_gameLoader->gotoScene(SC_1, TrubaLeft);
-		}
+	// Not used in full game
+	//_evalVersionPic = accessScene(SC_COMMON)->getPictureObjectById(PIC_CMN_EVAL, 0);
+
+	initMap();
+	initCursors();
+
+	setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED"));
+
+	if (_flgPlayIntro) {
+		_gameLoader->loadScene(SC_INTRO1);
+		_gameLoader->gotoScene(SC_INTRO1, TrubaUp);
+	} else {
+		_gameLoader->loadScene(SC_1);
+		_gameLoader->gotoScene(SC_1, TrubaLeft);
+	}
 
-		if (!_currentScene)
-			return false;
-	} else
+	if (!_currentScene)
 		return false;
 
 	return true;


Commit: 8cceaae590792b8a96b295530288437b17b21437
    https://github.com/scummvm/scummvm/commit/8cceaae590792b8a96b295530288437b17b21437
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:08-07:00

Commit Message:
FULLPIPE: Implement StaticANIObject::draw()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index efecffa..27ccb29 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -126,7 +126,7 @@ Common::Error FullpipeEngine::run() {
 
 	sceneSwitcher(&ent);
 
-#if 1
+#if 0
 	loadAllScenes();
 #endif
 
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 2b007bd..88b8663 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -777,5 +777,18 @@ void Shadows::initMovement(Movement *mov) {
 	warning("STUB: Shadows::initMovement()");
 }
 
+DynamicPhase *Shadows::findSize(int width, int height) {
+	int idx = 0;
+	int min = 1000;
+
+	for (uint i = 0; i < _items.size(); i++) {
+		int w = abs(width - _items[i].width);
+		if (w < min) {
+			min = w;
+			idx = i;
+		}
+	}
+	return _items[idx].dynPhase;
+}
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 81de8ec..1dbdd28 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -30,10 +30,6 @@ namespace Fullpipe {
 class DynamicPhase;
 class Movement;
 
-class ShadowsItemArray : public CObArray {
-	// empty
-};
-
 struct Bitmap {
 	int _x;
 	int _y;
@@ -62,6 +58,7 @@ class Picture : public MemoryObject {
 	friend class DynamicPhase;
 	friend class PictureObject;
 	friend class CInputController;
+	friend class StaticANIObject;
 
 	Common::Rect _rect;
 	Bitmap *_convertedBitmap;
@@ -168,6 +165,14 @@ class Background : public CObject {
 	void addPictureObject(PictureObject *pct);
 };
 
+struct ShadowsItem {
+	int width;
+	int height;
+	DynamicPhase *dynPhase;
+};
+
+typedef Common::Array<ShadowsItem> ShadowsItemArray;
+
 class Shadows : public CObject {
 	int _sceneId;
 	int _staticAniObjectId;
@@ -180,12 +185,7 @@ class Shadows : public CObject {
 	void init();
 
 	void initMovement(Movement *mov);
-};
-
-struct ShadowsItem {
-	int width;
-	int height;
-	DynamicPhase *dynPhase;
+	DynamicPhase *findSize(int width, int height);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 1f6cb21..5347d76 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -122,6 +122,7 @@ Scene::Scene() {
 	_field_BC = 0;
 	_shadows = 0;
 	_soundList = 0;
+	_libHandle = 0;
 }
 
 bool Scene::load(MfcArchive &file) {
@@ -236,7 +237,8 @@ bool Scene::load(MfcArchive &file) {
 }
 
 void Scene::initStaticANIObjects() {
-	warning("STUB: Scene::initStaticANIObjects");
+	for (uint i = 0; i < _staticANIObjectList1.size(); i++)
+		((StaticANIObject *)_staticANIObjectList1[i])->initMovements();
 }
 
 void Scene::init() {
@@ -249,7 +251,7 @@ void Scene::init() {
 		((PictureObject *)_picObjList[i])->clearFlags();
 
 	for (uint i = 0; i < _staticANIObjectList1.size(); i++)
-		((PictureObject *)_staticANIObjectList1[i])->clearFlags();
+		((StaticANIObject *)_staticANIObjectList1[i])->clearFlags();
 
 	if (_staticANIObjectList2.size() != _staticANIObjectList1.size()) {
 		_staticANIObjectList2.clear();
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index d51d113..95528d2 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -30,6 +30,7 @@ namespace Fullpipe {
 class Scene : public Background {
 	friend class FullpipeEngine;
 	friend class SceneTag;
+	friend class StaticANIObject;
 
 	CPtrList _staticANIObjectList1;
 	CPtrList _staticANIObjectList2;
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index cca12ce..2fa53e2 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -219,7 +219,64 @@ Statics *StaticANIObject::addReverseStatics(Statics *st) {
 }
 
 void StaticANIObject::draw() {
-	warning("STUB: StaticANIObject::draw()");
+	if (_flags & 4 == 0)
+		return;
+
+	Common::Point point;
+	Common::Rect rect;
+
+	debug(0, "StaticANIObject::draw()");
+
+	if (_shadowsOn && g_fullpipe->_currentScene && g_fullpipe->_currentScene->_shadows
+		&& (getCurrDimensions(point)->x != 1 || getCurrDimensions(point)->y != 1)) {
+
+		DynamicPhase *dyn;
+
+		if (!_movement || _flags & 0x20 )
+			dyn = _statics;
+		else
+			dyn = _movement->_currDynamicPhase;
+
+		if (dyn->getDynFlags() & 4) {
+			rect = *dyn->_rect;
+
+			DynamicPhase *shd = g_fullpipe->_currentScene->_shadows->findSize(rect.width(), rect.height());
+			if (shd) {
+				shd->getDimensions(&point);
+				int midx = _ox - shd->_x / 2 - dyn->_someX;
+				int midy = _oy - shd->_y / 2 - dyn->_someY + rect.bottom - 3;
+				int shdy =  shd->_y;
+
+				int px;
+				if (!_movement || _flags & 0x20 )
+					px = _statics->getCenter(&point)->x;
+				else
+					px = _movement->getCenter(&point)->x;
+
+				if (_shadowsOn != 1)
+					midy = _shadowsOn - shdy / 2;
+
+				shd->draw(px + midx, midy, 0, 0);
+			}
+		}
+	}
+
+	int angle = 0;
+	if (_field_30 & 0xC000) {
+		if (_field_30 & 0x8000)
+			angle = -(_field_30 ^ 0x8000);
+		else
+			angle = _field_30 ^ 0x4000;
+	}
+
+	if (!_movement || _flags & 0x20) {
+		_statics->getSomeXY(point);
+		_statics->_x = _ox - point.x;
+		_statics->_y = _oy - point.y;
+		_statics->draw(_statics->_x, _statics->_y, 0, angle);
+	} else {
+		_movement->draw(0, angle);
+	}
 }
 
 void StaticANIObject::draw2() {
@@ -268,6 +325,33 @@ void StaticANIObject::setSpeed(int speed) {
 	warning("STUB: StaticANIObject::setSpeed(%d)", speed);
 }
 
+void StaticANIObject::initMovements() {
+	for (uint i = 0; i < _movements.size(); i++)
+		((Movement *)_movements[i])->removeFirstPhase();
+}
+
+Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
+	Picture *pic;
+
+	if (_movement)
+		pic = _movement->_currDynamicPhase;
+	else
+		pic = _statics;
+
+	if (pic) {
+		Common::Point point;
+
+		pic->getDimensions(&point);
+		p.x = point.x;
+		p.y = point.y;
+	} else {
+		p.x = 0;
+		p.y = 0;
+	}
+
+	return &p;
+}
+
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
@@ -317,6 +401,24 @@ Common::Point *Statics::getSomeXY(Common::Point &p) {
 	return &p;
 }
 
+Common::Point *Statics::getCenter(Common::Point *p) {
+	Common::Rect rect;
+
+	rect = *_rect;
+
+	if (_staticsId & 0x4000) {
+		Common::Point point;
+
+		getDimensions(&point);
+		rect.moveTo(point.x - _rect->right, _rect->top);
+	}
+
+	p->x = rect.left + _rect->width() / 2;
+	p->y = rect.top + _rect->height() / 2;
+
+	return p;
+}
+
 Movement::Movement() {
 	_lastFrameSpecialFlag = 0;
 	_flipFlag = 0;
@@ -335,7 +437,7 @@ Movement::Movement() {
 	_field_8C = 0;
 	_currDynamicPhaseIndex = 0;
 	_field_94 = 0;
-	_currMovementObj = 0;
+	_currMovement = 0;
 	_counter = 0;
 	_counterMax = 83;
 }
@@ -400,7 +502,7 @@ bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
 	} else {
 		int movid = file.readUint16LE();
 
-		_currMovementObj = ani->getMovementById(movid);
+		_currMovement = ani->getMovementById(movid);
 		_staticsObj1 = 0;
 		_staticsObj2 = 0;
 
@@ -433,6 +535,28 @@ Common::Point *Movement::getCurrDynamicPhaseXY(Common::Point &p) {
 	return &p;
 }
 
+Common::Point *Movement::getDimensionsOfPhase(Common::Point *p, int phaseIndex) {
+	int idx = phaseIndex;
+
+	if (idx == -1)
+		idx = _currDynamicPhaseIndex;
+
+	DynamicPhase *dyn;
+
+	if (_currMovement)
+		dyn = (DynamicPhase *)_currMovement->_dynamicPhases[idx];
+	else
+		dyn = (DynamicPhase *)_dynamicPhases[idx];
+
+	Common::Point point;
+
+	dyn->getDimensions(&point);
+
+	*p = point;
+
+	return p;
+}
+
 void Movement::initStatics(StaticANIObject *ani) {
 	warning("STUB: Movement::initStatics");
 }
@@ -448,7 +572,7 @@ void Movement::updateCurrDynamicPhase() {
 
 void Movement::loadPixelData() {
 	Movement *mov = this;
-	for (Movement *i = _currMovementObj; i; i = i->_currMovementObj)
+	for (Movement *i = _currMovement; i; i = i->_currMovement)
 		mov = i;
 
 	for (uint i = 0; i < _dynamicPhases.size(); i++) {
@@ -460,6 +584,49 @@ void Movement::loadPixelData() {
 		mov->_staticsObj1->getPixelData();
 }
 
+void Movement::removeFirstPhase() {
+	if (_updateFlag1) {
+		if (!_currDynamicPhaseIndex)
+			gotoNextFrame(0, 0);
+
+		if (!_currMovement) {
+			_dynamicPhases.remove_at(0);
+
+			for (uint i = 0; i < _dynamicPhases.size(); i++) {
+				_framePosOffsets[i - 1]->x = _framePosOffsets[i]->x;
+				_framePosOffsets[i - 1]->y = _framePosOffsets[i]->y;
+			}
+		}
+		_currDynamicPhaseIndex--;
+	}
+
+	updateCurrDynamicPhase();
+	_updateFlag1 = 0;
+}
+
+void Movement::gotoNextFrame(int callback1, int callback2) {
+	warning("STUB: Movement::gotoNextFrame()");
+}
+
+Common::Point *Movement::getCenter(Common::Point *p) {
+	Common::Rect rect;
+
+	rect = *_currDynamicPhase->_rect;
+
+	if (_currMovement) {
+		Common::Point point;
+
+		getDimensionsOfPhase(&point, _currDynamicPhaseIndex);
+
+		rect.moveTo(point.x - _currDynamicPhase->_rect->right, _currDynamicPhase->_rect->top);
+	}
+
+	p->x = rect.left + _currDynamicPhase->_rect->width() / 2;
+	p->y = rect.top + _currDynamicPhase->_rect->height() / 2;
+
+	return p;
+}
+
 DynamicPhase::DynamicPhase() {
 	_someX = 0;
 	_rect = 0;
@@ -508,10 +675,7 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
 		_someY = src->_someY;
 	}
 
-	_rect->top = src->_rect->top;
-	_rect->bottom = src->_rect->bottom;
-	_rect->left = src->_rect->left;
-	_rect->right = src->_rect->right;
+	*_rect = *src->_rect;
 
 	_width = src->_width;
 	_height = src->_height;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 8a0f36a..bfd7e70 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -64,6 +64,7 @@ class StaticPhase : public Picture {
 class DynamicPhase : public StaticPhase {
 	friend class Movement;
 	friend class Statics;
+	friend class StaticANIObject;
 
 	int _someX;
 	int _someY;
@@ -77,6 +78,8 @@ class DynamicPhase : public StaticPhase {
 	DynamicPhase(DynamicPhase *src, bool reverse);
 
 	virtual bool load(MfcArchive &file);
+
+	int getDynFlags() { return _dynFlags; }
 };
 
 class Statics : public DynamicPhase {
@@ -96,11 +99,14 @@ class Statics : public DynamicPhase {
 	Statics *getStaticsById(int itemId);
 
 	Common::Point *getSomeXY(Common::Point &p);
+	Common::Point *getCenter(Common::Point *p);
 };
 
 class StaticANIObject;
 
 class Movement : public GameObject {
+	friend class StaticANIObject;
+
 	int _field_24;
 	int _field_28;
 	int _lastFrameSpecialFlag;
@@ -118,7 +124,7 @@ class Movement : public GameObject {
 	CPtrList _dynamicPhases;
 	int _field_78;
 	Common::Point **_framePosOffsets;
-	Movement *_currMovementObj;
+	Movement *_currMovement;
 	int _field_84;
 	DynamicPhase *_currDynamicPhase;
 	int _field_8C;
@@ -131,10 +137,15 @@ class Movement : public GameObject {
 	bool load(MfcArchive &file, StaticANIObject *ani);
 
 	Common::Point *getCurrDynamicPhaseXY(Common::Point &p);
+	Common::Point *getCenter(Common::Point *p);
+	Common::Point *getDimensionsOfPhase(Common::Point *p, int phaseIndex);
 
 	void initStatics(StaticANIObject *ani);
 	void updateCurrDynamicPhase();
 
+	void removeFirstPhase();
+	void gotoNextFrame(int callback1, int callback2);
+
 	void loadPixelData();
 
 	void draw(bool flipFlag, int angle);
@@ -174,12 +185,14 @@ class StaticANIObject : public GameObject {
 	Statics *getStaticsById(int id);
 	Movement *getMovementById(int id);
 	Movement *getMovementByName(char *name);
+	Common::Point *getCurrDimensions(Common::Point &p);
 
 	void clearFlags();
 	bool isIdle();
 
 	void deleteFromGlobalMessageQueue();
 
+	void initMovements();
 	void loadMovementsPixelData();
 
 	Statics *addReverseStatics(Statics *ani);


Commit: 56cb6bbd4523dd92bf3a4ad6b896363da887b9cd
    https://github.com/scummvm/scummvm/commit/56cb6bbd4523dd92bf3a4ad6b896363da887b9cd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:08-07:00

Commit Message:
FULLPIPE: Implemented CGameLoader::gotoScene()

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 61a4915..1d53cd3 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -25,6 +25,7 @@
 #include "fullpipe/gameloader.h"
 #include "fullpipe/scene.h"
 #include "fullpipe/input.h"
+#include "fullpipe/statics.h"
 
 namespace Fullpipe {
 
@@ -153,7 +154,73 @@ bool CGameLoader::loadScene(int sceneId) {
 }
 
 bool CGameLoader::gotoScene(int sceneId, int entranceId) {
-	warning("STUB: CGameLoader::gotoScene(%d, %d)", sceneId, entranceId);
+	SceneTag *st;
+
+	int sc2idx = getSceneTagBySceneId(sceneId, &st);
+
+	if (sc2idx < 0)
+		return false;
+
+	if (!_sc2array[sc2idx]._isLoaded)
+		return 0;
+
+	if (_sc2array[sc2idx]._entranceDataCount < 1) {
+		g_fullpipe->_currentScene = st->_scene;
+		return true;
+	}
+
+	if (_sc2array[sc2idx]._entranceDataCount <= 0 )
+		return false;
+
+	int entranceIdx;
+	for (entranceIdx = 0; _sc2array[sc2idx]._entranceData[entranceIdx]->_field_4 != entranceId; entranceIdx++) {
+		if (entranceIdx >= _sc2array[sc2idx]._entranceDataCount)
+			return false;
+	}
+
+	CGameVar *sg = _gameVar->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME");
+
+	if (sg || (sg = _gameVar->getSubVarByName("OBJSTATES")->addSubVarAsInt("SAVEGAME", 0)) != 0)
+		sg->setSubVarAsInt("Entrance", entranceId);
+
+	if (!g_fullpipe->sceneSwitcher(_sc2array[sc2idx]._entranceData[entranceIdx]))
+		return 0;
+
+	g_fullpipe->_msgObjectId2 = 0;
+	g_fullpipe->_msgY = -1;
+	g_fullpipe->_msgX = -1;
+
+	g_fullpipe->_currentScene = st->_scene;
+
+	MessageQueue *mq1 = g_fullpipe->_currentScene->getMessageQueueById(_sc2array[sc2idx]._entranceData[entranceIdx]->_messageQueueId);
+	if (mq1) {
+		MessageQueue *mq = new MessageQueue(mq1, 0, 0);
+
+		StaticANIObject *stobj = g_fullpipe->_currentScene->getStaticANIObject1ById(_field_FA, -1);
+		if (stobj) {
+			stobj->setFlags(stobj->_flags & 0x100);
+
+			ExCommand *ex = new ExCommand(stobj->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+
+			ex->_field_14 = 256;
+			ex->_messageNum = 0;
+			ex->_excFlags |= 3;
+
+			mq->_exCommands.push_back(ex);
+		}
+
+		mq->setFlags(mq->getFlags() | 1);
+
+		if (!mq->chain(0)) {
+			delete mq;
+
+			return false;
+		}
+	} else {
+		StaticANIObject *stobj = g_fullpipe->_currentScene->getStaticANIObject1ById(_field_FA, -1);
+		if (stobj)
+			stobj->setFlags(stobj->_flags & 0xfeff);
+	}
 
 	return true;
 }
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 6b07a4e..69b29dc 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -42,6 +42,14 @@ ExCommand::ExCommand(ExCommand *src) : Message(src) {
 
 }
 
+ExCommand::ExCommand(int16 parentId, int messageKind, int messageNum, int x, int y, int a7, int a8, int sceneClickX, int sceneClickY, int a11) : 
+	Message(parentId, messageKind, x, y, a7, a8, sceneClickX, sceneClickY, a11) {
+	_field_3C = 1;
+	_messageNum = messageNum;
+	_excFlags = 0;
+	_parId = 0;
+}
+
 bool ExCommand::load(MfcArchive &file) {
 	debug(5, "ExCommand::load()");
 
@@ -103,6 +111,22 @@ Message::Message(Message *src) {
 	_field_34 = src->_field_34;
 }
 
+Message::Message(int16 parentId, int messageKind, int x, int y, int a6, int a7, int sceneClickX, int sceneClickY, int a10) {
+	_messageKind = messageKind;
+	_parentId = parentId;
+	_x = x;
+	_y = y;
+	_field_14 = a6;
+	_sceneClickX = sceneClickX;
+	_sceneClickY = sceneClickY;
+	_field_24 = a7;
+	_field_20 = a10;
+	_param28 = 0;
+	_field_2C = 0;
+	_field_30 = 0;
+	_field_34 = 0;
+}
+
 CObjstateCommand::CObjstateCommand() {
 	_value = 0;
 }
@@ -128,6 +152,32 @@ MessageQueue::MessageQueue() {
 	_flags = 0;
 }
 
+MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {
+	_counter = 0;
+	_field_38 = (field_38 == 0);
+
+	for (uint i = 0; i < src->_exCommands.size(); i++) {
+		ExCommand *ex = new ExCommand((ExCommand *)src->_exCommands[i]);
+		ex->_excFlags |= 2;
+
+		_exCommands.push_back(ex);
+	}
+	_field_14 = src->_field_14;
+
+	if (parId)
+		_parId = parId;
+	else
+		_parId = src->_parId;
+
+	_id = g_fullpipe->_globalMessageQueueList->compact();
+	_dataId = src->_dataId;
+	_flags = src->_flags;
+
+	g_fullpipe->_globalMessageQueueList->addMessageQueue(this);
+
+	_isFinished = 0;
+}
+
 bool MessageQueue::load(MfcArchive &file) {
 	debug(5, "MessageQueue::load()");
 
@@ -153,6 +203,13 @@ bool MessageQueue::load(MfcArchive &file) {
 	return true;
 }
 
+bool MessageQueue::chain(StaticANIObject *ani) {
+	warning("STUB: MessageQueue::chain()");
+
+	return true;
+}
+
+
 MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
 	for (CPtrList::iterator s = begin(); s != end(); ++s) {
 		if (((MessageQueue *)s)->_id == id)
@@ -179,6 +236,18 @@ void GlobalMessageQueueList::disableQueueById(int id) {
 	}
 }
 
+int GlobalMessageQueueList::compact() {
+	warning("STUB: GlobalMessageQueueList::compact()");
+
+	return 0;
+}
+
+void GlobalMessageQueueList::addMessageQueue(MessageQueue *msg) {
+	msg->setFlags(msg->getFlags() | 2);
+
+	push_back(msg);
+}
+
 bool removeMessageHandler(int16 id, int pos) {
 	if (g_fullpipe->_messageHandlers) {
 		MessageHandler *curItem = g_fullpipe->_messageHandlers;
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 97e4164..c8fe264 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -50,9 +50,13 @@ class Message : public CObject {
  public:
 	Message();
 	Message(Message *src);
+	Message(int16 parentId, int messageKind, int x, int y, int a6, int a7, int sceneClickX, int sceneClickY, int a10);
 };
 
 class ExCommand : public Message {
+	friend class CGameLoader;
+	friend class MessageQueue;
+
 	int _messageNum;
 	int _field_3C;
 	int _excFlags;
@@ -61,6 +65,7 @@ class ExCommand : public Message {
  public:
 	ExCommand();
 	ExCommand(ExCommand *src);
+	ExCommand(int16 parentId, int messageKind, int messageNum, int x, int y, int a7, int a8, int sceneClickX, int sceneClickY, int a11);
 	virtual ~ExCommand() {}
 
 	virtual bool load(MfcArchive &file);
@@ -78,6 +83,8 @@ class CObjstateCommand : public CObject {
 
 class MessageQueue : public CObject {
 	friend class GlobalMessageQueueList;
+	friend class CGameLoader;
+	friend class Scene;
 
   protected:
 	int _id;
@@ -95,9 +102,13 @@ class MessageQueue : public CObject {
 
  public:
 	MessageQueue();
+	MessageQueue(MessageQueue *src, int parId, int field_38);
 	virtual bool load(MfcArchive &file);
 
 	int getFlags() { return _flags; }
+	void setFlags(int flags) { _flags = flags; }
+
+	bool chain(StaticANIObject *ani);
 };
 
 class GlobalMessageQueueList : public CPtrList {
@@ -105,6 +116,9 @@ class GlobalMessageQueueList : public CPtrList {
 	MessageQueue *getMessageQueueById(int id);
 	void deleteQueueById(int id);
 	void disableQueueById(int id);
+	void addMessageQueue(MessageQueue *msg);
+
+	int compact();
 };
 
 struct MessageHandler {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 5347d76..9f4901d 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -332,6 +332,14 @@ PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 	return 0;
 }
 
+MessageQueue *Scene::getMessageQueueById(int messageId) {
+	for (uint i = 0; i < _messageQueueList.size(); i++)
+		if (((MessageQueue *)_messageQueueList[i])->_dataId == messageId)
+			return (MessageQueue *)_messageQueueList[i];
+
+	return 0;
+}
+
 void Scene::preloadMovements(CGameVar *var) {
 	CGameVar *preload = var->getSubVarByName("PRELOAD");
 	if (!preload)
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 95528d2..b3dbdcc 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -57,6 +57,7 @@ class Scene : public Background {
 	StaticANIObject *getAniMan();
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
 	StaticANIObject *getStaticANIObject1ByName(char *name, int a3);
+	MessageQueue *getMessageQueueById(int messageId);
 
 	void deleteStaticANIObject(StaticANIObject *obj);
 	void addStaticANIObject(StaticANIObject *obj, bool addList2);


Commit: f22f7a8682e159e61daa111928183db4e7f8d48b
    https://github.com/scummvm/scummvm/commit/f22f7a8682e159e61daa111928183db4e7f8d48b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:08-07:00

Commit Message:
FULLPIPE: Removed all garbage from constants list and added include guards

Changed paths:
    engines/fullpipe/gameobj.h



diff --git a/engines/fullpipe/gameobj.h b/engines/fullpipe/gameobj.h
index 54a3f85..7b24dd7 100644
--- a/engines/fullpipe/gameobj.h
+++ b/engines/fullpipe/gameobj.h
@@ -1,5095 +1,122 @@
-#define PIC_MAP_H09 5365
-#define PIC_SC19_RTRUBA31 5320
-#define PIC_SC7_LTRUBA 709
-#define PIC_SC5_RTRUBA1 664
-#define MV_MOM_JUMPFW 661
-#define PIC_SC8_RTRUBA 736
-#define PIC_CSR_LIFT 5176
-#define SC_FINAL4 2460
-#define SND_FIN_009 5081
-#define MV_FNHED_LOOK 5046
-#define ANI_FN3_HEAD 5042
-#define QU_SC32_TRYKUBIK 4981
-#define QU_BRD16_STARTBEARDED 4948
-#define MV_BRDCMN_TURN_RL 4946
-#define SND_CMN_064 4933
-#define PIC_CSR_ARCADE8 4911
-#define SND_22_034 4866
-#define PIC_INV_SWAB_C 4854
-#define PIC_INV_GLASSES_C 4839
-#define PIC_INV_BOARD_C 4824
-#define PIC_INV_COIN_H 4794
-#define PIC_INV_CARPET 1875
-#define MSG_RESTARTGAME 4767
-#define rMV_BRDCMN_FLYAWAY 4740
-#define SND_30_015 4710
-#define MV_EGTR_MD1_SHOW 4694
-#define MV_EGTR_SLIMSHOW 4693
-#define MV_CPT35_NORM 4593
-#define ST_BTN27_NORM 4581
-#define MV_SCK26_NORM 4554
-#define ANI_SOCK_26 4553
-#define SND_34_033 4493
-#define SND_34_022 4482
-#define SND_34_011 4471
-#define SND_33_012 4449
-#define SND_31_003 4381
-#define MV_VNT34_NORM 4308
-#define MV_MAN34_TURNVENT_R 2500
-#define MV_MAN32_PIPETOTUBE 4298
-#define MSG_SC28_ENDLIFT1 4259
-#define MV_MAN25_TRYHAND 4217
-#define MV_MAN_LOOKLADDER_RRV 4212
-#define SND_27_040 4141
-#define SND_25_020 4073
-#define SND_21_024 3978
-#define SND_21_013 3967
-#define SND_21_002 3951
-#define SND_13_032 3777
-#define SND_13_021 3766
-#define SND_12_011 3731
-#define SND_10_013 3679
-#define SND_10_002 3663
-#define SND_7_017 3597
-#define SND_7_006 3586
-#define SND_6_029 3568
-#define SND_6_018 3557
-#define SND_6_007 3544
-#define SND_CMN_031 3516
-#define QU_DRP25_TOFLOOR 3502
-#define MV_MAN25_TRYSPADE 3497
-#define QU_SC28_WORKINSIDE 3449
-#define MV_WMN28_IN_2 3445
-#define QU_MAN_DEF_SHOES1 3380
-#define MV_MAN_STARTSHOES_1 3373
-#define ST_BTH_1 3365
-#define MV_MAN_TURN_SRL 1081
-#define MSG_SC13_CLOSEFAST 1267
-#define MV_CDI_SHOWEYE 3309
-#define QU_GRL_LAUGH_POPA 3281
-#define QU_KZW14_TOEDGE 3272
-#define MSG_SC14_SHOWBALLGMAHIT2 3245
-#define QU_SC5_SND5 3244
-#define QU_SC4_SND4 3238
-#define QU_SC3_SND3 3232
-#define QU_SC2_SND1 3225
-#define SND_4_009 3124
-#define QU_STR_TURNL_L 3058
-#define QU_MID11_LOOK 3033
-#define ANI_CLOCK_8 2989
-#define QU_SC38_SHOWBOTTLE_ONTABLE 2838
-#define ST_LBN_6P 2769
-#define ST_LBN_4N 2762
-#define MV_LBN_2 2755
-#define MV_GRT9_FALL 2720
-#define MV_PTI25_NORM 2674
-#define PIC_SC33_TUMBA 2619
-#define PIC_SC33_LTRUBA 2618
-#define QU_SC35_SHOWHOSE 2519
-#define ST_CTS34_GROWN2 2474
-#define ST_CTS34_EMPTY 2383
-#define MV_DMN38_NORM4 2252
-#define ANI_PORTER 2082
-#define PIC_SC29_RTRUBA 2079
-#define QU_DRV_FROMRIGHT 2037
-#define QU_DRV_LOOKRIGHT2 2035
-#define QU_DRV_STOPDRIVE 2031
-#define ANI_BITA 2026
-#define MV_MID_SWAB2 2024
-#define QU_SC26_OPEN4 1941
-#define MV_MAN25_TOTRUBA 1884
-#define PIC_SC25_LADDERUP 1854
-#define ST_LUK23_CLOSED 1815
-#define QU_SC22_HANDLEDOWN 1804
-#define MV_MAN23_PUSH2 1725
-#define MV_GRFU_STARTKISS 1680
-#define QU_GRFU_STARTCHMOK 1669
-#define QU_GRFB_TAILUP 1644
-#define PIC_SCD_20 1622
-#define PIC_SC21_LADDER 1555
-#define MV_CDI_HIDEEMPTY 1541
-#define MV_MAN18_STANDKRESLO 1500
-#define MV_BOY18_JUMPFROM 1478
-#define QU_SMG_FILLBOTTLE 1433
-#define MSG_SC17_SHOWSUGAR 1416
-#define QU_SC17_SHOWSUGAR 1415
-#define ANI_INV_SUGAR 1410
-#define MSG_SC13_STARTWHIRLGIG 1388
-#define ST_GRL_EMPTY 1336
-#define MV_GRD2_LOOKRIGHT 1285
-#define MV_MAN15_TRIESOFF 1273
-#define QU_SC13_OPENBRIDGE 1213
-#define MV_MAN13_TAKEGUM 1208
-#define ST_MAN11_STARTJUMP 1130
-#define MSG_SC2_SHOWLADDER 1027
-#define MV_MAN6_PUSHBUTTON 1016
-#define MV_GLT_EAT 930
-#define ST_BLK_CLOSED 912
-#define MSG_SC8_GETHIMUP 789
-#define MV_BTT_CHESHET 752
-#define MV_BTT_LOOKMAN_SPOON 750
-#define MSG_STARTHAND 612
-#define ST_HND_EMPTY 603
-#define MV_CLK_CLOSE 594
-#define MSG_TESTKZWFLIGHT 570
-#define MSG_CLICKPLANK 549
-#define MSG_TESTPLANK 538
-#define MV_MAN_TURN_DL 492
-#define MV_MAN_TURN_UL 488
-#define MV_EGBR_SIGH 377
-#define MV_EGTR_FAT2SORROW 354
-#define MV_DYAS_CLOSEBOX 310
-#define MV_DYAS_FROMUS 313
-#define MV_EGTR_SLAPPIN 347
-#define MV_EGTR_SLAPPING 348
-#define MV_EGBR_RAISEHEAD 380
-#define MV_KZW_FROMHOLE 496
-#define QU_KZW_JUMPBOTTLE1 580
-#define MV_OTM_HANDLEUP 621
-#define QU_SC5_ENTER 637
-#define QU_SC6_TAKEBALL 681
-#define TrubaRight 696
-#define QU_BTT_LOOKMAN2 761
-#define MV_MAN8_HANDSUP 777
-#define MV_HGN_MORG 812
-#define ANI_INV_BOOT 881
-#define ANI_VISUNCHIK 904
-#define MV_NDV_LOOKBACK 951
-#define QU_GLT_BREATHE 960
-#define ANI_PACHKA 975
-#define PIC_INV_MENU 991
-#define MV_STR_NOSE 1182
-#define QU_STR_SHOW 1185
-#define QU_SC17_ENTER_UP 1326
-#define MV_JTI_FLOWIN 1394
-#define ANI_INV_BOTTLEFULL 1421
-#define QU_HND_TAKE2 1442
-#define MV_HND17_FIGA 1449
-#define PIC_SC19_RTRUBA1 1513
-#define PIC_SC16_LADDER 1523
-#define MSG_SC18_MANCLIMBEDDOWN 1540
-#define MV_GFA_SWING 1595
-#define QU_GFA_CHESHET 1608
-#define QU_GFA_STOPSOCK 1617
-#define MV_GRFU_TURN_LU 1646
-#define PIC_SC1_UTRUBA2 1696
-#define MV_CND_2_3 1708
-#define MSG_SC23_CLICKBTN3 1738
-#define MV_MAN21_COINTOBROOM 1773
-#define PIC_SC22_WALL 1797
-#define MSG_SC22_ONSTOOL 1798
-#define PIC_SC24_DTRUBA 1824
-#define PIC_SC24_UTRUBA 1829
-#define ANI_SHOOTER2 2111
-#define ST_DMN38_NORM 2202
-#define QU_DLD_DENY 2218
-#define QU_MLS_BLINK 2222
-#define MV_CTS_GROWMAN 2271
-#define MV_CTS_SHRINK 2272
-#define PIC_INV_PIPE 2321
-#define MV_LEG_POT2_OUT 2370
-#define MSG_SC32_SPIN 2405
-#define QU_SC35_ENTER_DOWN 2409
-#define MV_MAN32_POUR 2413
-#define MV_GMA20_STD_LOOK 2437
-#define QU_GMA20_STL_LOOK 2446
-#define QU_SC31_ENTER_RIGHT 2454
-#define MV_MAN34_PUTBOX 2483
-#define MV_BRD34_0_1 2510
-#define MV_PDV_NRM_BLINK 2525
-#define QU_PDV_CUT_BLINK 2528
-#define QU_SC37_ENTER_RIGHT 2565
-#define PIC_SCD_31 2566
-#define ANI_GUARD3 2577
-#define PIC_SC37_WALL2 2601
-#define ST_DMN01_default 2617
-#define ST_SCR36_NORM 2649
-#define MV_TSTG_FLOW 2663
-#define ANI_BOOTS_11 2704
-#define PIC_SC31_FLOOR 2712
-#define ST_TBE33_NORM 2717
-#define MV_DMN3_NORM 2733
-#define QU_SC32_EXITLIFT 2828
-#define MV_MOM_STANDUP 2891
-#define MV_MAN3_GIVEBLACK_2 2915
-#define MV_EGTR_1_2 343
-#define QU_CST_TRY 2875
-#define MV_BDP_SHOW 2953
-#define MV_CST_DENY_WHANDLE 2979
-#define QU_SWR_SITDOWN 3018
-#define SND_5_008 3149
-#define SND_5_019 3160
-#define SND_CMN_020 3167
-#define MV_DOMINO_18_default 3175
-#define ST_DOMINO_18_default 3176
-#define PIC_SC15_DFLOOR 3254
-#define ST_MAN_SHOES1_1 3458
-#define rMV_MAN_SNEEZE 3460
-#define QU_MAN_DEF_CLEAN 3462
-#define QU_MAN_DEF_SNEEZE_R 3465
-#define PIC_CMN_EVAL 3468
-#define MV_MAN25_ROWHAND 3482
-#define SND_8_005 3615
-#define SND_8_016 3626
-#define SND_9_004 3643
-#define SND_9_015 3659
-#define SND_11_001 3680
-#define SND_11_012 3696
-#define SND_11_023 3707
-#define SND_13_010 3755
-#define SND_20_003 3931
-#define SND_20_014 3947
-#define SND_22_001 3979
-#define SND_22_012 3995
-#define SND_23_011 4029
-#define SND_CMN_042 4035
-#define SND_24_010 4045
-#define QU_DRP24_TOWATER2 4046
-#define PIC_SC28_DARK3 4268
-#define MSG_SC28_TURNOFF_2 4277
-#define MV_CTS34_FALLEFT 4314
-#define SND_30_004 4362
-#define SND_32_002 4393
-#define SND_32_013 4409
-#define SND_32_024 4420
-#define SND_32_035 4431
-#define SND_33_001 4433
-#define SND_35_010 4508
-#define SND_35_021 4519
-#define MV_MAN34_TAKEBOX_FLOOR 4568
-#define ST_GRT38_NORM 4575
-#define PIC_MNU_SAVE_L 4630
-#define PIC_MSV_4_D 4654
-#define QU_SC28_LIFT5_START 4674
-#define PIC_SC30_EGG 4711
-#define ST_EYE_NORM 4715
-#define ST_LEG31_EMPTY 4726
-#define SND_CMN_053 4748
-#define MSG_HMRKICK_STUCCO 4765
-#define PIC_MNU_MUSICSLIDER_L 4915
-#define MV_FLY_FLY 4917
-#define QU_BRD28_GOR 4959
-#define PIC_SC12_WALL 4943
-#define ANI_FN2_HAND2 5031
-#define ST_FNHND2_NORM1 5033
-#define PIC_FN2_LEG 5035
-#define ST_FN4MAN_LAUGH 5100
-#define ANI_IN1GLASSES 5119
-#define SC_19 1143
-#define PIC_TTL_CREDITS 5172
-#define PIC_SC4_PLANK 5183
-#define MSG_DISABLESAVES 5201
-#define MSG_SC5_BGRSOUNDOFF 5315
-#define PIC_MAP_A10 5272
-#define PIC_MAP_P01 5277
-#define PIC_MAP_P12 5288
-#define ANI_BUTTON_32 5347
-#define MV_BTN32_TURNON 5348
-#define PIC_MEX_BGR 5300
-#define PIC_MAP_S20 5241
-#define PIC_MAP_S23_1 5244
-#define SND_26_020 5342
-#define MV_MAN11_JUMPFROMSWING 5209
-#define SND_30_016 5165
-#define MSG_INTR_GETUPMAN 5135
-#define MV_FNHED_EYES 5043
-#define ST_FNHND3_NORM1 5038
-#define QU_FIN1_TAKECOIN 5023
-#define SND_CMN_065 4934
-#define PIC_INV_VENT_C 4857
-#define PIC_INV_HAMMER_C 4841
-#define PIC_INV_EGGCOIN_C 4836
-#define PIC_INV_EGGBLACK_H 4798
-#define PIC_INV_BOOT_H 4788
-#define PIC_INV_COIN 861
-#define PIC_INV_BROOM 1783
-#define PIC_INV_BOX 866
-#define MV_MAN_LOOKUP 4773
-#define SND_13_033 4685
-#define ANI_CARPET_35 4592
-#define SND_35_022 4587
-#define SND_36_010 4534
-#define SND_34_023 4483
-#define SND_34_012 4472
-#define SND_34_001 4456
-#define SND_33_013 4450
-#define SND_31_004 4382
-#define SND_CMN_043 4319
-#define PIC_SC34_DTRUBA2 4311
-#define MV_TTA_STARTD 4287
-#define QU_SC28_LIFT6_START 4243
-#define ST_BAL14_GMA 4210
-#define SND_38_030 4197
-#define SND_27_041 4142
-#define SND_27_030 4131
-#define SND_25_021 4074
-#define SND_25_010 4063
-#define SND_23_001 4014
-#define SND_21_025 3972
-#define SND_21_014 3968
-#define SND_21_003 3952
-#define QU_SC19_SND1 3914
-#define SND_13_022 3767
-#define SND_12_012 3732
-#define SND_12_001 3716
-#define SND_10_003 3664
-#define SND_7_018 3598
-#define SND_7_007 3587
-#define SND_6_019 3558
-#define SND_6_008 3545
-#define SND_CMN_032 3517
-#define MSG_SC28_ENDCABIN 3456
-#define MV_WMN28_IN_3 3446
-#define MSG_SC25_STOPBEARDEDS 3424
-#define QU_SC17_FILLMUG_DROP 3415
-#define ST_BTH_2 3363
-#define MV_BTH_5_4 3358
-#define MSG_SC14_GMATOTRUBA 3249
-#define QU_SC4_SND5 3239
-#define QU_SC3_SND4 3233
-#define QU_SC2_SND2 3226
-#define QU_SC1_SND1 3220
-#define ST_GMA_SIT2 3212
-#define rMV_STR_THROWGLASSES 3202
-#define QU_SC38_SHOWBOTTLE_FULL 3173
-#define SND_CMN_010 3080
-#define QU_STR_TURNR 1186
-#define ST_HDL_LAID 3039
-#define MV_VSN_CYCLE2 2987
-#define MV_MAN8_STANDUP 2970
-#define QU_MOM_LOOKEMPTY 2948
-#define ST_LBN_5P 2766
-#define ST_LBN_3N 2759
-#define MV_LBN_3 2758
-#define ANI_GRIT_14 2724
-#define MV_NBL_DEFORM 1075
-#define MV_BDP_DROP 2686
-#define ANI_NEWBALL 1073
-#define ANI_KADKA 2670
-#define QU_SC32_FLOWG 2668
-#define MV_MAN34_TAKEBOX 2502
-#define ST_CTS34_GROWNEMPTY2 2475
-#define ST_LEG_UP1 2329
-#define PIC_SCD_32 2312
-#define ST_STR1_RIGHT 2143
-#define MV_SHR_NORM 2131
-#define ST_MAN29_RUN 2086
-#define QU_DRV_DRIVE 2030
-#define MV_MAN27_TAKEVENT 1993
-#define QU_SC26_OPEN5 1943
-#define ANI_VENT 1927
-#define QU_SC25_PUTBOARD 1896
-#define ST_LUK26_CLOSED 1870
-#define MV_WTR24_0_1 1842
-#define QU_SC22_FROMSTOOL 1800
-#define MSG_SC22_FROMSTOOL 1799
-#define PIC_SC21_WALL 1788
-#define MV_MAN23_PUSH3 1726
-#define PIC_SCD_21 1623
-#define PIC_SC19_LADDER 1538
-#define MV_CDI_HIDE 1533
-#define ST_MAN18_JUMP 1512
-#define MSG_SC18_SHOWMANJUMP 1510
-#define ST_GRL18_FLYTO 1490
-#define MV_JTI_FLOWBY 1393
-#define QU_SC16_BOYOUT 1364
-#define MSG_SC13_CHEW 1220
-#define PIC_SC8_RTRUBA_ITN 1014
-#define PIC_SCD_10 981
-#define ST_PLV_SIT 921
-#define MV_PBAR_RUN 897
-#define MV_BTT_MORG 743
-#define ANI_BATUTA 737
-#define PIC_SC3_UTRUBA 700
-#define PIC_SC4_MONETOPR 689
-#define MV_MAN_TAKEBALL 673
-#define QU_MOM_JUMPFW 670
-#define QU_SC6_ENTER 669
-#define MV_MANHDL_HANDLEUP 631
-#define MV_MAN_LOOKLADDERRV 556
-#define ANI_SPRING 542
-#define PIC_SC3_BOX 536
-#define QU_EGTR_SLIMOBLRV 528
-#define QU_DYAS_DEFAULT1 319
-#define MV_MAN_TURN_LD 490
-#define MV_MAN_TURN_LU 486
-#define ST_MAN_UP 449
-#define MV_EGBR_BRK_APPLE 385
-#define MV_DYAS_MORGOPEN 316
-#define MV_DYAS_MORGTOUS 315
-#define ST_DYAS_LIES 318
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_GAMEOBJ_H
+#define FULLPIPE_GAMEOBJ_H
+
+namespace Fullpipe {
+
+#define ANI_IN1MAN 5110
+#define ANI_INV_MAP 5321
 #define ANI_MAN 322
-#define MV_EGTR_SORROW2SLIM 341
-#define MV_OTM_BOX_TURNL 436
-#define MSG_SHOOTKOZAW 557
-#define ST_KZW_SIT 560
-#define QU_KZW_JUMPBOTTLE2 583
-#define PIC_SC4_MASK 585
-#define MSG_CLICKBUTTON 609
-#define MV_OTM_BOXHANDLEUP 627
-#define QU_BTT_LOOKMAN 760
-#define MV_CST_LOOKHOLE 713
-#define MV_MAN7_HANDLE2BOX 802
-#define MV_INV_OLDAPPLE_default 393
-#define ST_SLN_POT_HOBOTUP 843
-#define QU_SLN_POT_MORG2 850
-#define MV_NDV_LOOK 949
-#define QU_GLT_OPEN 961
-#define QU_SC5_MANBUMP 1167
-#define QU_SC13_ENTER_LEFT 1191
-#define ST_HDLL_DOWN 1212
-#define QU_TEST 1056
-#define QU_SC14_ENTER_LIFTUP 1066
-#define MV_MAN14_DECLINE 1239
-#define MV_HDLL_1_2 1309
-#define MV_GRL_PULL 1338
-#define MSG_SC16_FILLMUG 1363
-#define MSG_SC17_TESTTRUBA 1458
-#define PIC_SC19_RTRUBA2 1514
-#define MV_MAN17_GIVECOIN 1557
-#define MV_INV_EGGCOIN_default 1568
-#define MV_GFA_STOP 1601
-#define MV_GFA_STOPSOCK 1602
-#define QU_GFA_GREETSOCK 1607
-#define QU_GFA_BREATHE 1610
-#define PIC_SC22_LADDERD 1632
-#define MSG_SC23_CLICKBTN4 1739
-#define ANI_CHHI 1957
-#define MV_MAN25_ONBOARD 1885
-#define MV_HDL23_DEF 1979
-#define QU_GRFM_PODMYSHA 1987
-#define MV_ASS_SHOW 2123
-#define QU_ASS_SIT 2134
-#define MV_MAN29_TOPORTER 2085
-#define ST_GLV_HAMMER 2156
-#define MV_GLV_LOOKHMR 2168
-#define ANI_MUG38 2191
-#define MV_MUG38_NORM 2192
-#define QU_DLD_TAKE1 2214
-#define MV_FFT_TUBE_START 2230
-#define MV_GLV_PROPOSE 2278
-#define MV_DMN38_NORM5 2282
-#define MV_LEG_2_3 2345
-#define PIC_INV_POTTIE 2393
-#define MSG_SC34_CLIMB 2490
-#define MV_MAN34_BOARD_FLY 2505
-#define ST_BRD34_GRANDMA 2511
-#define MV_PDV_1_2 2521
-#define QU_LUK34_CLOSE 2547
-#define PIC_SC37_RTRUBA 2562
-#define MSG_SC35_SHRINK 2570
-#define MV_GRD3_LOOKR 2582
-#define MV_GRD37_LOOKR 2594
-#define PIC_SC37_WALL3 2602
-#define ANI_MUG_33 2623
-#define ST_INV_MUGFULL_default 2635
-#define ST_TST31_NORM 2654
-#define ANI_GRIT_6 677
-#define MV_MAN13_TAKEFIRECAN 2711
-#define MV_MUG17_NORM 2738
-#define QU_SC35_ENTER_LIFTUP 2817
-#define QU_SC34_ENTER_LIFTUP 2821
-#define QU_SC32_ENTER_LIFTDOWN 2830
-#define rMV_MAN_TOTRUBAHOR2 2840
-#define MV_MAN3_GIVEBLACK_3 2916
-#define MV_PL3_FLOW 2925
-#define QU_SC4_ENTER_DOWN 2937
-#define ST_BTN6_OFF 2993
-#define ST_GUM_NORM 977
-#define SND_5_009 3150
-#define SND_CMN_021 3168
-#define PIC_SC13_LWALL 3169
-#define MV_MAN13_TAKEHAMMER 3207
-#define ANI_ROPE_15 3255
-#define PIC_SC17_PIPE2 3293
-#define MV_MAN17_TAKEBOTTLEEMPTY 3308
-#define ANI_DOMINOS 3317
-#define MV_MAN_STARTSHOES_2 3385
-#define QU_MAN_DEF_SITDOWN_R 3390
-#define QU_MAN_DEF_SHOES2 3395
-#define MV_MAN_LOOKLADDER_R 3418
-#define ST_MAN_SHOES2_1 3459
-#define SND_8_006 3616
-#define SND_8_017 3627
-#define SND_9_005 3644
-#define SND_9_016 3660
-#define SND_11_002 3681
-#define SND_11_013 3697
-#define SND_11_024 3708
-#define SND_13_011 3756
-#define SND_14_010 3792
-#define SND_16_030 3850
-#define SND_20_004 3932
-#define SND_22_002 3980
-#define SND_22_013 3996
-#define SND_23_012 3948
-#define SND_24_011 4047
-#define MV_MAN17_TAKEBOOT 4224
-#define ST_MAN_SIT_NOBOOT 4229
-#define PIC_SC28_DARK4 4269
-#define MSG_SC28_TURNOFF_3 4275
-#define SND_30_005 4363
-#define SND_32_003 4394
-#define SND_32_014 4410
-#define SND_32_025 4421
-#define SND_32_036 4432
-#define SND_33_002 4434
-#define SND_35_011 4509
-#define SND_34_034 4614
-#define PIC_MNU_AUTHORS_L 4624
-#define PIC_MSV_5_D 4655
-#define MV_EYE30_HIDE 4718
-#define ANI_LEG_31 4723
-#define MV_BRD_STARTR 4733
-#define SND_CMN_054 4762
-#define SND_20_015 4888
+#define MV_MAN_TURN_LU 486
+#define PIC_CMN_EVAL 3468
+#define PIC_CSR_ARCADE1 4901
+#define PIC_CSR_ARCADE2 4902
+#define PIC_CSR_ARCADE2_D 4903
+#define PIC_CSR_ARCADE3 4904
+#define PIC_CSR_ARCADE4 4905
+#define PIC_CSR_ARCADE5 4906
+#define PIC_CSR_ARCADE6 4907
+#define PIC_CSR_ARCADE6_D 4908
+#define PIC_CSR_ARCADE7 4909
+#define PIC_CSR_ARCADE7_D 4910
+#define PIC_CSR_ARCADE8 4911
+#define PIC_CSR_DEFAULT 4891
+#define PIC_CSR_DEFAULT_INV 4892
+#define PIC_CSR_GOD 4900
 #define PIC_CSR_GOFAR_L 4895
-#define PIC_SCD_FIN 5026
-#define MV_FNHND2_MOVE 5032
-#define ST_FNHND2_NORM2 5034
-#define MV_FNHND6_MOVE2 5068
-#define ST_IN1MAN_LOOK 5118
-#define ST_IN1MAN_GONE 5125
-#define ST_IN2BOOT_EMPTY 5143
-#define MSG_SC32_TRUBATOBACK 5181
-#define PIC_MNU_SLIDER_D 4913
-#define MSG_SC33_TESTMUG 5185
-#define MSG_MANSHADOWSOFF 5196
-#define SND_22_035 5211
-#define PIC_SC5_RTRUBA2 665
-#define PIC_MAP_A11 5273
-#define PIC_MAP_P02 5278
-#define PIC_MAP_P13 5289
-#define PIC_INV_MAP 5324
-#define MSG_SC28_LIFT6MUSIC 5355
-#define MSG_FN4_STARTMUSIC 5356
-#define PIC_MSV_BGR 4634
-#define PIC_MAP_S10 5232
-#define PIC_MAP_S21 5242
-#define PIC_MAP_S23_2 5245
-#define PIC_SC3_LADDER 1102
-#define PIC_SC19_REACTOR 1498
-#define SND_INTR_010 5155
-#define QU_INTR_STARTINTRO 5133
-#define ST_IN1CLK_CLOSED 5128
-#define MSG_SC31_TESTCACTUS 5095
-#define QU_FN3_SHOWKICKING 5074
-#define QU_FN2_DOFINAL 5066
-#define ANI_FN3_HAND3 5036
-#define ST_MANFIN1_RIGHT 5021
-#define MSG_SC16_LAUGHSOUND 4993
-#define rMV_BBL_GOR 4926
-#define MV_BBL_GOR 4924
-#define PIC_INV_SCISSORS_C 4850
-#define PIC_INV_EGGBOOT_C 4835
-#define PIC_INV_POT_H 4813
-#define PIC_INV_BOOT 863
-#define MV_DRP25_TOWATER 3503
-#define SND_13_034 4686
-#define MV_PDV_LEGS 4589
-#define SND_35_023 4588
-#define SND_36_011 4535
-#define SND_34_024 4484
-#define SND_34_013 4473
-#define SND_34_002 4457
-#define SND_33_014 4451
-#define SND_31_005 4383
-#define SND_CMN_044 4320
-#define MV_MAN34_TRYTABUR 2489
-#define QU_KDK_DRIZZLE 4301
-#define ST_MAN28_SIT 4253
-#define SND_38_031 4198
-#define SND_38_020 4187
-#define SND_27_031 4132
-#define SND_27_020 4121
-#define SND_25_022 4075
-#define SND_25_011 4064
-#define SND_23_002 4015
-#define SND_21_026 3974
-#define SND_21_015 3969
-#define SND_21_004 3953
-#define QU_SC19_SND2 3915
-#define QU_SC18_SND1 3901
-#define SND_15_010 3812
-#define SND_13_023 3768
-#define SND_12_013 3733
-#define SND_12_002 3717
-#define SND_10_004 3665
-#define SND_7_019 3599
-#define SND_7_008 3588
-#define SND_CMN_033 3554
-#define SND_6_009 3546
-#define PIC_CMN_EXIT 3467
-#define MV_WMN28_IN_4 3447
-#define ANI_WOMAN_28 3439
-#define QU_SC25_BEARDED2 3426
-#define MV_MAN_SMILE 3416
-#define SND_CMN_022 3404
-#define QU_SC27_SHOWBET 3368
-#define ST_BTH_3 3361
-#define ST_VNT27_LIES 3355
-#define MV_MAN16_TRYBOTTLE 3305
-#define QU_SC19_ENTER_DOWNRIGHT 3300
-#define MV_KZW14_TOEDGE 3265
-#define QU_SC3_SND5 3234
-#define QU_SC2_SND3 3227
-#define QU_SC1_SND2 3221
-#define ST_BAL14_NORM2 3215
-#define MV_BAL14_TOGMA 3214
-#define SND_CMN_011 3081
-#define QU_SC13_CLOSEFAIL 3063
-#define rMV_STR_HIDE 3055
-#define QU_STR_RTOL 3053
-#define ANI_MAID_11 3024
-#define MSG_SC11_PUTBOOT 1117
-#define MSG_SC4_DROPBOTTLE 2896
-#define QU_SC15_ENTER_LIFTUP 2813
-#define QU_SC10_EXITLIFT 2809
-#define ST_LBN_4P 2763
-#define MV_LBN_4 2761
-#define ST_LBN_2N 2756
-#define PIC_SCD_33 2636
-#define MV_BRD34_1_2 2573
-#define MV_MAN34_BOARD_FLY2 2572
-#define QU_SC34_FROMBOX 2494
-#define MV_CTS34_0_1 2387
-#define ANI_CACTUS_34 2381
-#define ST_LEG_EMPTY 2338
-#define ST_LEG_UP2 2333
-#define PIC_SC32_UTRUBA 2293
-#define MV_MAN38_TAKEHAMMER 2289
-#define MV_DMN38_NORM6 2284
-#define MV_MAN29_PUSHASS 2145
-#define ST_STR2_RIGHT 2144
-#define QU_SC29_ENTER_LEFT 2078
-#define QU_MID_SWITCHBACK 2044
-#define QU_DRV_FROMLEFT2 2038
-#define ST_INV_VENT_default 1970
-#define MV_MAN25_BACKTOLADDER 1954
-#define QU_SC25_ENTERUP_WATER 1895
-#define MV_MAN25_PUTBOARD 1878
-#define ST_LUK26_NOHANDLE 1869
-#define QU_SC25_ENTER_UP 1860
-#define MV_HDL22_FALL 1760
-#define MV_MAN23_PUSH4 1727
-#define QU_GRFU_CHMOKLEFT 1667
-#define MV_GRFB_TAILUP 1640
-#define MV_GRFB_TRYSTAND 1634
-#define ANI_GIRAFFE_BOTTOM 1633
-#define PIC_SCD_22 1624
-#define QU_GRD_LOOKLEFT 1001
-#define ST_GRD_SIT2 1525
-#define ST_INV_SUGAR_default 1412
-#define MV_INV_SUGAR_default 1411
-#define ANI_SAMOGONSHCHIK 1397
-#define QU_SC16_GIRLOUT 1365
-#define MSG_SC16_HIDEMUG 1351
-#define MSG_SC16_SHOWWIRE 1350
-#define ST_BOY_STAND 1331
-#define QU_GMS_DRYG_BOOTLESS 1276
-#define ST_BAL14_MAIN 1248
-#define ST_HDLR_UP 1198
-#define ST_SWR_SITBALD 1153
-#define ANI_SC2_BOX 1020
-#define MV_MAN12_POT2BOOT 983
-#define ST_GLT_OPEN 928
-#define MV_GLT_BREATHE 925
-#define QU_SLN_POT_TURN 851
-#define MSG_SC7_CLOSELUKE 822
-#define ST_BTT_NOSPOON 739
-#define ST_CST_HEADUP 717
-#define TrubaUp 680
-#define PIC_SC6_UTRUBA 668
-#define MV_CLK_HAND 592
-#define ST_MAN_LOOKPLANK 555
-#define QU_DYAS_DEFAULT2 471
-#define ST_MAN_GOD 480
-#define ST_MAN_GOU 459
-#define MV_OTM_GLS_TURNR 422
-#define MV_EGBR_BRK_COIN 389
-#define MV_EGTR_SORROW2FAT 356
-#define MV_OTM_BOX_MORGRIGHT 439
-#define MV_KZW_TOPLANK 497
-#define QU_KZW_WALKBOTTLE 578
-#define PIC_SC4_ULTRUBA 615
-#define ST_HDL_DOWN 625
-#define MV_MANOTM_BOX2GLASSES 628
-#define QU_OTM_VNT_TRIESOFF 648
-#define MV_BRD_DROPBALLROT 695
-#define MV_LUK_0_1 804
-#define ST_LUK_CLOSED 805
-#define MV_CST_CLOSELUKE 807
-#define MV_INV_BOOT_default 882
-#define PIC_SC2_DFLOOR 891
-#define QU_GRD_MORG 1004
-#define MV_MAN6_SPINHANDLE 1008
-#define ANI_SC4_COIN 690
-#define MV_MAN_TAKECOIN 1031
-#define MV_SLN_0_1 834
-#define LiftUp 1057
-#define PIC_SCD_11 1098
-#define MV_MAN11_SWING_0 1109
-#define ST_MAN_SIT 1164
-#define MV_STR_CHEW 1177
-#define PIC_SC15_LTRUBA 1261
-#define PIC_SC16_RTRUBA 1293
-#define MV_HDL_1_2 1308
-#define MV_INV_MUG_default 1371
-#define QU_SMG_STOPFINGERS 1408
-#define QU_SC17_FILLBOTTLE 1437
-#define QU_HND_TAKEBOTTLE 1443
-#define ST_HND17_EMPTY 1448
-#define QU_SC18_ENTER_WHIRLIGIG 1469
-#define PIC_SC19_RTRUBA3 1515
-#define QU_CDI_DRYG 1536
-#define MSG_SC3_TESTFAT 1582
-#define QU_GFA_GREET 1606
-#define QU_SC22_ENTER_LEFT 1618
-#define QU_SC23_ENTER_DOWN 1630
-#define ST_CND_0 1704
-#define MV_CND_3_4 1710
-#define MV_INV_BROOM_default 1775
-#define ST_INV_BROOM_default 1776
-#define QU_SC22_FALLBROOM 1786
-#define PIC_SC24_PIPE 1828
-#define MV_MAN_FROMTRUBAVER2_R 1849
-#define ANI_BOARD25 1898
-#define QU_SC25_TRUBATOBOARD 1909
-#define PIC_INV_LOPAT 1924
-#define ST_CHI_EMPTY 1959
-#define MV_MAN27_BROOMTOSWAB 1992
-#define ST_BTA_HILITE 2052
-#define QU_SC29_MANTO_R 2100
-#define MV_SHR_HITASS 2152
-#define ANI_DYLDA 2169
-#define ST_MLS_LEFT 2179
-#define MV_MLS_TURNLR 2181
-#define MV_MAN38_TAKEBOTTLE 2184
-#define QU_SC38_SHOWMUG 2198
-#define QU_GLV_TOSMALL_NOHMR 2209
-#define QU_GLV_DRINK 2210
-#define QU_DLD_TAKE2 2215
-#define QU_MLS_TURNL 2220
-#define ST_FFT_TUBE 2231
-#define ST_FFT_TUBEOPEN 2236
-#define MV_CTS_GROW 2268
-#define QU_FFT_PIPE_CYCLE 2297
-#define QU_FFT_TUBE_FLOW 2304
-#define PIC_SC35_FLOOR 2407
-#define ST_HZE_NORM 2426
-#define MV_CTS34_EYES 2478
-#define MV_BRD34_RIGHT 2507
-#define MSG_SC35_PLUGHOSE 2524
-#define ST_LUK34_CLOSED 2543
-#define MV_PDV_SML_BLINK 2551
-#define PIC_SC35_DTRUBA_L 2558
-#define QU_GRD3_LOOKR 2587
-#define PIC_SC31_WALL 2603
-#define ANI_TESTO_BLUE 2659
-#define MV_MAN6_TAKEBALL 2691
-#define ST_GRT6_GRIT 2693
-#define MV_JET17_FLOW 2747
-#define MSG_SC4_MANFROMBOTTLE 2854
-#define QU_EGTR_MD1_BOLTLEGS 2877
-#define MV_MAN_PLANKTOLADDER 553
-#define MV_MAN3_GIVEBLACK_4 2917
-#define MV_EGTR_2_3 351
-#define ST_STP8_3 2980
-#define ST_BALL9_NORM 2973
-#define ST_PCH2_NORM 3021
-#define MV_SLN_POT_DENY 3040
-#define MV_MAN38_TRYTAKEBOTTLE 3178
-#define MV_HDLL_1_3 3204
-#define rMV_MAN_STARTSHOES_1 3382
-#define rMV_MAN_STOPSHOES_1 3384
-#define MV_MAN17_GIVEBOOT 3432
-#define ST_GRFU_KISSOPEN 3475
-#define MV_GRFU_CLOSEEYES 3476
-#define ST_DRP26_NORM2 3483
-#define SND_8_007 3617
-#define SND_8_018 3628
-#define SND_9_006 3650
-#define SND_9_017 3661
-#define SND_11_003 3682
-#define SND_11_014 3698
-#define SND_11_025 3709
-#define SND_13_012 3757
-#define SND_14_011 3793
-#define SND_16_020 3840
-#define SND_16_031 3851
-#define SND_17_030 3894
-#define SND_20_005 3933
-#define SND_22_003 3981
-#define SND_22_014 3997
-#define SND_22_025 4008
-#define SND_23_013 3949
-#define SND_24_001 4003
-#define SND_24_012 4048
-#define SND_26_010 4091
-#define MV_BOT17_FILL 4221
-#define ST_BOT17_NORM 4222
-#define ST_MAN25_ROW2 4235
-#define ST_MAN_TEMPPP 4236
-#define PIC_SC28_DARK5 4270
-#define MSG_SC28_TURNOFF_4 4282
-#define QU_SC29_SND1 4335
-#define SND_30_006 4369
-#define MV_MAN30_ITCHSWAB 4373
-#define SND_32_004 4395
-#define SND_32_015 4411
-#define SND_32_026 4422
-#define SND_33_003 4435
-#define SND_35_001 4494
-#define SND_35_012 4510
-#define ANI_CARPET_36 4600
-#define SND_34_035 4615
-#define PIC_MLD_OK_L 4647
-#define PIC_MSV_6_D 4656
-#define SND_32_037 3560
-#define QU_EYE30_HIDE 4722
-#define SND_CMN_055 4763
-#define SND_CMN_066 4966
-#define PIC_FN2_BODY 5027
-#define ST_FNHND6_BEFORE2 5069
-#define MSG_ENABLESAVES 5202
-#define PIC_SC23_BOXOPEN 1723
-#define SND_22_036 5304
-#define PIC_MAP_A01 5263
-#define PIC_MAP_A12 5274
-#define PIC_MAP_P03 5279
-#define PIC_MAP_P14 5290
-#define MV_MAN35_CUTPIPE 2514
-#define PIC_MAP_S11 5233
-#define PIC_MAP_S22 5243
-#define PIC_MAP_S33 5257
-#define MV_MOM_TAKE1 2885
-#define ST_MAP_NORM 5323
-#define ANI_INV_MAP 5321
-#define PIC_MEX_OK 5301
-#define PIC_SC6_LADDER 1104
-#define MV_MOM_CYCLEBK 3012
-#define QU_SC16_MANDRINK 5200
-#define ST_PBAR_START2 5178
-#define MV_MAN30_ITCHSPADE 5164
-#define SND_INTR_011 5156
-#define ANI_IN1CLOCK 5126
-#define ANI_IN1HAND 5113
-#define ST_FNHND6_BEFORE3 5057
-#define ANI_FN3_HAND4 5048
-#define ANI_FIN1_MAN 5019
-#define ANI_FIN_COIN 5014
-#define SND_29_030 4879
-#define SND_13_035 4871
-#define SND_21_027 4867
-#define PIC_INV_EGGDOM_C 4837
-#define PIC_INV_APPLE_C 4823
-#define PIC_INV_STOOL_H 4817
-#define PIC_INV_EGGGLS_H 4801
-#define PIC_INV_EGGAPL_H 4797
-#define PIC_INV_EGG_H 4796
-#define rMV_MAN_LOOKUP 4775
-#define SND_CMN_056 4772
-#define MV_MAN_LOOKSTUCCO 4771
-#define SND_15_011 4754
-#define MV_BRD_FALL 4731
-#define SND_36_012 4606
-#define QU_PDV_LRG_LEGS 4591
-#define SND_35_024 4590
-#define QU_SC34_FROMBOX_FLOOR 4572
-#define SND_36_001 4520
-#define SND_34_025 4485
-#define SND_34_014 4474
-#define SND_34_003 4458
-#define MV_MAN33_TAKEMUGEMPTY 4452
-#define SND_28_020 4329
-#define SND_CMN_045 4321
-#define MV_LEG_POT0_DENY 4283
-#define QU_SC28_LIFT1_WORK 4256
-#define MSG_SC21_UPDATEASS 4211
-#define SND_9_018 4200
-#define SND_38_032 4199
-#define SND_38_021 4188
-#define SND_38_010 4175
-#define SND_27_032 4133
-#define SND_27_021 4122
-#define SND_27_010 4111
-#define SND_25_023 4076
-#define SND_25_012 4065
-#define SND_25_001 4049
-#define SND_23_003 4016
-#define SND_21_016 3970
-#define SND_21_005 3954
-#define QU_SC19_SND3 3916
-#define QU_SC18_SND2 3902
-#define PIC_SC38_ROPE 3859
-#define SND_13_024 3769
-#define SND_13_013 3758
-#define SND_12_014 3734
-#define SND_12_003 3718
-#define SND_10_005 3666
-#define SND_7_009 3589
-#define SND_CMN_034 3555
-#define QU_SC25_TRYROWHAND 3493
-#define MV_WMN28_IN_5 3448
-#define QU_SC25_BEARDED3 3427
-#define SND_CMN_023 3405
-#define MV_MAN_SHOES1 3375
-#define MSG_SC27_SHOWNEXTBET 3369
-#define ST_BTH_4 3359
-#define MV_KZW14_TOUS 3267
-#define QU_SC2_SND4 3228
-#define QU_SC1_SND3 3222
-#define ST_BAL14_NORM3 3216
-#define QU_GLV_TAKEDOMINO_NOHMR 3182
-#define SND_CMN_012 3082
-#define SND_CMN_001 2927
-#define MV_MAN8_JUMPOFF 2969
-#define ANI_PLUSMINUS 2938
-#define PIC_SC1_OSK2 2932
-#define MV_KZW_JUMPHIT 2857
-#define MV_MAN4_FROMBOTTLE 2849
-#define MV_LBN_5 2764
-#define ST_LBN_3P 2760
-#define ST_LBN_1N 2753
-#define MV_MAN2_TRYBOX 2736
-#define ST_GRT14_NORM 2726
-#define ST_MAN6_BALL 2688
-#define QU_SC35_SHOWSTOPPER 2520
-#define QU_SC32_SHOWHANDLE 2399
-#define MV_FLG_STARTL 2258
-#define MV_FLG_CYCLER 2266
-#define MV_LEG_POT2_SHOW 2332
-#define MSG_SC38_PROPOSE 2287
-#define ST_SHG_NORM 2118
-#define ST_MAN29_SIT 2089
-#define ST_DRV_LEFTNOVENT 2000
-#define QU_SC25_TRYSWAB 1913
-#define ANI_INV_BOARD 1872
-#define ANI_LUK26 1867
-#define LadderDown 1851
-#define PIC_SC22_DTRUBA2 1810
-#define MV_MAN22_STANDTABUR 1750
-#define ANI_INV_SOCK 1698
-#define QU_GRFG_SHOW 1683
-#define PIC_SCD_23 1625
-#define ST_CDI_SUGAR 1532
-#define MV_MAN19_TAKESUGAR 1528
-#define MV_MAN18_JUMPTOTRUBA 1511
-#define MV_BOY18_JUMPTO 1481
-#define ST_SMG_HANDSUP 1403
-#define QU_MOM_START 1389
-#define MV_WHR13_SPIN 1384
-#define MSG_SC14_SHOWBALLMAN 1254
-#define ANI_INV_GUM2 1204
-#define ST_GLT_EMPTY 1070
-#define MV_MAN_LIFTFROMU 1061
-#define MV_MAN_LIFTFROMD 1060
-#define ANI_HDL6 1009
-#define MV_MAN_FROMVTRUBA 966
-#define ST_BALL9_default 935
-#define ST_SLN_POT 835
-#define QU_SC8_FINISH 788
-#define PIC_SC8_LADDER_D 755
-#define MV_CST_SPINHANDLE 714
-#define ANI_INV_BOX 890
-#define PIC_SC4_DOWNTRUBA 619
-#define MV_BTN_CLICK 599
-#define ST_CLK_OPEN 591
-#define MV_CLK_GO 589
-#define MSG_SHAKEBOTTLE 584
-#define ST_SPR_DOWN 545
-#define MV_PNK_WEIGHTLEFT 541
-#define QU_KOZAW_WALK 505
-#define QU_DYAS_DEFAULT3 514
-#define QU_SC1_EGBRHEADDOWN 513
-#define rMV_EGBR_SIGH 464
-#define MV_EGBR_BRK_BOOT 384
-#define MV_EGTR_TAKEMONEY 352
-#define MV_EGTR_FATBOLTLEGS 374
-#define MV_MANDYAS_GIVESGLAS 363
-#define MV_MANEGBR_EGG2APPLE 444
-#define MV_MAN_TURN_RL 332
-#define QU_KZW_GOOUT 567
-#define QU_OTM_GLS_TURNL 641
-#define QU_OTM_BOX_MORGR 643
-#define MV_MAN_TAKESBALL 674
-#define QU_SC1_ENTER_RIGHT 702
-#define QU_CST_TURNDOWN 724
-#define ANI_VMYATS 764
-#define MV_MAN8_DRYGDOWN 770
-#define MV_MAN8_STARTJUMP 779
-#define ST_HGN_LUKE 810
-#define PIC_SCD_12 857
-#define PIC_SC9_DTRUBA 902
-#define MV_VSN_TURNLEFT 953
-#define MV_GRD_MORG1 1000
-#define MV_MAN_TAKEBOOT 1034
-#define ANI_SC4_BOOT 1035
-#define MV_LFT_OPEN 1048
-#define MV_MAN_TURN_SDR 1085
-#define MV_MAN_TURN_SUR 1088
-#define MV_MAN11_SWING_1 1111
-#define MSG_SC13_UPDATEBRIDGE 1217
-#define QU_SC14_ENTER_LIFTDOWN 1068
-#define MSG_SC14_MANKICKBALL 1257
-#define MV_GMS_DRYGNOBOOT 1268
-#define PIC_SC18_LTRUBA 1320
-#define QU_SC16_GOBOY 1347
-#define QU_SC16_GOGIRL 1348
-#define QU_SC16_BOYDRINK 1353
-#define QU_SC16_BOYKICK 1367
-#define ST_GRL_LAUGH 1342
-#define MV_BDG_CLOSE 1382
-#define MV_MAN17_TAKEBOTTLE 1427
-#define QU_HND17_TOCYCLE 1454
-#define QU_CDI_SHOW 1535
-#define PIC_INV_EGGDOM 1576
-#define MV_GFA_0_1 1605
-#define MV_GRFU_BLINKLEFT 1651
-#define MV_GRFU_STOP 1655
-#define ST_CND_1 1705
-#define QU_SC23_TOCALENDAR 1733
-#define QU_SC25_SHOWBOARD_L 1907
-#define MSG_SC26_UPDATEPOOL 1956
-#define MV_PTR_MOVEFAST 2102
-#define ST_STR1_EMPTY 2115
-#define QU_ASS_SIT_R 2136
-#define MV_SHG_HITASS 2151
-#define MV_GLV_PUTDOMIN 2157
-#define ST_GLV_NOHAMMER 2159
-#define MV_HMR38_NORM 2195
-#define MV_FFT_TUBE_FLOWOPEN 2237
-#define MV_FFT_STARTPIPE 2239
-#define MSG_SC38_POSTHMRKICK 2256
-#define QU_GLV_PROPOSE_NOHMR 2281
-#define ANI_INV_TUBE 2314
-#define MV_RHT_BLINK 2361
-#define PIC_SCD_34 2389
-#define MV_POTTIE_default 2391
-#define MV_HDL32_FALL 2395
-#define MSG_SC32_STARTCACTUS 2414
-#define ST_PDV_SMALL 2420
-#define QU_CTS34_EYES 2384
-#define MV_LUK34_CLOSE 2545
-#define ANI_DMN01 2615
-#define QU_SC33_SHOWMUG 2631
-#define QU_TST_FLOW 2655
-#define ANI_TESTO_ORANGE 2656
-#define MV_MAN17_TAKEMUG 2744
-#define MV_MAN_TOLADDER 448
-#define QU_SC6_DROPS2 2905
-#define MV_MAN3_GIVECOIN_2 2931
-#define MV_MAN4_LOOKINBOTTLE 2935
-#define rMV_MAN_HMRKICK_COINLESS 2965
-#define MV_STP8_FALL 2972
-#define PIC_SC9_UTRUBA 2985
-#define MV_VSN_FROMLEFT 1015
-#define QU_VSN_FROMR 3000
-#define QU_SC11_MANFALL 3017
-#define MSG_SC8_ENTERUP 3037
-#define ANI_DOMINO_18 3174
-#define MSG_SC38_TRYTAKEBOTTLE 3179
-#define QU_DRP7_DROP 3188
-#define MV_BTT_LOOK_SPOON 3194
-#define QU_RPE_NORM 3258
-#define MV_JET17_DROP 3291
-#define QU_JET17_FLOW 3294
-#define MSG_SC19_UPDATESUGAR 3315
-#define QU_SC22_TOSTOOL_R 3332
-#define rMV_MAN_STARTSHOES_2 3398
-#define rMV_MAN_STOPSHOES_2 3400
-#define rMV_MAN_CLEANNOSE 3461
-#define QU_GRFU_KISSOPEN 3480
-#define SND_8_008 3618
-#define SND_8_019 3629
-#define SND_9_007 3651
-#define SND_11_004 3683
-#define SND_11_015 3699
-#define SND_11_026 3710
-#define SND_13_002 3742
-#define SND_14_001 3778
-#define SND_14_012 3794
-#define SND_16_010 3830
-#define SND_16_021 3841
-#define SND_16_032 3852
-#define QU_SC17_SND1 3865
-#define SND_17_020 3884
-#define SND_17_031 3895
-#define SND_20_006 3939
-#define SND_22_004 3982
-#define SND_22_015 3998
-#define SND_22_026 4009
-#define SND_24_002 4004
-#define SND_26_011 4092
-#define QU_SC28_SND1 4148
-#define ANI_SHD_01 4202
-#define PIC_SC28_DARK6 4271
-#define PIC_SC32_LADDER 4296
-#define QU_SC29_SND2 4336
-#define SND_30_007 4370
-#define SND_31_006 4389
-#define SND_32_005 4396
-#define SND_32_016 4412
-#define SND_32_027 4423
-#define SND_33_004 4436
-#define SND_35_002 4495
-#define SND_35_013 4511
-#define MV_MAN34_PUTBOX_FLOOR 4567
-#define MV_MAN34_FROMBOX_FLOOR 4570
-#define ANI_GRIT_38 4573
-#define MV_MID_CLEANVENT 4582
-#define SND_34_036 4616
-#define PIC_MNU_DEBUG_L 4632
-#define PIC_MSV_7_D 4657
-#define MSG_HMRKICK_METAL 4764
-#define ST_FLY_FLY 4918
-#define QU_GLV28_GOL 4958
-#define SND_CMN_067 4967
-#define SND_32_038 4996
-#define SND_FINAL1_001 5007
-#define MV_FN4MAN_LAUGH 5101
-#define MV_IN1MAN_GETUP 5117
-#define PIC_MSV_DOT_D 5188
-#define SND_23_014 5193
-#define MSG_MANSHADOWSON 5197
-#define MV_MAN_LOOKUP_EYES 5206
-#define SND_22_037 5305
-#define PIC_MAP_A02 5264
-#define PIC_MAP_A13 5275
-#define PIC_MAP_P04 5280
-#define PIC_MAP_P15 5291
-#define PIC_MAP_S01 5223
-#define PIC_MAP_S12 5234
-#define PIC_MAP_S34 5258
-#define PIC_MAP_S02 5224
-#define QU_SC32_FALLHANDLE 5351
-#define MV_HDL_FALL 2396
-#define SND_17_032 5212
-#define SND_21_028 5192
-#define PIC_SC18_DOMIN 5184
-#define SND_INTR_012 5157
-#define SND_INTR_001 5146
-#define QU_INTR_CLOCK 5137
-#define PIC_IN1_LADDER 5102
-#define ST_FNHND6_BEFORE 5058
-#define ANI_FN2_HAND6 5056
-#define ANI_FN3_HAND5 5052
-#define ST_FNHND3_HMR 5041
-#define ST_MANFIN1_EMPTY 5022
-#define SND_29_031 4880
-#define SND_25_024 4872
-#define SND_CMN_057 4868
-#define PIC_INV_LOPAT_C 4844
-#define PIC_INV_BOX_C 4828
-#define PIC_INV_VANTUZ_H 4821
-#define PIC_INV_TUBE_H 4820
-#define PIC_INV_SOCK_H 4816
-#define PIC_INV_GUM2_H 4804
-#define QU_MAN_DEF_LOOKUP_R 4777
-#define PIC_SC27_HITZONE2 4756
-#define rMV_BRD_STARTR 4738
-#define SND_38_033 4729
-#define PIC_MSV_0_L 4644
-#define PIC_MSV_FULL_L 4642
-#define SND_36_013 4607
-#define MSG_SC34_CLIMBBOX 4571
-#define MSG_SC4_HIDEBOOT 4563
-#define SND_37_001 4536
-#define SND_36_002 4521
-#define SND_34_026 4486
-#define SND_34_015 4475
-#define SND_34_004 4459
-#define SND_29_020 4354
-#define SND_CMN_046 4322
-#define QU_SC28_LIFT1_END 4257
-#define SND_9_019 4201
-#define SND_38_022 4189
-#define SND_38_011 4176
-#define QU_SC38_SND1 4166
-#define SND_27_033 4134
-#define SND_27_022 4123
-#define SND_27_011 4112
-#define QU_SC27_SND1 4102
-#define SND_25_013 4066
-#define SND_25_002 4050
-#define SND_23_004 4017
-#define SND_21_017 3971
-#define SND_21_006 3960
-#define QU_SC19_SND4 3917
-#define QU_SC18_SND3 3903
-#define SND_15_001 3798
-#define SND_13_025 3770
-#define SND_13_014 3759
-#define SND_12_015 3735
-#define SND_12_004 3719
-#define SND_10_006 3672
-#define SND_2_020 3514
-#define SND_1_010 3511
-#define QU_DRP24_TOFLOOR 3510
-#define QU_SC28_WMN_START 3452
-#define SND_CMN_024 3406
-#define ST_TEST 3367
-#define ST_BTH_5 3357
-#define MV_SPK4_PLAY 3276
-#define QU_KZW14_TOUS 3273
-#define QU_SC2_SND5 3229
-#define QU_SC1_SND4 3223
-#define SND_CMN_013 3112
-#define SND_CMN_002 2928
-#define rMV_STR_NOSE 3052
-#define MSG_SC13_TESTOPEN 3048
-#define PIC_SC10_FLOOR 3001
-#define ST_LBN_0N 2832
-#define MV_LBN_6 2767
-#define ST_LBN_2P 2757
-#define MV_EGBR_DENY 2735
-#define ANI_GRIT_9 2719
-#define MV_TEST2 2684
-#define ST_BRD34_GRANDMA2 2574
-#define MV_MAN34_FROMBOX 2493
-#define MV_CTS34_HIDE 2476
-#define MV_CTS34_GROW 2382
-#define MV_LEG_POT1_SHOW 2328
-#define MV_MAN32_SITDOWN 2276
-#define QU_SC38_SHOWDMN_DLD1 2254
-#define PIC_SC38_UTRUBA 2171
-#define QU_SC29_MANFROM_R 2104
-#define MV_DRV_TOLEFT_V 2007
-#define MV_MAN26_TURNVENT_R 1932
-#define MV_MAN25_CHIH 1886
-#define QU_SC26_ENTER_LEFT 1866
-#define PIC_SC26_LTRUBA 1864
-#define MV_MAN22_TAKEBROOM 1753
-#define MV_INV_SOCK_default 1699
-#define PIC_SC21_HDLBASE 1635
-#define QU_GRFG_BLINKBALD 1684
-#define QU_GRFB_DANGLE 1643
-#define MV_GRFB_TAIL 1636
-#define rMV_MANEGBR_EGG2APPLE 465
-#define MV_GRD_LOOKRIGHT 1527
-#define MV_GRD_LOOKLEFT 1526
-#define MV_KSL_0_1 1466
-#define ST_WR16_DEFAULT 1346
-#define MSG_SC17_HIDESUGAR 1417
-#define QU_SMG_FINGERS 1407
-#define ST_SMG_SIT 1399
-#define MSG_SC13_STOPWHIRLGIG 1387
-#define MSG_SC16_SHOWMUG 1352
-#define MV_GRL_GOOUT 1340
-#define ANI_BOY 1327
-#define ANI_WHIRLGIG_19 1302
-#define MSG_SC14_SHOWBALLGMADIVE 1260
-#define MSG_SC14_GMAJUMP 1250
-#define PIC_SC14_DTRUBA 1222
-#define MV_MAN11_JUMPOVER 1131
-#define QU_SC10_ENTER_LIFTDOWN 1063
-#define QU_SC10_ENTER_LEFT 989
-#define MSG_SC9_EATBALL 941
-#define MSG_SC5_HIDEHANDLE 917
-#define MV_BLK_CLOSE 911
-#define SC_TEST 903
-#define MV_SLN_POT_TURN 632
-#define SC_INV 858
-#define QU_SC12_ENTER_RIGHT 856
-#define ST_SLN_BOOT 830
-#define MSG_SC7_HIDELUKE 821
-#define MV_BTT_LOOKMAN 738
-#define MV_BTT_ZANIUKH 742
-#define PIC_SCD_1 727
-#define QU_SC7_ENTER_RIGHT 721
-#define QU_SC7_ENTER_LEFT 720
-#define ANI_CORNERSITTER 711
-#define MSG_SC6_TAKEBALL 682
-#define ST_INV_BOX_default 892
-#define ANI_BUTTON 598
-#define MV_KZW_TOHOLERV 537
-#define QU_EFTR_FATTOSORROW 530
-#define MV_MAN_TOTRUBAVER2 519
-#define ST_MAN_1PIX 518
-#define QU_DYAS_DEFAULT4 515
-#define QU_SC1_EGBRSIGH 510
-#define PIC_SC3_RTRUBA 414
-#define MV_EGBR_BRK_DOMINO 388
-#define ST_EGBR_HEADLOWER 378
-#define MV_EGTR_SLIMBOLTLEGS 335
-#define PIC_SC2_LTRUBA 411
-#define MV_MANEGTR_GIVESEGGSLIM 418
-#define MV_OTM_BOX_MORGLEFT 427
-#define ST_OTM_BOX_RIGHT 430
-#define ST_KZW_FRONT 573
-#define MV_KZW_GOEDGE 575
-#define QU_OTM_GLS_MORGRIGHT 640
-#define QU_SC4_ENTER_RIGHT 707
-#define ST_MAN8_FLYUP 769
-#define MV_MAN8_HANDSDOWN 772
-#define MV_BRD_PICKBALL 692
-#define MV_INV_OLDGLASSES_default 403
-#define PIC_INV_OLDEGG 370
-#define MV_INV_OLDCOIN_default 390
-#define ANI_INV_OLDCOIN 386
-#define MV_SLN_POT_TURNBACK 634
-#define ST_VSN_NORMAL 906
-#define ST_VSN_RIGHT 956
-#define QU_VSN_DRYG 958
-#define PIC_SC6_CLKAXIS 1006
-#define MV_MAN_FROMTRUBAVER2 1024
-#define MV_SC4_COIN_default 1029
-#define PIC_SC4_HOLE 1038
-#define MSG_SC2_LADDERCLICK 1101
-#define MSG_SC8_HIDELADDER_D 1107
-#define MV_MAN11_SWING_2 1112
-#define MV_MAN11_JUMPONSWING 1125
-#define PIC_SCD_13 1195
-#define MV_GMA_TOTRUBA 1234
-#define MV_BAL14_SPIN 1247
-#define QU_SC15_ENTER_RIGHT 1274
-#define ST_WHR19_SPIN 1318
-#define PIC_SC18_RTRUBA2 1322
-#define ST_BDG_CLOSED 1380
-#define ST_INV_BOTTLEFULL_default 1423
-#define QU_SC16_TAKEMUG 1435
-#define MV_BTL_FILL 1430
-#define MV_HND17_CYCLE 1452
-#define MSG_SC18_SHOWMANJUMPTO 1508
-#define QU_SC18_ENTER_RIGHT 1521
-#define ST_HND17_ASK 1559
-#define MV_INV_EGGAPL_default 1565
-#define MV_GFA_BREATHE 1589
-#define ST_GFA_SITSOCK 1592
-#define ST_GFA_SWINGSOCK 1598
-#define QU_SC22_ENTER_UP 1619
-#define ST_CND_2 1707
-#define MV_CND_4_5 1712
-#define MV_CND_9_0 1722
-#define PIC_SCD_24 1845
-#define MV_MAN24_TAKEBOARD 1876
-#define ANI_INV_SWAB 1917
-#define MV_CHI_HIDE 1961
-#define ST_BTA_EMPTY 2050
-#define ST_SHR_EMPTY 2150
-#define MV_MAN29_HIT 2088
-#define QU_DLD_BLINK 2216
-#define QU_FFT_PIPE_LOOKFLAG 2302
-#define PIC_SCD_35 2412
-#define MV_GMA20_FLR_LOOK 2430
-#define MV_GMA20_STD_BLINK 2435
-#define ANI_STOOL_20 2463
-#define MV_CTS_CYCLEDOWN 2470
-#define MSG_SC22_SHOWSTOOL 2495
-#define MV_BOX34_MAIN 2499
-#define MV_MAN1_TAKEDOMINO 2614
-#define QU_SC33_STARTWATER 2644
-#define ST_HZE_CUT 2678
-#define MV_POT_9 2698
-#define ST_BTS11_2 2707
-#define QU_SC14_EXITLIFT 1226
-#define QU_SC34_ENTERLIFT 2819
-#define ST_EGTR_MID1 2863
-#define MV_MOM_TAKE2 2886
-#define MSG_SC6_JUMPFW 2901
-#define MSG_SC6_RESTORESCROLL 2906
-#define ST_DRP3_NORM2 2923
-#define MV_MAN3_GIVECOIN_3 2930
-#define MSG_SC31_PULL 2944
-#define QU_SC6_DROPS3 2955
-#define ANI_NADUVTAIL 3023
-#define PIC_SC11_LADDER 3038
-#define QU_BTT_CLOCK 3195
-#define ST_BAL14_NORM4 3219
-#define MSG_SC14_HIDEPINK 3248
-#define QU_JET17_DROP 3295
-#define ST_BTL_FULL2 3307
-#define MV_MAN_SHOES2 3387
-#define SND_8_009 3619
-#define SND_9_008 3652
-#define SND_11_005 3684
-#define SND_11_016 3700
-#define SND_11_027 3711
-#define SND_13_003 3743
-#define SND_14_002 3779
-#define SND_14_013 3795
-#define QU_SC16_SND1 3821
-#define SND_16_011 3831
-#define SND_16_022 3842
-#define SND_16_033 3853
-#define QU_SC17_SND2 3866
-#define SND_17_010 3874
-#define SND_17_021 3885
-#define SND_20_007 3940
-#define SND_22_005 3983
-#define SND_22_016 3999
-#define SND_22_027 4010
-#define SND_24_003 4006
-#define SND_26_001 4077
-#define SND_26_012 4093
-#define QU_SC28_SND2 4149
-#define SND_28_010 4157
-#define MSG_SC9_TOLADDER 4206
-#define MV_MAN25_STARTROW 1880
-#define MSG_SC28_TURNOFF_6 4273
-#define QU_SC29_SND3 4337
-#define SND_30_008 4371
-#define SND_31_007 4390
-#define SND_32_006 4402
-#define SND_32_017 4413
-#define SND_32_028 4424
-#define SND_33_005 4437
-#define MV_JTI33_POURFULL 4455
-#define SND_35_003 4496
-#define SND_35_014 4512
-#define MV_BOX34_FLOOR 4564
-#define MV_GLV_DRINKBOTTLE 2164
-#define SND_35_025 4603
-#define SND_34_037 4617
-#define PIC_MSV_8_D 4658
-#define QU_TBL_GOR 4709
-#define SND_27_044 4687
-#define ST_BRDCMN_GOR 4734
-#define ST_BOT15_NORM 4781
-#define MV_LUK26_HIT 4889
+#define PIC_CSR_GOFAR_R 4896
+#define PIC_CSR_GOL 4897
 #define PIC_CSR_GOR 4898
-#define rMV_BRDCMN_STOPR 4945
-#define MSG_SC16_SHOWBEARDED 4956
-#define SND_CMN_068 4968
-#define rMV_KBK_FROMTRUBA 4973
-#define SND_13_036 4992
-#define SND_32_039 4997
-#define PIC_INTR1_RTRUBA 5002
-#define PIC_FIN1_UTRUBA 5004
-#define ST_FNFNG_AFTER 5065
-#define ST_FNG_SINGLE 5078
-#define SND_22_038 5306
-#define SND_23_015 5309
-#define PIC_MAP_A03 5265
-#define PIC_MAP_A14 5276
-#define PIC_MAP_P05 5281
-#define PIC_MAP_P16 5292
-#define SND_CMN_035 3714
-#define SND_28_021 4672
-#define PIC_MAP_S13 5235
-#define PIC_MAP_S24 5246
-#define PIC_MAP_S35 5259
-#define PIC_MAP_H30 5384
-#define PIC_MAP_S03 5225
-#define SND_13_037 5335
-#define PIC_SC26_SOCK 5312
-#define PIC_SC11_RTRUBA 1120
-#define PIC_SC3_DOMIN 5182
-#define MV_BHD_GOR 4939
-#define rMV_BHD_GOR 4941
-#define SND_INTR_013 5158
-#define ST_IN1HAND_BEFORE 5115
-#define MV_IN1HAND_DO 5114
-#define MV_FNHED_NOSE 5045
-#define ST_FNHED_NORM 5044
-#define ST_FNHND3_NORM 5039
-#define MSG_FIN_GOTO2 5024
-#define QU_SC33_TRYKUBIK 4979
-#define QU_BRD16_FLYL 4954
-#define QU_EGG6_GOL 4936
-#define ST_BBL_GOR 4925
-#define SND_25_025 4874
-#define SND_CMN_058 4869
-#define PIC_INV_MUGFULL_C 4846
-#define PIC_INV_HANDLE_C 4842
-#define PIC_INV_DOMINO_C 4832
-#define PIC_INV_CARPET_C 4830
-#define PIC_INV_SWAB_H 4819
-#define PIC_INV_GLASSES_H 4802
-#define PIC_INV_BOARD_H 4787
-#define MV_MAN_LOOKMONETOPR 4770
-#define SND_38_034 4730
-#define SND_36_014 4608
-#define ANI_BOOT_34 4560
-#define QU_SC26_SHOWSOCK 4556
-#define QU_SC37_SND1 4541
-#define SND_37_002 4537
-#define SND_36_003 4522
-#define SND_34_027 4487
-#define SND_34_016 4476
-#define SND_34_005 4460
-#define SND_33_006 4443
-#define SND_29_021 4355
-#define ST_STL34_BOX2 4305
-#define MV_TTA_GOD 4290
-#define MSG_SC28_ENDLIFT6 4244
-#define SND_38_023 4190
-#define SND_38_012 4177
-#define QU_SC38_SND2 4167
-#define SND_38_001 4161
-#define SND_27_034 4135
-#define SND_27_023 4124
-#define SND_27_012 4113
-#define QU_SC27_SND2 4103
-#define SND_27_001 4097
-#define SND_25_014 4067
-#define QU_SC25_SC3 4056
-#define SND_25_003 4051
-#define SND_21_007 3961
-#define QU_SC19_SND5 3918
-#define QU_SC18_SND4 3904
-#define QU_SC15_SND1 3803
-#define SND_15_002 3799
-#define SND_13_026 3771
-#define SND_13_015 3760
-#define SND_12_016 3736
-#define SND_12_005 3720
-#define SND_10_007 3673
-#define SND_1_011 3524
-#define SND_2_021 3515
-#define MSG_SC26_UPDATEDROP 3496
-#define QU_CHI_NORM 3485
-#define QU_WMN_SHOWBEFORE 3450
-#define ST_WMN28_EMPTY 3444
-#define MV_MUG17_FILLDROP 3412
-#define QU_MAN_DEF_STARTSHOES1 3379
-#define MV_CDI_BLINK 3311
-#define PIC_SC19_LADDER2 3301
-#define ST_GRL_POPA 3277
-#define ST_SPK4_NORM2 3113
-#define QU_SC1_SND5 3224
-#define SND_CMN_014 3138
-#define SND_2_010 3092
-#define MV_MID11_SWAB 3025
-#define ST_BOT4_LEFT 2882
-#define MV_MAN_STOPLADDER2 2845
-#define QU_SC6_ENTER_LIFTDOWN 2810
-#define QU_SC6_EXITLIFT 1055
-#define MV_LBN_9H 2806
-#define MV_LBN_7 2770
-#define ST_LBN_1P 2754
-#define ANI_BALLDROP 2685
-#define MV_MAN25_TAKEPOTTIE 2676
-#define MV_KDK_DRIZZLE 2671
-#define MV_MAN35_PLUGPIPE 2513
-#define MV_LEG_POT0_SHOW 2323
-#define QU_SC32_ENTER_RIGHT 2295
-#define PIC_SC32_RTRUBA 2292
-#define MV_FLG_STOPL 2261
-#define QU_SC38_SHOWDMN_DLD2 2255
-#define QU_SC29_ENTER_UP 2077
-#define QU_SC28_ENTER_RIGHT 2076
-#define QU_DRV_STARTDRIVE 2029
-#define ST_MID_BROOM 2022
-#define ST_DRV_RIGHTNOVENT 2002
-#define MV_DRV_TOLEFT 1998
-#define ANI_VODILLA 1994
-#define ANI_INV_VENT 1968
-#define QU_SC26_CLOSE1 1936
-#define MV_MAN25_TRYSWAB 1888
-#define PIC_SC24_PIPE2 1871
-#define QU_SC25_ENTER_RIGHT 1862
-#define ST_LUK23U_CLOSED 1819
-#define MV_LUK23U_OPEN 1818
-#define MV_LUK23_OPEN 1814
-#define QU_SC22_SHOWSACK 1792
-#define QU_SC22_SHOWSTOOL 1793
-#define MV_MSH_MOVE 1755
-#define MV_TABURETTE_default 1746
-#define PIC_INV_SOCK 1701
-#define MV_MAN2_TAKEBOX 1695
-#define ST_GRFU_KISS 1681
-#define PIC_SC22_UTRUBA 1587
-#define PIC_SC22_DTRUBA 1586
-#define MV_KSL_SWING 1460
-#define QU_GRL_LAUGH 1376
-#define ST_WHR18_SPIN 1301
-#define MV_GRD2_LOOKLEFT 1284
-#define QU_GRD2_BLINK1 1288
-#define QU_GMS_DRYG 1277
-#define ANI_BALL14 1246
-#define PIC_INV_GUM2 1207
-#define ST_INV_GUM2_default 1206
-#define MV_HDLR_0_1 1197
-#define ST_SWR_SIT 1147
-#define QU_NDV_EAT 968
-#define ANI_BIGLUK 909
-#define ANI_INV_OLDBOOT 396
-#define ST_SLN_POT_HOBOT 839
-#define MV_BTT_SLEEP 751
-#define ST_BTT_SPOON 741
-#define PIC_SCD_2 728
-#define MV_CST_TURNDOWN 719
-#define MV_CST_SPINHEADUP 716
-#define ST_CLK_CLOSED 590
-#define QU_EGTR_SORROWTOSLIM 526
-#define QU_DYAS_DEFAULT5 516
-#define MV_EGTR_BRK_BOOT 383
-#define MV_DYAS_SLEEPS 317
-#define MV_EGTR_SMOBLRV 338
-#define ANI_EGGBREAKER 376
-#define MV_MANYAS_TAKESCRATE 362
-#define ANI_KOZAWKA 495
-#define PIC_SC5_LTRUBA 636
-#define QU_SC3_ENTER_UP 706
-#define ST_MAN8_FLYDOWN 771
-#define MV_HGN_PLUU 813
-#define ST_SC7_BOX_default 793
-#define QU_SCT_LOOK 819
-#define MV_SLN_BOOT_DECLINE 832
-#define ST_INV_COIN_default 877
-#define MV_INV_GLASSES_default 888
-#define PIC_SC10_LTRUBA 972
-#define LiftDown 1058
-#define rMV_MAN_TURN_RL 1072
-#define MV_MAN11_FROMDOWN 1151
-#define MV_STR_TURNL 1173
-#define QU_STR_HIDE 1187
-#define PIC_SCD_14 1224
-#define QU_GMA_THROW 1255
-#define MV_BDG_OPEN 1379
-#define QU_SC18_ENTER_UP 1468
-#define MSG_SC18_MANCLIMBEDUP 1539
-#define ANI_INV_EGGCOIN 1567
-#define ST_INV_EGGCOIN_default 1569
-#define QU_GFA_SWINGSOCK 1615
-#define QU_DYAS_SLEEP 1690
-#define ST_CND_3 1709
-#define MV_CLN_ZHMUR 1768
-#define PIC_SCD_25 1846
-#define QU_SC25_ROWTOLADDER 1910
-#define ST_INV_SWAB_default 1919
-#define MV_GRFM_ASS 1982
-#define MV_ASS_TAIL 2121
-#define rMV_ASS_SHOW 2126
-#define ST_BTL38_NORM 2190
-#define QU_GLV_HMRKICK 2207
-#define MV_FFT_0_1 2274
-#define QU_GLV_DRINKBOTTLE 2286
-#define PIC_INV_TUBE 2320
-#define MV_MAN36_GOOUT 2367
-#define MV_MAN36_SHAKE 2368
-#define QU_SC35_ENTER_LEFT 2410
-#define ANI_HOSE 2424
-#define QU_GMA20_STL_NOSE 2447
-#define QU_GMA20_STD_BLINK 2450
-#define MV_STL20_NORM 2464
-#define QU_CTS34_BLINK 2388
-#define MV_MAN34_GOUP 2484
-#define ANI_INV_STOPPER 2535
-#define MV_LUK34_OPEN 2542
-#define PIC_SCD_36 2567
-#define MV_GRD3_PULL 2578
-#define MV_GMA22_TAKESTOOL 2610
-#define QU_SC22_FALLSACK_GMA 2613
-#define ANI_JETTIE_FLOW 2627
-#define MV_TSTB_FLOW 2660
-#define ST_TSTG_NORM 2664
-#define ST_POT_9 2699
-#define PIC_SC9_LADDER_R 2700
-#define ST_DMN3_NORM 2734
-#define MV_MAN_FROMHORTRUBA2 2846
-#define MV_MAN_FROMLADDER 493
-#define ST_EGTR_MID2 2869
-#define MV_MOM_TAKE3 2887
-#define MV_MOM_JUMPCLOSED 2892
-#define ST_INV_EGGBLACK_default 2920
-#define MV_CST_TRYCLOSE 2874
-#define QU_SC6_FALLGRIT2 2966
-#define PIC_CMN_SAVE 3034
-#define MV_GRIT2_FALL 3190
-#define ST_HDLL_HAMMER 3205
-#define MSG_SC14_SHOWBALLLAST 3246
-#define MSG_SC14_HIDEBALLLAST 3251
-#define PIC_SC18_BOARD 3296
-#define PIC_SC18_RTRUBA3 3298
-#define ST_DMS_3 3319
-#define ST_HDL_BROKEN 3342
-#define rMV_MAN_SHOES1 3383
-#define MV_DRP24_TOWATER 3506
-#define SND_9_009 3653
-#define SND_11_006 3690
-#define SND_11_017 3701
-#define SND_11_028 3712
-#define SND_13_004 3744
-#define SND_14_003 3780
-#define SND_14_014 3796
-#define SND_16_001 3816
-#define QU_SC16_SND2 3822
-#define SND_16_012 3832
-#define SND_16_023 3843
-#define SND_16_034 3854
-#define QU_SC17_SND3 3867
-#define SND_17_011 3875
-#define SND_17_022 3886
-#define SND_20_008 3941
-#define SND_22_006 3989
-#define SND_22_017 4000
-#define SND_22_028 4011
-#define SND_24_004 4007
-#define SND_26_002 4078
-#define QU_SC26_SND1 4082
-#define SND_26_013 4094
-#define QU_SC28_SND3 4150
-#define SND_28_011 4158
-#define MV_LFT28_OPEN 4239
-#define ST_LFT28_CLOSED 4240
-#define QU_MAN32_LOOKDOWN 4303
-#define QU_SC29_SND4 4338
-#define SND_29_010 4344
-#define SND_30_009 4372
-#define SND_31_008 4391
-#define SND_32_007 4403
-#define SND_32_018 4414
-#define SND_32_029 4425
-#define SND_35_004 4497
-#define SND_35_015 4513
-#define SND_3_020 4550
-#define SND_4_030 4551
-#define MSG_SC27_TAKEVENT 4584
-#define QU_SC35_FALLGRIT 4611
-#define SND_34_038 4618
-#define PIC_MNU_CONTINUE_D 4625
-#define PIC_MLD_CANCEL_L 4649
-#define PIC_MSV_9_D 4659
-#define PIC_MSV_1_L 4660
-#define SND_28_022 4673
-#define SND_CMN_047 4692
-#define ST_TBL_R 4707
-#define ST_BRDCMN_RIGHT 4732
-#define SND_35_026 4863
-#define MV_MAN11_TAKEBOOT 4884
-#define MV_GMA20_STL_DENY 4886
-#define PIC_CSR_DEFAULT 4891
-#define QU_BALL_WALKR 4919
-#define SND_CMN_069 4969
-#define QU_KBK32_START 4982
-#define SND_18_010 4994
-#define QU_FN1_ENTER_RIGHT 5005
-#define SND_FIN_030 5105
-#define MSG_FIN_ENDFINAL 5109
-#define MV_IN1GLS_NORM 5120
-#define ANI_IN2BOOT 5140
-#define SND_INTR_002 5147
-#define PIC_MSV_SPACE_L 5191
-#define SND_21_029 5213
-#define SND_17_033 4018
-#define SND_23_016 5310
-#define MSG_SC34_ONBUMP 5313
-#define PIC_MAP_A04 5266
-#define PIC_MAP_P06 5282
-#define PIC_MAP_P17 5293
-#define PIC_CSR_MAP 5339
-#define SND_CMN_025 3407
-#define SND_CMN_036 3715
-#define PIC_MOV_BGR 5343
-#define PIC_MAP_S14 5236
-#define PIC_MAP_S25 5247
-#define PIC_MAP_S36 5260
-#define PIC_MAP_H31 5385
-#define PIC_MAP_H20 5374
-#define PIC_MAP_S04 5226
-#define MSG_SC3_ONTAKECOIN 5338
+#define PIC_CSR_GOU 4899
 #define PIC_CSR_HELPERBGR 5331
-#define SC_30 2064
-#define SND_INTR_014 5159
-#define SND_INTR_003 5148
-#define ST_CLK1_CYCLE 5129
-#define SND_FIN_020 5092
-#define MSG_FIN_GOTO3 5071
-#define MV_FCN_FALL 5015
-#define SND_25_026 4875
-#define SND_CMN_059 4873
-#define PIC_INV_LEVERHANDLE_C 4843
-#define PIC_INV_BROOM_C 4829
-#define PIC_INV_BOTTLE_C 4826
-#define PIC_INV_VENT_H 4822
-#define PIC_INV_HAMMER_H 4805
-#define PIC_INV_EGGCOIN_H 4800
-#define QU_SC29_BRD1 4741
-#define SND_CMN_048 4702
-#define QU_EGTR_MD2_SHOW 4698
-#define SND_3_021 4696
-#define SND_28_023 4683
-#define MSG_SC28_TURNON_0 4677
-#define ANI_BUTTON_27 4579
-#define QU_SC37_SND2 4542
-#define SND_37_003 4538
-#define QU_SC36_SND1 4525
-#define SND_36_004 4523
-#define SND_34_028 4488
-#define SND_34_017 4477
-#define SND_34_006 4466
-#define SND_33_007 4444
-#define SND_29_022 4356
-#define ANI_TIOTIA 4286
-#define MSG_SC28_LIFT1_SHOWAFTER 4261
-#define ST_MAN28_WASH 4250
-#define QU_SC25_MANLOOKUP 4213
-#define SND_38_024 4191
-#define QU_SC38_HMRKICK 4180
-#define SND_38_013 4178
-#define QU_SC38_SND3 4168
-#define SND_38_002 4162
-#define SND_27_035 4136
-#define SND_27_024 4125
-#define SND_27_013 4114
-#define QU_SC27_SND3 4104
-#define SND_27_002 4098
-#define SND_25_015 4068
-#define QU_SC25_SND1 4054
-#define SND_25_004 4052
-#define SND_23_006 4024
-#define SND_21_019 3973
-#define SND_21_008 3962
-#define SND_19_010 3923
-#define QU_SC18_SND5 3905
-#define QU_SC15_SND2 3804
-#define SND_15_003 3800
-#define SND_13_027 3772
-#define SND_13_016 3761
-#define SND_12_017 3737
-#define SND_12_006 3726
-#define SND_10_008 3674
-#define SND_1_012 3525
-#define SND_2_022 3518
-#define MV_MAN27_SPADE2SWAB 3486
-#define MSG_SC17_DROP 3414
-#define QU_SC27_RESTARTBETS 3370
-#define QU_SC22_TRYHANDLE 1802
-#define ANI_SPEAKER_4 3275
-#define SND_CMN_015 3139
-#define SND_4_020 3135
-#define SND_3_010 3109
-#define SND_2_011 3093
-#define SND_CMN_004 3074
-#define QU_SC13_CLOSESUCCESS 3062
-#define QU_STR_TURNR_L 3059
-#define QU_SC13_OPENFAIL 3042
-#define QU_MOM_OPENEYE 2949
-#define MSG_SC6_ENABLEDROPS 687
-#define PIC_SC4_LBTRUBA 2884
-#define MV_MAN17_TAKEFIRECAN 2859
-#define ST_LBN_0P 2833
-#define QU_SC15_ENTERLIFT 2811
-#define ST_LBN_9H 2807
-#define MV_LBN_8H 2804
-#define MV_LBN_8 2773
-#define QU_SC6_FALLBALL 2690
-#define MV_SPR_NORM 2516
-#define ST_LEG_DOWN1 2330
-#define ANI_LEG 2322
-#define ST_FLG_LEFT 2260
-#define PIC_SC38_TABLE 2206
-#define MV_MAN29_BEND 2091
-#define PIC_SC29_LTRUBA 2081
-#define QU_MID_BROOM 2046
-#define QU_MID_LOOK 2045
-#define MV_MID_SWITCH 2020
-#define ST_MID_SWAB2 2019
-#define QU_SC26_CLOSE2 1938
-#define MV_WTR25_FLOW 1857
-#define PIC_SC25_UTRUBA 1852
-#define MV_JET24_FLOW 1838
-#define QU_SC23_STARTKISS 1822
-#define QU_GRFU_KISS 1821
-#define QU_SC22_PUTSTOOL 1803
-#define MV_MAN22_TAKEHANDLE 1752
-#define ST_TABURETTE_default 1747
-#define QU_GRFU_STOPCHMOK 1671
-#define QU_GRFU_BLINKDOWN 1668
-#define PIC_SC22_LADDER 1585
-#define ST_KSL_JUMPMAN 1505
-#define ST_GRL18_FLYFROM 1486
-#define ANI_GIRL18 1484
-#define MV_KSL_1_2 1467
-#define MV_MAN16_TAKEMUG 1362
-#define MV_BOY_PULL 1332
-#define MV_GMA_JUMPFW 1230
-#define MV_MAN13_PUTGUM 1203
-#define ST_HDLR_GUM 1201
-#define MV_SWR_SWING 1114
-#define MSG_SC3_UTRUBACLICK 1103
-#define MV_MAN_STOPLADDERD 458
-#define MSG_SC10_HIDEGUM 993
-#define MSG_SC5_SHOWHANDLE 918
-#define MSG_SC5_TESTLUK 914
-#define MV_BLK_OPEN 910
-#define PIC_INV_OLDCOIN 406
-#define ST_INV_EGG_default 871
-#define ANI_INV_APPLE 878
-#define QU_SLN_POT_MOVEBACK 854
-#define MV_SLN_BOOT_KICK 828
-#define MV_BTT_EAT 740
-#define PIC_SCD_3 729
-#define ST_CST_WHANDLE 715
-#define PIC_SC1_UTRUBA 699
-#define MSG_CLICKBOTTLE 569
-#define ST_PNK_WEIGHTRIGHT 504
-#define ST_SPR_UP 544
-#define QU_EGTR_FATSLAP 529
-#define MV_MAN_TURN_DR 491
-#define MV_MAN_TURN_UR 487
-#define MV_MAN_FROMHORTRUBA 475
-#define ST_OTM_GLS_LEFT 421
-#define MV_EGBR_KACHAET 381
-#define MV_EGTR_FATOBLRV 373
-#define MV_EGTR_SLIMTRAIN 342
-#define MV_OTM_BOXDEFAULT 431
-#define MV_MAN_TOTRUBAHOR 445
-#define ST_KZW_RIGHT 559
-#define QU_KZW_WALKBOTTLE2 579
-#define QU_SC4_CLOSECLOCK 597
-#define PIC_SC4_LRTRUBA 616
-#define MV_OTM_HANDLEDOWN 620
-#define MV_OTM_BOXHANDLEDOWN 626
-#define ST_MOM_STANDS 658
-#define MV_CST_MORG 712
-#define ST_INV_OLDHANDLE_default 797
-#define PIC_INV_OLDAPPLE 409
-#define ST_PBAR_FINISH 899
-#define PIC_SC9_RTRUBA 901
-#define ST_BALL9_EMPTY 940
-#define ST_NDV_TURN 950
-#define ANI_LIFT 982
-#define MV_MAN4_TAKEAPPLE 1039
-#define ST_LFT_CLOSED 1049
-#define MV_MAN_TURN_SDU 1086
-#define MV_MAN_TURN_SUD 1089
-#define MV_MAN_STARTR 324
-#define MSG_SC6_UTRUBACLICK 1105
-#define ANI_MAN11 1108
-#define PIC_INV_GUM 1160
-#define ST_GMA_SIT 1229
-#define MV_MAN14_STEPFW 1240
-#define PIC_SCD_15 1278
-#define MV_GRD2_PULL 1280
-#define PIC_SC17_LADDER 1324
-#define PIC_INV_MUG 1373
-#define MV_HND17_FROMCYCLE 1453
-#define QU_HND17_ASK 1456
-#define MSG_SC17_UPDATEHAND 1560
-#define ST_INV_EGGAPL_default 1566
-#define ANI_INV_EGGBOOT 1570
-#define MV_INV_EGGBOOT_default 1571
-#define ST_GFA_SWING 1596
-#define MV_GFA_CHESHSOCK 1604
-#define ST_GRFG_HAIR 1677
-#define ST_CND_4 1711
-#define MV_CND_5_6 1714
-#define ST_CLN_STAND 1769
-#define ANI_INV_LEVERHANDLE 1777
-#define ST_INV_LEVERHANDLE_default 1779
-#define ANI_INV_STOOL 1780
-#define PIC_SCD_26 1847
-#define ST_BRD25_RIGHT 1900
-#define PIC_INV_SWAB 1923
-#define ST_CHI_NORM 1960
-#define QU_CHI_SHOW 1964
-#define MSG_SC29_DISABLERIDEBACK 2106
-#define QU_ASS_TAIL_R 2135
-#define ST_FFT_TUBEFLOW 2232
-#define ST_FFT_PIPEOPEN 2244
-#define PIC_SC32_HDLBASE 2400
-#define MV_MAN32_SPIN 2403
-#define ST_PDV_LARGE 2421
-#define MV_CTS34_SHRINK 2477
-#define MV_VNT34_SPIN 2480
-#define MV_MAN34_TRY 2485
-#define MV_MAN34_BOARD_BUMP 2504
-#define QU_LUK34_OPEN 2546
-#define PIC_SCD_37 2568
-#define MV_MOM_BLINK 825
-#define rMV_MAN_FROMHORTRUBA2 2847
-#define MV_EGTR_MD1_JOY 2867
-#define MV_MOM_TAKE4 2888
-#define ANI_POOL_3 2924
-#define MSG_SC1_SHOWOSK2 468
-#define MSG_SC4_HANDOVER 2960
-#define MV_GRIT1_FALL 2962
-#define QU_SWR_SITBALD 3007
-#define ST_SWR_STAND3 3014
-#define QU_SWR_STAND 3015
-#define MV_PCH_NORM 979
-#define QU_MID11_SWAB 3032
-#define SND_1_001 3041
-#define ST_MUG38_NORM2 3183
-#define ST_GRIT2_GRIT 3192
-#define ST_DMS_4 3320
-#define QU_CLN_TUZH 3327
-#define MV_MAN23_TRY 3333
-#define rMV_TABURETTE_default 3336
-#define QU_MAN_DEF_STARTSHOES2 3394
-#define rMV_MAN_SHOES2 3399
-#define ST_DRP24_EMPTY 3507
-#define SND_11_007 3691
-#define SND_11_018 3702
-#define SND_11_029 3713
-#define SND_13_005 3745
-#define SND_14_004 3781
-#define QU_SC14_SND1 3783
-#define SND_14_015 3797
-#define SND_16_002 3817
-#define QU_SC16_SND3 3823
-#define SND_16_013 3833
-#define SND_16_024 3844
-#define SND_16_035 3855
-#define SND_17_001 3860
-#define QU_SC17_SND4 3868
-#define SND_17_012 3876
-#define SND_17_023 3887
-#define SND_20_009 3942
-#define SND_22_007 3990
-#define SND_22_018 4001
-#define SND_22_029 4012
-#define SND_CMN_037 4030
-#define SND_24_005 4028
-#define SND_26_003 4079
-#define QU_SC26_SND2 4083
-#define SND_26_014 4095
-#define SND_28_001 4143
-#define QU_SC28_SND4 4151
-#define SND_28_012 4159
-#define MSG_SC25_TOLADDER 4215
-#define MV_MAN1_PUTBOOT 4230
-#define MSG_SC32_ONLADDER 2270
-#define QU_SC29_SND5 4339
-#define SND_29_011 4345
-#define SND_32_008 4404
-#define SND_32_019 4415
-#define SND_35_005 4498
-#define SND_35_016 4514
-#define MV_DRV_PUSHBUTTON 2005
-#define ST_CPT36_NORM 4602
-#define QU_SC36_SHOWCARPET 4605
-#define SND_36_015 4610
-#define SND_34_039 4619
-#define PIC_MNU_EXIT_D 4621
-#define PIC_MSV_OK_L 4636
-#define PIC_MSV_CANCEL_L 4638
-#define PIC_MSV_2_L 4661
-#define SND_31_009 4727
+#define PIC_CSR_ITN 4893
+#define PIC_CSR_ITN_GREEN 5330
+#define PIC_CSR_ITN_INV 4894
+#define PIC_CSR_ITN_RED 5329
+#define PIC_CSR_LIFT 5176
+#define PIC_CSR_MAP 5339
+#define PIC_INV_MENU 991
+#define PIC_MAP_A13 5275
+#define PIC_MAP_S01 5223
 #define SC_1 301
-#define PIC_CSR_DEFAULT_INV 4892
-#define QU_KBK33_START 4983
-#define SND_4_031 4988
-#define MV_FNFNG_0_1 5077
-#define SND_FIN_031 5106
-#define MSG_LIFT_STARTEXITQUEUE 5186
-#define SND_38_035 5204
-#define SND_17_034 4023
-#define PIC_MNU_RESTART_L 5299
-#define QU_SC22_TRYBOX 5311
-#define PIC_MAP_A05 5267
-#define PIC_MAP_P07 5283
-#define PIC_MAP_P18 5294
-#define SND_CMN_026 3408
-#define PIC_MAP_S15 5237
-#define PIC_MAP_S26 5248
-#define PIC_MAP_S37 5261
-#define PIC_MAP_H32 5386
-#define PIC_MAP_H21 5375
-#define PIC_MAP_H10 5366
-#define PIC_SC17_RTRUBA2 5297
-#define SND_36_016 5208
-#define ST_PBAR_FINISH2 5179
-#define SC_31 2065
-#define SND_INTR_015 5160
-#define SND_INTR_004 5149
-#define MV_IN1CLK_SHOW 5127
-#define ST_IN1MAN_SLEEP 5112
-#define PIC_FN4_LADDER 5096
-#define SND_FIN_021 5093
-#define SND_FIN_010 5082
-#define MSG_FIN_GOTO4 5075
-#define ST_FNHND5_AFTER 5055
-#define ST_FNHND4_AFTER 5051
-#define MV_FNHED_SHOWHAND 5047
-#define QU_FIN1_FALLCOIN 5018
-#define PIC_SC35_DTRUBA_R2 4986
-#define ANI_BIGBALL 4923
-#define SND_25_027 4876
-#define PIC_INV_SCISSORS_H 4815
-#define PIC_INV_EGGBOOT_H 4799
-#define rMV_MAN_LOOKMONETOPR 4774
-#define MSG_SC15_ASSDRYG 4755
-#define MV_TBE36_NORM 4750
-#define QU_SC29_BRDOUT1 4743
-#define QU_SC29_BRD2 4742
-#define rMV_BRD_FALL 4737
-#define SND_CMN_049 4703
-#define QU_EGTR_MD1_SHOW 4697
-#define MSG_SC23_HIDEGIRAFFEE 4650
-#define ST_CPT35_NORM 4594
-#define ST_BOT34_NORM 4562
-#define MV_MAN26_PUTSOCK 4557
-#define QU_SC37_SND3 4543
-#define SND_37_004 4539
-#define QU_SC36_SND2 4526
-#define SND_36_005 4524
-#define SND_34_029 4489
-#define SND_34_018 4478
-#define SND_34_007 4467
-#define SND_33_008 4445
-#define SND_29_023 4357
-#define QU_SC32_FROMLADDER 4300
-#define SND_38_025 4192
-#define SND_38_014 4179
-#define QU_SC38_SND4 4169
-#define SND_38_003 4163
-#define SND_27_036 4137
-#define SND_27_025 4126
-#define SND_27_014 4115
-#define QU_SC27_SND4 4105
-#define SND_27_003 4099
-#define SND_25_016 4069
-#define QU_SC25_SND2 4055
-#define SND_25_005 4053
-#define SND_23_007 4025
-#define SND_21_009 3963
-#define SND_19_011 3924
-#define SND_14_016 3813
-#define QU_SC15_SND3 3805
-#define SND_15_004 3801
-#define SND_13_028 3773
-#define SND_13_017 3762
-#define SND_12_018 3738
-#define SND_12_007 3727
-#define SND_10_009 3675
-#define SND_6_030 3569
-#define SND_1_013 3526
-#define SND_2_023 3520
-#define ST_DRP25_EMPTY 3501
-#define MV_MID_SPADE 3488
-#define MSG_SC25_STARTBEARDEDS 3423
-#define ST_BRDCMN_EMPTY 3422
-#define SND_CMN_027 3409
-#define ST_VNT27_LIES2 3354
-#define ST_VNT26_UP 1929
-#define rMV_MAN25_CHIH 3343
-#define MV_MAN24_TRY 3340
-#define SND_2_001 3083
-#define QU_SC18_ENTER_UPRIGHT 3302
-#define QU_SC16_SHOWBOOT 3290
-#define MV_KZW14_JUMP 3268
-#define ST_KZW14_FRONT 3264
-#define MV_KZW14_SHOW 3262
-#define MV_GMA_BACKOFF2 3217
-#define ST_BTL38_FULL 3172
-#define SND_CMN_016 3140
-#define SND_4_021 3136
-#define SND_4_010 3125
-#define SND_2_012 3094
-#define SND_CMN_005 3075
-#define SND_1_002 3066
-#define rMV_STR_TURNL 3050
-#define QU_SC13_OPENSUCCESS 3047
-#define MSG_SC7_PULL 2943
-#define MV_FCN_NORM 2861
-#define QU_SC15_ENTER_LIFTDOWN 2814
-#define ST_LBN_8H 2805
-#define MV_LBN_7H 2802
-#define LIFTBTN_1 2781
-#define MV_LBN_9 2776
-#define ST_GRT9_NORM 2721
-#define ST_BDP_NORM 2687
-#define MV_MAN34_BOARD_STAND 2548
-#define MV_MAN34_JUMPDOWN 2385
-#define ST_LEG_DOWN2 2334
-#define MV_MAN32_TUBETOPIPE 2275
-#define ANI_FLAG 2257
-#define MSG_SC29_ENABLEPORTER 2096
-#define QU_MID_SWAB2 2043
-#define MV_MID_KERN 2016
-#define MV_DRV_FROMCYCLE 2003
-#define PIC_INV_VENT 1971
-#define MSG_SC26_HIDEVENT 1945
-#define QU_SC26_CLOSE3 1940
-#define QU_SC25_TRYBROOM 1912
-#define MV_MAN25_ROW 1882
-#define QU_SC26_ENTER_UP 1865
-#define QU_WTR25_FLOW 1859
-#define MV_WTR24_FLOW 1835
-#define QU_JET24_FLOW 1841
-#define ANI_JET24 1837
-#define QU_SC21_SHOWLEVER 1789
-#define QU_GRFU_TURN_UD 1664
-#define MV_GRFB_DANGLE 1639
-#define ST_MAN18_STANDKSL 1501
-#define MV_WR16_DEFAULT 1345
-#define MV_SMG_FINGERS 1404
-#define MV_MAN16_PUTMUG 1369
-#define PIC_SC16_TUMBA 1368
-#define MV_GRL_STARTLAUGH 1341
-#define MV_GRL_DRINK 1339
-#define PIC_SCD_16 1299
-#define QU_GMA_JUMPFW 1249
-#define MV_INV_BALL_default 1243
-#define PIC_SC14_RTRUBA 1221
-#define MV_HDLR_1_2 1200
-#define PIC_SC11_LTRUBA2 1150
-#define MSG_SC11_RESTARTMAN 1133
-#define MV_MAN11_JUMPHIT 1129
-#define PIC_SC1_LADDER 1091
-#define ST_KCH_180 1097
-#define MSG_SC10_SHOWGUM 994
-#define MV_MAN12_BOOT2POT 984
-#define QU_NDV_LOOK 970
-#define ST_GLT_FLOWN 932
-#define ANI_PLEVATEL 919
-#define PIC_INV_OLDBOOT 407
-#define QU_SLN_POT_MOVE 853
-#define QU_SLN_BOOT_LOOK 848
-#define MV_SLN_POT_INOUT 845
-#define ANI_SC7_BOX 791
-#define QU_HGN_MORG 814
-#define ST_MAN8_ONLADDER 786
-#define MV_MAN8_GOODLUCK 785
-#define MSG_STARTARCADE 781
-#define PIC_SCD_4 730
-#define QU_MOM_SHAKE 672
-#define MV_HND_TAKE0 604
-#define MV_KZW_RAISEHEAD 577
-#define ST_MAN_ONPLANK 552
-#define PIC_TEST 508
-#define ST_MAN_GOLADDER 450
-#define MV_EGBR_LOWERHEAD 382
-#define ST_EGTR_SLIM 336
-#define MV_OTM_GLS_DECLINES 426
-#define MV_OTM_BOX_TURNR 428
-#define ST_OTM_BOX_LEFT 429
-#define MV_OTM_MORGLEFT 420
-#define MSG_EGGEATEN 535
-#define ANI_MAMASHA 656
-#define TrubaDown 697
-#define ST_VMT_MIN 766
-#define MV_SCT_MORG 799
-#define ANI_INV_HAMMER 884
-#define ST_NDV_SIT 946
-#define MV_MAN6_INSTHANDLE 1007
-#define MSG_SHOWCOIN 1033
-#define PIC_SC8_ARCADENOW 1043
-#define MV_LFT_CLOSE 1053
-#define MV_KCH_MAIN 1095
-#define ST_MAN11_EMPTY 1110
-#define MV_MAN11_JUMPTOSWING 1126
-#define ANI_INV_VANTUZ 1157
-#define MV_INV_VANTUZ_default 1158
-#define PIC_SC13_LTRUBA 1171
-#define ST_STR_RIGHT 1174
-#define QU_STR_NOSE 1188
-#define ANI_HANDLE_L 1209
-#define MV_GMA_BLINK 1228
-#define MV_MAN14_KICK 1237
-#define QU_SC15_ENTER_UP 1275
-#define MV_BOY_KICK 1355
-#define ANI_INV_BOTTLE 1418
-#define QU_HND17_FROMCYCLE 1457
-#define PIC_SC18_LADDER1 1471
-#define MSG_SC18_SHOWBOYJUMP 1495
-#define MV_MAN_FROMLADDERUP 1522
-#define PIC_INV_EGGCOIN 1577
-#define MV_GFA_TOSWINGSOCK 1600
-#define QU_GFA_STARTSOCK 1613
-#define MV_GRFG_SHOWHAIR 1676
-#define MV_GRFG_BLINKHAIR 1679
-#define QU_GRFU_TURN_DU 1665
-#define ST_CND_5 1713
-#define QU_SC23_FROMCALENDAR 1734
-#define QU_SC24_ENTER_DOWN 1831
-#define QU_SC24_ENTER_DOWNLADDER 1832
-#define PIC_SCD_27 1916
-#define MV_LUK23_1_2 1974
-#define ST_HDL23_DEF 1980
-#define MV_BTA_FALL 2049
-#define QU_MID_SWITCH 2042
-#define PIC_SC29_RFLOOR 2153
-#define MV_GLV_HMRKICK 2155
-#define MV_GLV_TOSMALL_NOHMR 2161
-#define MV_DLD_PUT 2174
-#define MV_MLS_TURNRL 2178
-#define MSG_SC38_DRINK 2225
-#define PIC_SCD_38 2228
-#define QU_FFT_PIPE_OPENEYE 2299
-#define QU_FFT_PIPE_BLINK 2301
-#define QU_FFT_TUBE_STOP 2308
-#define MV_INV_PIPE_default 2318
-#define QU_LEG_HIDE0 2375
-#define MV_CTS34_BLINK 2479
-#define ANI_STOOL_34 2486
-#define ANI_BOX_34 2498
-#define PIC_INV_SCISSORS 2530
-#define QU_GRD37_BLINK1 2596
-#define MV_JTI33_POUR 2630
-#define MSG_SC33_HANDLEDOWN 2643
-#define QU_SC6_SHOWNEXTBALL 2689
-#define MV_MAN33_TAKETUBE 2718
-#define ANI_MUG_17 2737
-#define QU_SC3_EXITLIFT 2808
-#define MV_EGTR_MD2_JOY 2872
-#define QU_DRP3_DROP 2876
-#define QU_EGTR_MD2_BOLTLEGS 2879
-#define MV_MOM_TAKE5 2889
-#define PIC_SC4_BOTTLE2 2936
-#define ST_GRT1_GRIT 2964
-#define ST_HDLR_DOWN_GUM 3044
-#define SND_5_020 3161
-#define ST_RPE15_NORM 3257
-#define MV_DMS_FOUR 3322
-#define MSG_SC27_HANDLERTOBACK 3372
-#define QU_MAN_DEF_SHOES1_R 3392
-#define MV_GRFM_AFTER 3473
-#define MV_GRFU_OPENEYES 3474
-#define SND_11_008 3692
-#define SND_11_019 3703
-#define QU_SC13_SND1 3746
-#define SND_13_006 3751
-#define SND_14_005 3782
-#define QU_SC14_SND2 3784
-#define SND_16_003 3818
-#define QU_SC16_SND4 3824
-#define SND_16_014 3834
-#define SND_16_025 3845
-#define SND_16_036 3856
-#define SND_17_002 3861
-#define QU_SC17_SND5 3869
-#define SND_17_013 3877
-#define SND_17_024 3888
-#define SND_22_008 3991
-#define SND_CMN_038 4031
-#define QU_SC24_SND1 4036
-#define SND_24_006 4041
-#define SND_26_004 4080
-#define QU_SC26_SND3 4084
-#define SND_26_015 4096
-#define SND_28_002 4144
-#define QU_SC28_SND5 4152
-#define SND_28_013 4160
-#define MSG_SC28_TURNON_1 4278
-#define QU_SC32_TEST1 4297
-#define QU_CTS_DEFAULT 4302
-#define SND_29_001 4330
-#define SND_29_012 4346
-#define SND_32_009 4405
-#define QU_SC35_SND1 4499
-#define SND_35_006 4504
-#define SND_35_017 4515
-#define SND_3_011 3110
-#define MV_RHT_OPEN 2365
-#define MV_RNG_OPEN 4612
-#define PIC_MNU_LOAD_L 4628
-#define PIC_MSV_3_L 4662
-#define MV_BRD28_TALK 4680
-#define MV_BRDCMN_FLYAWAY 4736
-#define ST_SHD_CMN0 4861
+#define SC_10 653
+#define SC_11 654
+#define SC_12 655
+#define SC_13 1137
+#define SC_14 1138
+#define SC_15 1139
+#define SC_16 1140
+#define SC_17 1141
+#define SC_18 1142
+#define SC_19 1143
 #define SC_2 302
-#define QU_EGTR_SLIMSHOW 4883
-#define PIC_CSR_GOFAR_R 4896
-#define PIC_CSR_GOU 4899
-#define PIC_CSR_GOD 4900
-#define MV_KBK_GOR 4964
-#define rMV_KBK_GOR 4972
-#define SND_4_032 4989
-#define SND_3_022 4991
-#define SC_INTRO1 3896
-#define ST_FNHND1_NORM 5030
-#define SND_FIN_032 5107
-#define QU_IN2_DO 5144
-#define PIC_SCD_INTR 5163
 #define SC_20 1144
-#define MSG_SC11_SITSWINGER 5198
-#define MSG_SC20_UPDATELOCKABLE 5217
-#define ST_HZE_CUT2 5318
-#define PIC_MAP_A06 5268
-#define PIC_MAP_P08 5284
-#define ST_BTN32_ON 5350
-#define PIC_MLD_BGR 4645
-#define PIC_MAP_S05 5227
-#define PIC_MAP_S16 5238
-#define PIC_MAP_S27 5249
-#define PIC_MAP_S38 5262
-#define PIC_MAP_H33 5387
-#define PIC_MAP_H22 5376
-#define PIC_MAP_H11 5367
-#define PIC_SC4_LADDER 1438
-#define PIC_SC8_RTRUBA2 2978
-#define SC_32 2066
-#define SND_INTR_016 5161
-#define SND_INTR_005 5150
-#define SND_FIN_022 5094
-#define SND_FIN_011 5083
-#define QU_FN2_CYCLE 5067
-#define ST_FHND3_SHOT 5061
-#define ST_FNHND6_AFTER 5059
-#define ST_BHD_GOR 4940
-#define ANI_BIGHEAD 4938
-#define PIC_CSR_ARCADE2_D 4903
-#define SND_26_016 4878
-#define PIC_INV_APPLE_H 4599
-#define QU_SC29_BRDOUT2 4744
-#define MV_GLV_LOOKBOTTLE 4688
-#define MSG_SC11_MANCRY 4691
-#define ST_SCK26_NORM 4555
-#define QU_SC37_SND4 4544
-#define SND_37_005 4540
-#define SND_36_006 4530
-#define QU_SC36_SND3 4527
-#define SND_34_019 4479
-#define SND_34_008 4468
-#define QU_SC34_SND1 4461
-#define SND_33_009 4446
-#define SND_29_024 4358
-#define SND_28_014 4323
-#define MSG_SC34_FROMCACTUS 4313
-#define ST_VNT34_NORM 4309
-#define ST_TTA_GOD 4289
-#define MV_MAN25_TOTRUBA_R 4216
-#define SND_38_026 4193
-#define SND_38_015 4182
-#define QU_SC38_SND5 4170
-#define SND_38_004 4164
-#define SND_27_037 4138
-#define SND_27_026 4127
-#define SND_27_015 4116
-#define QU_SC27_SND5 4106
-#define SND_27_004 4100
-#define SND_25_017 4070
-#define SND_25_006 4059
-#define SND_23_008 4026
-#define QU_SC23_SND1 4019
-#define SND_19_012 3925
-#define SND_18_002 3897
-#define SND_14_017 3814
-#define QU_SC15_SND4 3806
-#define SND_15_005 3802
-#define SND_13_029 3774
-#define SND_13_018 3763
-#define SND_12_019 3739
-#define SND_12_008 3728
-#define QU_SC12_SND1 3721
-#define SND_6_031 3570
-#define SND_6_020 3559
-#define SND_5_021 3162
-#define SND_1_014 3527
-#define QU_GRFM_AFTER 3481
-#define MV_WMN28_GREET 3440
-#define SND_CMN_028 3410
-#define MV_MAN_SITDOWN 3378
-#define MV_VNT26_TURNR 1928
-#define SND_3_001 3100
-#define MV_GRL_FALL 3115
-#define QU_KZW14_JUMP 3271
-#define QU_KZW14_SHOW 3270
-#define QU_SC14_WINARCADE 3247
-#define MV_MAN14_KICKLAST 3218
-#define SND_4_022 3137
-#define SND_4_011 3126
-#define SND_2_013 3095
-#define SND_2_002 3084
-#define SND_CMN_006 3076
-#define SND_1_003 3067
-#define QU_STR_SHOW_L 3056
-#define MV_NTL_MOVE 3028
-#define MSG_SC10_LADDERTOBACK 3002
-#define QU_MOM4_OPENEYE 2959
-#define ST_MOM_LIFT2 2950
-#define MV_MOM_OPENEYE 2947
-#define ST_PMS_PLUS 2941
-#define MSG_SC6_STARTDROPS 2897
-#define MV_MAN_GOLADDER2 2844
-#define QU_SC30_EXITLIFT 2824
-#define ST_LBN_7H 2803
-#define MV_LBN_6H 2800
-#define LIFTBTN_2 2782
-#define ST_PTI25_NORM 2675
-#define ANI_POTTIE_25 2673
-#define QU_SC35_EATHOZE 2540
-#define MSG_SC22_HIDESTOOL 2503
-#define MSG_SPINHANDLE 2398
-#define MV_MAN34_STANDBOX 2386
-#define MSG_SC30_UPDATEPATH 2358
-#define QU_LEG_MOVE1 2349
-#define ST_LEG_DOWN3 2337
-#define MV_LEG_POTS_HIDE 2336
-#define MV_MAN32_STANDUP 2313
-#define MV_DLD_TAKE 2249
-#define PIC_SC28_DTRUBA 2074
-#define MV_BTA_NORM 2027
-#define MV_MID_0_1 2025
-#define QU_SC26_CLOSE4 1942
-#define rMV_MAN25_STOPROW 1890
-#define ST_MAN25_ONBOARD 1879
-#define MV_LUK26_0_1 1868
-#define MSG_SC25_ENTERMAN 1861
-#define LadderUp 1850
-#define ST_WTR24_FLOWLOWER 1843
-#define QU_WTR24_FLOW 1840
-#define ANI_WATER24 1834
-#define ST_HDL22_LIES 1762
-#define MV_MAN22_TAKETABUR 1749
-#define PIC_SC21_LTRUBA 1553
-#define MV_KSL_SWINGMAN 1502
-#define MV_KSL_INGIRL 1493
-#define ST_GRL18_WALKTO 1489
-#define ST_KSL_GIRL 1465
-#define ST_KSL_NORM 1461
-#define ST_BOY_EMPTY 1330
-#define ANI_GIRL 1328
-#define QU_SC19_ENTER_DOWN 1303
-#define MV_INV_FIRECAN_default 1313
-#define ANI_INV_FIRECAN 1312
-#define QU_SC18_ENTER_LEFT 1304
-#define QU_GRD2_LOOKRIGHT 1290
-#define MV_MAN15_TAKEBOOT 1272
-#define QU_SWR_SIT 1149
-#define ST_KCH_0 1096
-#define QU_SLN_POT_PLAY 1045
-#define MV_OTM_0_2 437
-#define ST_INV_POT_default 988
-#define MSG_SC9_SETSCROLL 964
-#define ANI_BALL9 933
-#define ANI_GLOTATEL 924
-#define QU_SC9_ENTER_DOWN 908
-#define MV_INV_OLDBOOT_default 397
-#define ST_INV_OLDCOIN_default 391
-#define MV_INV_BOX_default 633
-#define MV_SLN_BOOT_MORG 831
-#define MV_VMT_DEF 765
-#define MV_BTT_DRINK 749
-#define PIC_SCD_5 731
-#define MV_CST_TURNUP 718
-#define ANI_BEARDED 691
-#define MV_HND_TAKE1 605
-#define ST_KZW_JUMPOUT 587
-#define QU_SC4_MANLOOKDOWN 548
-#define QU_EGTR_SORROWTOFAT 531
-#define QU_SC1_EGBRKACH 512
-#define PIC_dsf 410
-#define ST_EGTR_FAT 344
-#define ANI_EGGEATER 334
-#define MV_DYAS_OPENBOX 307
-#define MV_MANDYAS_GIVESAPPL 360
-#define MV_OTM_VNT_TRIESOFF 435
-#define MV_MANEGBR_EGG2COIN 441
-#define ST_KZW_EMPTY 498
-#define QU_PNK_CLICK 550
-#define MV_KZW_TOEDGE 572
-#define QU_OTM_BOX_TURNL 645
-#define QU_OTM_VNT_BOLTHEAD 647
-#define ST_MAN_BALL 675
-#define rMV_MAN_FROMHORTRUBA 703
-#define QU_BTT_MORG 762
-#define ST_VMT_MAX 767
-#define MV_CST_0_2 800
-#define ST_INV_OLDHAMMER_default 401
-#define ANI_GUM 978
-#define MSG_SC6_SPINHANDLE 1013
-#define rMV_MAN_STARTR 330
-#define ANI_INV_GUM 1154
-#define QU_SC5_MANFLY 1168
-#define ST_HDLL_UP 1211
-#define ANI_GRANDMA 1227
-#define MV_GMA_BACKOFF 1233
-#define PIC_SC16_LTRUBA 1292
-#define ANI_MUG 1296
-#define PIC_SCD_17 1305
-#define PIC_SC17_RTRUBA 1323
-#define ANI_INV_MUG 1370
-#define PIC_SC17_TUMBA 1426
-#define MV_MAN17_PUTBOTTLE 1428
-#define MSG_SC17_SHOWBOTTLE 1432
-#define PIC_SC18_LADDER2 1472
-#define MV_KSL_2_3 1506
-#define QU_DYS_CLOSEBOX 1003
-#define QU_CDI_HIDE 1537
-#define QU_CDI_HIDEEMPTY 1545
-#define PIC_INV_EGGBOOT 1579
-#define MV_GFA_CHESH 1603
-#define QU_GFA_SWING 1614
-#define QU_GFA_STOP 1616
-#define MV_GRFU_TURN_DU 1649
-#define MV_GRFU_TURN_UD 1654
-#define MV_DYAS_0_1 1692
-#define MV_MAN22_TAKESOCK 1697
-#define ST_CND_6 1715
-#define MV_CND_6_7 1716
-#define MV_CLN_0_1 1770
-#define MV_MAN_TOTRUBAVER2_R 1848
-#define MV_MAN25_TRY 1877
-#define ST_LUK23_WHANDLE 1975
-#define MV_GRFM_NECK 1985
-#define MV_MAN27_SWABTOBROOM 1991
-#define PIC_SCD_28 2098
-#define MV_STR1_LEAVE 2114
-#define ST_ASS_NORM 2122
-#define ST_DMN38_NORM2 2205
-#define QU_MLS_TURNR 2221
-#define MV_GLV_PROPOSE_NOHMR 2279
-#define QU_FFT_TUBE_START 2303
-#define QU_LEG_HIDE1 2371
-#define PIC_SC35_MONETOPR 2408
-#define MV_PDV_BLINKLARGE 2422
-#define MV_PDV_PUZO 2423
-#define ST_GMA20_STAND 2436
-#define QU_GMA20_STD_LOOK 2451
-#define ST_CTS_GROWDOWN 2468
-#define PIC_INV_STOPPER 2531
-#define PIC_SC35_DTRUBA_R 2559
-#define QU_SC34_ENTER_UP 2569
-#define MV_GRD37_PULL 2589
-#define ST_MUG33_EMPTY 2625
-#define MV_JTI33_FLOW 2628
-#define ANI_TESTO_GREEN 2662
-#define MV_MAN9_TAKEPOT 2697
-#define MV_MUG17_FILL 2745
-#define QU_SC34_TOTRUBAVER 2853
-#define MSG_SC4_STARTCLOCK 2856
-#define MV_EGTR_MD1_BOLTLEGS 2864
-#define ANI_DROP_3 2873
-#define ST_MOM_STANDCLOSED 2890
-#define ST_PL3_NORM 2926
-#define MV_MAN13_THROWAPPLE 1444
-#define MV_VSN_FROMRIGHT 2996
-#define MV_MAN11_HITBY 3016
-#define QU_SC10_TAKEGUM 3026
-#define MV_HDLR_RISE_GUM 3045
-#define SND_5_010 3151
-#define SND_CMN_017 3164
-#define MV_STR_DENY 3208
-#define MV_DRP26_DROP 3346
-#define QU_MAN_DEF_SHOES2_R 3401
-#define ANI_DROP_24 3505
-#define SND_11_009 3693
-#define QU_SC13_SND2 3747
-#define SND_13_007 3752
-#define QU_SC14_SND3 3785
-#define SND_14_006 3788
-#define SND_16_004 3819
-#define QU_SC16_SND5 3825
-#define SND_16_015 3835
-#define SND_16_026 3846
-#define SND_16_037 3857
-#define SND_17_003 3862
-#define SND_17_014 3878
-#define SND_17_025 3889
-#define SND_22_009 3992
-#define SND_CMN_039 4032
-#define QU_SC24_SND2 4037
-#define SND_24_007 4042
-#define SND_26_005 4081
-#define QU_SC26_SND4 4085
-#define SND_28_003 4145
-#define MV_SHD01_SHD 4203
-#define MV_BOT1_NORM 4232
-#define MSG_SC28_TURNON_2 4276
-#define MSG_SC28_TURNON4 4280
-#define QU_CTS34_FALLEFT 4316
-#define SND_29_002 4331
-#define SND_29_013 4347
-#define QU_SC35_SND2 4500
-#define SND_35_007 4505
-#define SND_35_018 4516
-#define SND_3_012 3111
-#define PIC_MSV_EMPTY_D 4639
-#define PIC_MSV_4_L 4663
-#define PIC_MSV_DOTS_D 4670
-#define QU_BRD28_TALK 4682
-#define MSG_SC14_SCROLLLEFT 4768
-#define ANI_BOOT_15 4779
-#define ANI_SHD_CMN 4859
-#define ST_SHD_CMN1 4862
-#define SC_3 303
-#define ANI_KUBIK 4963
-#define QU_KBK33_GO 4978
-#define SND_4_033 4990
-#define SC_INTRO2 3907
-#define PIC_FN1_RTRUBA 5003
-#define MSG_INTR_SWITCHTO1 5145
-#define SC_10 653
 #define SC_21 1546
-#define SND_25_028 5173
-#define SND_3_023 5195
-#define MSG_SC19_UPDATENUMRIDES 5203
-#define PIC_MAP_A07 5269
-#define PIC_MAP_P09 5285
-#define PIC_MAP_S06 5228
-#define PIC_MAP_S17 5239
-#define PIC_MAP_S28 5250
-#define PIC_MAP_H34 5388
-#define PIC_MAP_H23 5377
-#define PIC_MAP_H12 5368
-#define PIC_MAP_H01 5357
-#define QU_SC28_LIFT6_END 3563
-#define SND_26_017 5337
-#define SND_3_024 5333
-#define MV_MOM_TOLIFT 2893
-#define MV_MOM_JUMPBK 662
-#define MSG_LIFT_EXITLIFT 5187
-#define SC_4 304
-#define SC_33 2067
-#define SND_INTR_017 5162
-#define SND_INTR_006 5151
-#define MSG_INTR_ENDINTRO 5139
-#define QU_INTR_FINISH 5138
-#define MSG_INTR_SWITCHTO2 5134
-#define MV_IN1CLK_CYCLE 5130
-#define MV_IN1MAN_SLEEP 5111
-#define SND_FIN_012 5084
-#define ST_FNHND4_BEFORE 5050
-#define MV_FNHND3_SHOWHMR 5040
-#define PIC_MNU_SLIDER_L 4912
-#define PIC_INV_SUGAR_C 4853
-#define PIC_INV_POTTIE_C 4849
-#define PIC_INV_MUG_C 4845
-#define PIC_INV_GUM_C 4840
-#define PIC_INV_BOTTLEFULL_C 4827
-#define PIC_INV_LOPAT_H 4808
-#define PIC_INV_BOX_H 4791
-#define MSG_CMN_WINARCADE 4778
-#define SND_15_006 3808
-#define SND_29_025 4689
-#define MV_RNG_CLOSE 2605
-#define MV_INV_CARPET_default 4597
-#define MV_DRV_PUSHBUTTON_NOVENT 4577
-#define SND_37_006 4546
-#define QU_SC37_SND5 4545
-#define SND_36_007 4531
-#define QU_SC36_SND4 4528
-#define SND_34_009 4469
-#define QU_SC34_SND2 4462
-#define SND_28_015 4324
-#define MV_LEG_DENY_POT1 4284
-#define MV_MAN28_STARTWASH 4248
-#define SND_38_027 4194
-#define SND_38_016 4183
-#define SND_38_005 4165
-#define SND_27_038 4139
-#define SND_27_027 4128
-#define SND_27_016 4117
-#define SND_27_005 4101
-#define SND_25_018 4071
-#define SND_25_007 4060
-#define QU_SC25_SND4 4057
-#define SND_23_009 4027
-#define QU_SC23_SND2 4020
-#define SND_19_013 3926
-#define SND_19_002 3910
-#define SND_18_003 3898
-#define SND_14_018 3815
-#define QU_SC15_SND5 3807
-#define SND_13_019 3764
-#define SND_12_009 3729
-#define QU_SC12_SND2 3722
-#define SND_7_020 3600
-#define SND_6_032 3571
-#define SND_6_010 3547
-#define SND_1_015 3528
-#define SND_3_013 3519
-#define QU_DRP25_TOWATER 3504
-#define ANI_DROP_25 3499
-#define MV_MID_0_2 3491
-#define SND_CMN_029 3469
-#define MV_WMN_AFTER 3454
-#define ST_WMN28_NORM 3441
-#define PIC_SC27_FLOOR2 3353
-#define ST_BTH_EMPTY 3351
-#define MV_MAN22_HANDLEDOWN2 3328
-#define SND_4_001 3116
-#define SND_1_004 3068
-#define QU_TEST1 3303
-#define ANI_BOOT_16 3285
-#define MV_GRL_DRYG 3279
-#define ST_KZW14_SIDE 3266
-#define PIC_SC14_GRID 3260
-#define MV_BAL14_NORM2 3213
-#define SND_4_023 3141
-#define SND_4_012 3127
-#define SND_3_002 3101
-#define SND_2_014 3096
-#define SND_2_003 3085
-#define SND_CMN_007 3077
-#define MV_MOM_STARTBK 3010
-#define MV_CLK8_GO 2990
-#define QU_MOM4_LOOKBAG 2958
-#define MV_MOM4_OPENEYE 2957
-#define MV_MOM_LIFTUP 2951
-#define MV_MAN4_FALLBOTTLE 2848
-#define MV_MAN_STARTLADDER2 2842
-#define QU_SC30_ENTERLIFT 2823
-#define QU_SC15_EXITLIFT 2812
-#define ST_LBN_6H 2801
-#define MV_LBN_5H 2798
-#define LIFTBTN_3 2783
-#define QU_SC14_BREAKGRIT 2728
-#define QU_SC32_FLOWO 2666
-#define QU_SC21_ENTER_DOWN 2646
-#define ST_HDL_PLUGGED 2397
-#define MV_FLG_STARTR 2263
-#define QU_LEG_MOVE2 2350
-#define QU_LEG_SHOW 2346
-#define MSG_SC32_TRYSIT 2294
-#define ST_DMN38_NORM3 2251
-#define ST_MAN29_SITR 2141
-#define ST_SHR_NORM 2132
-#define MSG_SC29_DISABLEPORTER 2097
-#define MSG_SC27_STARTBET 2047
-#define QU_SC26_CLOSE5 1944
-#define QU_SC27_ENTER_LEFT 1915
-#define QU_SC25_ROWTOTRUBA 1897
-#define rMV_MAN25_ROW 1891
-#define MV_MAN25_TRYBROOM 1887
-#define ST_INV_BOARD_default 1874
-#define MV_INV_BOARD_default 1873
-#define ANI_WATER25 1856
-#define PIC_SC25_RTRUBA 1853
-#define MSG_SC21_HANDLEDOWN 1807
-#define ANI_HANDLE22 1759
-#define ST_BOX2_LEFT 1694
-#define ST_GRFU_DOWN 1650
-#define QU_GRFB_TRYSTAND 1641
-#define MV_MAN18_FROMRTRUBA 1519
-#define ST_KSL_JUMPGIRL 1494
-#define ST_KSL_JUMPBOY 1492
-#define MV_GRL18_JUMPFROM 1485
-#define ST_BOY_FLYTO 1483
-#define QU_SMG_TAKESUGAR 1434
-#define PIC_INV_SUGAR 1413
-#define QU_SC16_GIRLLAUGH 1375
-#define MV_GRL_GOIN 1335
-#define MSG_SC11_SHOWSWING 1124
-#define ST_KCH_STATIC 1122
-#define QU_SC11_ENTER_LEFT 1093
-#define QU_SC10_ENTER_RIGHT 990
-#define QU_NDV_BLOW 969
-#define ST_GLT_SIT 926
-#define PIC_SC9_WALL1 923
-#define MSG_SC5_HANDLEDOWN 916
-#define ANI_INV_DOMINO 872
-#define ST_INV_BOOT_default 883
-#define ST_INV_GLASSES_default 889
-#define ANI_INV_GLASSES 887
-#define MV_SLN_POT_MOVE 842
-#define ST_SLN_POT_TURNED 838
-#define MSG_SC7_OPENLUKE 823
-#define MV_SC7_BOX_default 792
-#define MSG_SC6_SHOWNEXTBALL 790
-#define PIC_SCD_6 732
-#define PIC_SC1_RTRUBA 698
-#define MV_MAN_PUTCOIN 688
-#define MV_HND_TAKE2 606
-#define QU_EGTR_FATOBL 532
-#define ST_MAN_LADDERDOWN 521
-#define MV_MAN_TURN_DU 484
-#define MV_MAN_TURN_UD 483
-#define MV_MAN_GOLADDER 451
-#define MV_MANEGBR_EGG2BOOT 440
-#define ANI_OTMOROZ 419
-#define ST_EGTR_SLIMSORROW 340
-#define MV_MANDYAS_GIVESHMR 359
-#define MV_OTM_GLS_MORGRIGHT 425
-#define MV_OTM_BOX_DECLINES 432
-#define MV_MAN_LOOKPLANKRV 522
-#define ST_HND_TAKEN 608
-#define QU_OTM_GLS_TURNR 639
-#define ST_MOM_SITS 659
-#define MV_MAN_SHOOTBALL 676
-#define QU_CST_TURNUP 723
-#define MV_MAN8_FIRSTJUMP 778
-#define QU_SC8_ENTER_RIGHT 780
-#define ST_CST_HANDLELESS 794
-#define QU_CST_CLOSELUKE 820
-#define ST_INV_OLDDOMINO_default 369
-#define MV_BALL9_EXPLODE 939
-#define MV_NDV_DENIES 952
-#define MV_GRD_PULL 999
-#define QU_SC2_ENTER_DOWN 1025
-#define MV_SC4_BOOT_default 1036
-#define MV_MAN_TURN_SRD 1082
-#define MV_MAN_TURN_SRU 1083
-#define rMV_MAN_TURN_SRL 1090
-#define MSG_STANDLADDER 1092
-#define MV_MAN_STARTD 478
-#define MV_MAN_STARTU 333
-#define ST_MAN11_SWING 1127
-#define MV_MAN5_FALLBUMP 1163
-#define MV_STR_PLUU 1178
-#define ST_STR_EMPTY 1180
-#define QU_STR_CHEW 1190
-#define MV_MAN_FALLPOPA 1193
-#define MV_GRD2_MORG 1282
-#define PIC_SCD_18 1306
-#define ST_HDLL_FIRECAN 1310
-#define QU_SC14_ENDARCADE 1391
-#define MV_INV_BOTTLE_default 1419
-#define MV_INV_BOTTLEFULL_default 1422
-#define ANI_HAND17 1446
-#define MV_MANEGTR_GIVESCOIN 1581
-#define ANI_GIRAFFEE 1672
-#define ST_CND_7 1717
-#define ANI_CLEANERS 1767
-#define ANI_INV_BROOM 1774
-#define MV_INV_STOOL_default 1781
-#define MV_MAN25_BOARDTOLADDER 1893
-#define QU_SC25_SHOWBOARD_R 1901
-#define QU_SC25_SHOWBOARD_LCLOSE 1908
-#define QU_SC25_BOARDTOLADDER 1911
-#define QU_SC26_AUTOCLOSE1 1949
-#define MSG_SC26_TESTVENT 1952
-#define PIC_SCD_29 2099
-#define rMV_ASS_TAIL 2128
-#define ST_GLV_SLEEP2 2166
-#define MV_DLD_ICK 2172
-#define MV_DLD_GLOT 2177
-#define MV_MLS_BLINK 2182
-#define MV_MAN38_TAKEMUG 2185
-#define ST_MUG38_NORM 2193
-#define MV_FFT_TUBE_DENY 2233
-#define PIC_SC32_KADKA 2273
-#define QU_FFT_PIPE_STOP 2298
-#define QU_FFT_TUBE_OPENEYE 2305
-#define MV_INV_TUBE_default 2315
-#define QU_LEG_HIDE2 2372
-#define QU_CTS_GROW 2416
-#define MV_GMA20_STL_LOOK 2434
-#define QU_GMA20_STD_LOOKTRUBA 2452
-#define MV_CTS_STOPDOWN 2471
-#define ST_STL34_NORM 2488
-#define ST_INV_SCISSORS_default 2534
-#define QU_PDV_SML_TRY 2554
-#define MV_GRD37_BLINK1 2592
-#define MV_MAN33_TAKEMUG 2622
-#define MV_SCR36_NORM 2648
-#define MV_TSTO_FLOW 2657
-#define MV_MAN6_THROWBALL 2692
-#define MV_MAN32_BUMP 2713
-#define MSG_LIFT_CLICKBUTTON 2780
-#define QU_SC34_ENTER_LIFTDOWN 2822
-#define QU_EGTR_MD1_OBL 2878
-#define MV_MAN3_GIVEEGG_1 2907
-#define PIC_SC6_PIPEY 2954
-#define ST_BALL9_EMPTY2 2974
-#define SND_5_011 3152
-#define SND_5_022 3163
-#define SND_CMN_018 3165
-#define QU_SC38_SHOWDOMINO2 3181
-#define MV_BTT_LOOK 3193
-#define MSG_SC14_ENDARCADE 3250
-#define PIC_SC18_LADDER3 3299
-#define MSG_SC13_OPENFAST 1266
-#define MV_MAN26_TRY 3344
-#define QU_DRP26_DROP 3352
-#define ST_VNT26_RIGHT 1930
-#define rMV_MAN_SITDOWN 3391
-#define QU_SC25_MANLOOKDOWN 3417
-#define QU_SC9_SND1 3645
-#define QU_SC11_SND1 3685
-#define QU_SC13_SND3 3748
-#define SND_13_008 3753
-#define QU_SC14_SND4 3786
-#define SND_14_007 3789
-#define SND_16_005 3820
-#define SND_16_016 3836
-#define SND_16_027 3847
-#define SND_16_038 3858
-#define SND_17_004 3863
-#define SND_17_015 3879
-#define SND_17_026 3890
-#define QU_SC22_SND1 3984
-#define QU_SC24_SND3 4038
-#define SND_24_008 4043
-#define QU_SC26_SND5 4086
-#define SND_26_006 4087
-#define SND_28_004 4146
-#define ANI_BOOT_1 4231
-#define QU_SC28_FALLGRIT 4265
-#define MSG_SC28_TURNON_3 4274
-#define SND_29_003 4332
-#define QU_SC33_SND1 4438
-#define QU_SC35_SND3 4501
-#define SND_35_008 4506
-#define SND_35_019 4517
-#define MV_RHT_DENY 2561
-#define PIC_MNU_SAVE_D 4629
-#define PIC_MSV_5_L 4664
-#define ST_BRD28_RIGHT 4681
-#define SND_29_014 4348
-#define MSG_SC29_LAUGH 4760
-#define MSG_SC14_RESTORESCROLL 4769
-#define ST_RNG_CLOSED2 4865
-#define MV_LFT_FROMU 4881
-#define MV_LFT_FROMD 4882
-#define QU_GLV28_GOR 4957
-#define QU_KBK32_GO 4977
-#define SC_11 654
 #define SC_22 1547
-#define SND_25_029 5174
-#define PIC_MNU_MUSICSLIDER_D 4914
-#define rMV_MAN_LOOKUP_EYES 5207
-#define PIC_SC1_PRIMUS 837
-#define PIC_MAP_A08 5270
-#define PIC_INV_MAP_H 5325
-#define PIC_IN1_GAMETITLE 5169
-#define PIC_MAP_S07 5229
-#define PIC_MAP_S1819 5240
-#define PIC_MAP_S29 5251
-#define PIC_MAP_H35 5389
-#define PIC_MAP_H24 5378
-#define PIC_MAP_H13 5369
-#define PIC_MAP_H02 5358
-#define SND_26_018 5340
-#define SND_16_039 5336
-#define PIC_SC20_DTRUBA 3741
-#define SC_5 305
-#define SC_34 2068
-#define SND_INTR_007 5152
-#define SND_FIN_013 5085
-#define MV_FNHND5_SHOW 5053
-#define PIC_SC35_UTRUBA_R 4987
-#define MSG_SC30_TESTFLIES 4962
-#define QU_BRD16_GOL 4952
-#define QU_BRD17_TURNL 4950
-#define rMV_BRDCMN_TURN_RL 4947
-#define PIC_CSR_ARCADE1 4901
-#define PIC_INV_MUGFULL_H 4811
-#define PIC_INV_HANDLE_H 4806
-#define PIC_INV_DOMINO_H 4795
-#define PIC_INV_CARPET_H 4793
-#define MV_DRP25_TOFLOOR 3500
-#define MV_TBL_WALKL 4700
-#define SND_29_026 4690
-#define MV_MAN35_TAKECARPET 4595
-#define MV_BTN27_NORM 4580
-#define SND_37_007 4547
-#define SND_36_008 4532
-#define QU_SC36_SND5 4529
-#define QU_SC34_SND3 4463
-#define SND_28_016 4325
-#define MSG_SC34_ONCACTUS 2482
-#define MV_CTS_DEFAULT 4299
-#define QU_SC28_TIOTIA 4294
-#define MV_LEG_DENY_POT2 4285
-#define SND_38_028 4195
-#define SND_38_017 4184
-#define QU_SC38_DOMINOKICK 4181
-#define SND_38_006 4171
-#define SND_27_039 4140
-#define SND_27_028 4129
-#define SND_27_017 4118
-#define SND_27_006 4107
-#define SND_25_019 4072
-#define SND_25_008 4061
-#define QU_SC25_SND5 4058
-#define QU_SC23_SND3 4021
-#define QU_SC21_SND1 3955
-#define SND_19_014 3927
-#define SND_19_003 3911
-#define SND_18_004 3899
-#define SND_15_007 3809
-#define SND_13_009 3754
-#define QU_SC12_SND3 3723
-#define QU_SC10_SND1 3667
-#define QU_SC8_SND1 3635
-#define SND_7_021 3601
-#define SND_7_010 3590
-#define SND_6_033 3572
-#define SND_6_022 3561
-#define SND_6_011 3548
-#define SND_5_023 3532
-#define SND_3_014 3521
-#define ST_WMN28_READY 3442
-#define MV_MAN21_TAKEBROOM 3438
-#define MV_CLN_DENY_BROOM 3437
-#define MV_BRD_FALLTHREAD 3421
-#define MV_BTH_1_0 3366
-#define ST_VNT26_RIGHT2 3348
-#define ST_CDI_EYE 3310
-#define SND_5_001 3142
-#define QU_TEST2 3304
-#define MV_GRL_LAUGH_POPA 3278
-#define QU_STR_THROWGLASSES 3201
-#define SND_4_013 3128
-#define SND_3_003 3102
-#define SND_2_015 3097
-#define SND_2_004 3086
-#define SND_CMN_008 3078
-#define SND_1_005 3069
-#define MSG_SC13_TESTCLOSE 3065
-#define ST_NTL_NORM 3029
-#define ANI_STEP_8 2971
-#define MV_CST_DENY 2967
-#define ST_MOM4_SIT 2956
-#define MV_MOM4_LOOKBAG 686
-#define MV_PMS_CHANGE 2939
-#define ST_FCN17_NORM 2862
-#define QU_SC30_ENTER_LIFTDOWN 2826
-#define ST_LBN_5H 2799
-#define MV_LBN_4H 2796
-#define LIFTBTN_4 2784
-#define QU_SC34_ENTER_DEBUG 2380
-#define QU_LEG_MOVE3 2351
-#define MV_MAN30_PUT1 2340
-#define MV_MAN30_PUT1_EMPTY 2339
-#define ST_DMN38_NORM4 2253
-#define QU_GLV_TAKEDOMINO 2170
-#define ANI_SHELL_GREEN 2116
-#define MV_MAN29_JUMP 2090
-#define QU_DRV_LOOKLEFT 2032
-#define MV_DRV_FROMRIGHT 2014
-#define MV_DRV_FROMLEFT_V 2011
-#define MV_DRV_DRIVE 2004
-#define MV_DRV_TOCYCLE 1995
-#define ST_LUK26_OPEN 1973
-#define MV_LUK26_1_2 1972
-#define QU_SC25_BACKTOLADDER 1955
-#define ST_BRD25_RIGHT2 1902
-#define PIC_SC21_MONETOPR 1808
-#define MV_BOX2_FLIP 1693
-#define rMV_MANEGBR_EGG2COIN 467
-#define ST_KSL_MAN 1503
-#define MSG_SC18_SHOWGIRLJUMPTO 1499
-#define ST_BOY18_FLYFROM 1479
-#define MV_KSL_CALMDOWN 1476
-#define ST_KSL_REACT 1474
-#define ANI_KRESLO 1459
-#define MV_MAN_HMRKICK_COINLESS 1445
-#define MV_SMG_HANDSUP 1402
-#define ST_WHR13_SPIN 1385
-#define PIC_SCD_19 1319
-#define MV_GRD2_MORG1 1283
-#define QU_SC13_SHOWGUM 1216
-#define MV_MAN13_GIVEGUM 1192
-#define MV_MAN_STARTLADDERD 457
-#define QU_SC3_ENTER_LIFTDOWN 1059
-#define MV_SLN_POT_PLAY 1046
-#define ST_SC2_BOX_default 1022
-#define MV_MAN10_TAKEGUM 967
-#define MV_GLT_FLYAWAY 931
-#define MV_GLT_CLOSE 929
-#define MV_INV_APPLE_default 879
-#define MV_INV_HANDLE_default 894
-#define ANI_INV_OLDAPPLE 392
-#define MV_SLN_POT_MORG2 840
-#define QU_MOM_MORG 826
-#define MV_MAN8_BADLUCK 783
-#define PIC_SCD_7 733
-#define QU_MOM_JUMPBK 671
-#define MV_MANHDL_HANDLEDOWN 630
-#define QU_SC4_MANTOLADDER 617
-#define MSG_TAKEKOZAW 611
-#define MV_MAN_LOOKLADDER 520
-#define QU_SC1_EGBRHEADUP 511
-#define MV_PNK_WEIGHTRIGHT 502
-#define rMV_EGBR_RAISEHEAD 463
-#define ST_MAN_STANDLADDER 453
-#define MV_MANEGTR_GIVESEGGF 416
-#define PIC_SC3_LTRUBA 413
-#define ST_EGTR_FATSORROW 355
-#define ANI_DADAYASHIK 306
-#define MV_MANEGTR_TAKESCOIN 394
-#define PIC_SC4_RTRUBA 507
-#define QU_KZW_GOEDGE1 571
-#define QU_SC4_HANDPUSH 596
-#define MSG_SC6_BEARDEDTAKEBALL 683
-#define QU_CST_SPINHANDLE 722
-#define QU_SCD_ENTER 735
-#define MV_MAN8_JUMP 775
-#define MV_MAN_HANDSUP 776
-#define ANI_HOOLIGAN 808
-#define QU_HGN_OPENLUKE 824
-#define MV_INV_OLDEGG_default 365
-#define ST_PBAR_START 898
-#define QU_SC9_BALLEXPLODE 938
-#define MV_NDV_MORG 947
-#define PIC_SC07_PANEL 1002
-#define MV_MAN_TAKEHANDLE 1040
-#define ST_POT_NORM 1047
-#define MV_MAN_STOPR 328
-#define MV_KCH_MOVE2 1099
-#define QU_SC11_RESTARTMAN 1134
-#define MV_MAN11_GUM2VANTUZ 1145
-#define ST_INV_GUM_default 1156
-#define ST_INV_VANTUZ_default 1159
-#define MV_STR_SHOW 1179
-#define MSG_SC14_SHOWBALLGMAHIT 1259
-#define PIC_SC15_DTRUBA 1263
-#define PIC_SC15_UTRUBA 1264
-#define MV_MAN13_HANDLEUP 1377
-#define ST_BDG_OPEN2 1381
-#define PIC_SC1_KUCHKA 1321
-#define ANI_INV_EGGAPL 1564
-#define ST_INV_EGGBOOT_default 1572
-#define ANI_INV_EGGGLS 1573
-#define MSG_SC3_TAKEEGG 1583
-#define MV_CND_7_8 1718
-#define ST_CND_8 1719
-#define PIC_SC23_BOXCLOSED 1728
-#define PIC_SC23_BTN1 1729
-#define MV_MAN21_INSERTHANDLE 1744
-#define ST_INV_STOOL_default 1782
-#define QU_SC25_ENTERUP_FLOOR 1904
-#define ANI_INV_LOPAT 1920
-#define QU_SC26_AUTOCLOSE2 1950
-#define ANI_HANDLE23 1978
-#define MV_GRFM_PODMYSHA 1984
-#define ANI_ASS 2120
-#define MSG_SC29_SHOOTRED 2137
-#define MV_SHR_HITMAN 2149
-#define ANI_MALYSH 2165
-#define ANI_HAMMER38 2194
-#define ST_HMR38_NORM 2196
-#define MV_DMN38_NORM 2201
-#define MSG_SC38_HMRKICK 2224
-#define ST_FFT_PIPEFLOW 2241
-#define QU_FFT_PIPE_FLOWOPEN 2307
-#define PIC_SC30_RTRUBA 2355
-#define ANI_GRANDMA_20 2427
-#define MV_GMA20_FLR_BLINK 2428
-#define MV_GMA20_STL_BLINK 2431
-#define QU_SC20_ENTER_RIGHT 2453
-#define MV_CTS31_GROWMAN 2457
-#define MV_PDV_CUT_BLINK 2527
-#define MV_INV_STOPPER_default 2536
-#define QU_PDV_SML_BLINK 2553
-#define QU_PDV_LRG_BLINK 2555
-#define QU_SC36_ENTER_LEFT 2564
-#define QU_GRD37_BLINK 2595
-#define QU_GRD37_LOOKL 2597
-#define QU_RHT_BLINK 2599
-#define MV_DMN01_default 2616
-#define ANI_VENT_33 2637
-#define MV_MAN33_HANDLEDOWN 2642
-#define MSG_SC33_POUR 2645
-#define ST_TSTB_NORM 2661
-#define ST_GRT6_NORM 679
-#define ST_BTS11_ONE 2706
-#define MV_TBE33_NORM 2716
-#define ST_JET17_EMPTY 2748
-#define QU_SC34_EXITLIFT 2820
-#define QU_EGTR_MD2_OBL 2880
-#define QU_MOM_TOLIFT 2902
-#define QU_MOM_PUTBALL 2903
-#define MV_MAN3_GIVEEGG_2 2908
-#define MV_INV_EGGBLACK_default 2919
-#define QU_VSN_TURNL 2997
-#define MV_MAN6_TRYHANDLE 3009
-#define MV_GUM_NORM 976
-#define ANI_PACHKA2 3008
-#define SND_4_002 3117
-#define SND_5_012 3153
-#define SND_CMN_019 3166
-#define MSG_SC3_HIDEDOMINO 3177
-#define MV_HDL_BREAK 3341
-#define ANI_DROP_26 3345
-#define QU_MAN_DEF_STARTSHOES1_R 3389
-#define MV_SWR_DENY 3428
-#define MV_MAN_CLEANNOSE 3374
-#define SND_4_024 3466
-#define MV_GRFM_0_1 3471
-#define QU_GRFU_CLOSEEYES 3479
-#define SND_8_020 3630
-#define QU_SC9_SND2 3646
-#define QU_SC11_SND2 3686
-#define QU_SC13_SND4 3749
-#define QU_SC14_SND5 3787
-#define SND_14_008 3790
-#define SND_16_006 3826
-#define SND_16_017 3837
-#define SND_16_028 3848
-#define SND_17_005 3864
-#define SND_17_016 3880
-#define SND_17_027 3891
-#define QU_SC22_SND2 3985
-#define QU_SC24_SND4 4039
-#define SND_24_009 4044
-#define SND_26_007 4088
-#define SND_28_005 4147
-#define MV_CLN_BLINK1 4208
-#define ANI_BOOT_17 4220
-#define SND_1_016 4234
-#define MSG_SC28_CLICKLIFT 4258
-#define MSG_SC28_TURNON_4 4281
-#define QU_MAN32_LOOKBACK 4304
-#define SND_29_004 4333
-#define SND_29_015 4349
-#define QU_SC32_SND1 4397
-#define QU_SC33_SND2 4439
-#define QU_SC35_SND4 4502
-#define SND_35_009 4507
-#define MV_GRT38_NORM 4574
-#define QU_SC38_SHOWGRIT 4576
-#define PIC_MNU_AUTHORS_D 4623
-#define PIC_MSV_6_L 4665
-#define MSG_SC28_MAKEFACES 4684
-#define ST_EYE_EMPTY 4714
-#define ST_KBK_GOR 4965
-#define MSG_SC37_EXITLEFT 5006
-#define SND_FIN_002 5008
-#define ST_FN4MAN_BEFORE 5099
-#define SC_12 655
 #define SC_23 1548
-#define PIC_IN1_NAKL 5132
-#define SND_INTR_018 5177
-#define MSG_SC5_BGRSOUNDON 5314
-#define QU_SC19_ENTER_RIGHT 5319
-#define PIC_MAP_A09 5271
-#define PIC_MAP_I01 5295
-#define MSG_SC33_UPDATEKUBIK 5346
-#define PIC_MAP_S08 5231
-#define PIC_MAP_H36 5390
-#define PIC_MAP_H25 5379
-#define PIC_MAP_H14 5370
-#define PIC_MAP_H03 5359
-#define MSG_SC28_LIFT6INSIDE 5354
-#define SND_26_019 5341
-#define QU_EGTR_FATASK 5334
-#define PIC_CSR_ITN_RED 5329
-#define PIC_SC33_ZONES 5298
-#define SND_INTR_019 5220
-#define QU_HND17_BACK 5216
-#define PIC_IN1_PIPETITLE 5167
-#define SC_6 649
-#define SC_35 2069
-#define SND_INTR_008 5153
-#define SND_FIN_014 5086
-#define MV_FNFNG_MOVE 5063
-#define ANI_FN3_FINGERS 5062
-#define MV_FNHND3_SHOOT 5060
-#define SND_37_008 5013
-#define PIC_SC17_LADDER2 2749
-#define QU_SC35_TRYFLY 4984
-#define MSG_SC33_TRYKUBIK 4980
-#define QU_BRD16_FLYR 4953
-#define QU_EGG6_GOR 4935
-#define ANI_FLY 4916
-#define PIC_CSR_ARCADE2 4902
-#define SC_COMMON 321
-#define PIC_INV_PIPE_C 4847
-#define PIC_INV_LEVERHANDLE_H 4807
-#define PIC_INV_BROOM_H 4792
-#define PIC_INV_BOTTLE_H 4789
-#define MSG_MNU_EXITMENU 4633
-#define ST_SCR36_LEFT 4609
-#define ST_INV_CARPET_default 4598
-#define MV_PDV_SML_DENY 4585
-#define MV_MAN26_KNOCKMUG 4559
-#define MV_MAN26_TAKESOCK 4558
-#define SND_36_009 4533
-#define QU_SC34_SND4 4464
-#define QU_SC31_SND1 4384
-#define SND_28_017 4326
-#define QU_SC34_FROMCACTUS 4312
-#define ST_VNT34_UP2 4310
-#define MV_MAN34_TURNVENT_L 4307
-#define QU_SC17_FILLBOOT 4237
-#define SND_38_029 4196
-#define SND_38_018 4185
-#define SND_38_007 4172
-#define SND_27_029 4130
-#define SND_27_018 4119
-#define SND_27_007 4108
-#define SND_25_009 4062
-#define QU_SC23_SND4 4022
-#define QU_SC21_SND2 3956
-#define SND_19_015 3928
-#define SND_19_004 3912
-#define SND_18_005 3900
-#define SND_15_008 3810
-#define QU_SC12_SND4 3724
-#define QU_SC10_SND2 3668
-#define QU_SC8_SND2 3636
-#define QU_SC7_SND1 3606
-#define SND_7_022 3602
-#define SND_7_011 3591
-#define SND_6_034 3573
-#define SND_6_012 3549
-#define SND_6_001 3538
-#define SND_5_024 3536
-#define SND_4_025 3529
-#define SND_3_015 3522
-#define rMV_MAN25_ROWHAND 3492
-#define QU_SC25_BEARDED 3425
-#define ST_MUG17_DROP 3413
-#define ST_MAN_RIGHT 325
-#define MV_VNT26_TURNU 1931
-#define MV_CLN_DENY 2290
-#define ST_KZW14_EMPTY 3263
-#define SND_4_014 3129
-#define SND_3_004 3103
-#define SND_2_016 3098
-#define SND_2_005 3087
-#define SND_CMN_009 3079
-#define SND_1_006 3070
-#define MSG_SC4_MANTOBOTTLE 2852
-#define ST_LBN_4H 2797
-#define MV_LBN_3H 2794
-#define LIFTBTN_5 2785
-#define QU_SC17_FILLMUG 2750
-#define QU_SC9_BREAKGRIT 2723
-#define PIC_SC32_KADKABACK 2669
-#define QU_SC15_ENTER_LEFT 2651
-#define MSG_SC34_LEAVEBOARD 2576
-#define MV_MAN34_BOARD_FROM 2549
-#define MV_MAN35_TAKESTOPPER 2512
-#define QU_LEG_MOVE4 2352
-#define MV_MAN30_PUT2 2342
-#define MV_MAN30_PUT2_EMPTY 2341
-#define MV_FLG_STOPR 2265
-#define QU_SC38_ENTER_UP 2227
-#define ST_MAN29_RUNR 2140
-#define PIC_SC28_RTRUBA 2073
-#define QU_DRV_FROMLEFT 2036
-#define PIC_SC27_LTRUBA 1914
-#define MV_BRM_FALL 1764
-#define ANI_BROOM 1763
-#define ST_MSH_SIT 1756
-#define ANI_TABURETTE 1745
-#define ST_INV_SOCK_default 1700
-#define QU_SC6_SHOWHANDLE 1689
-#define QU_GRFU_CHMOKUP 1670
-#define QU_GRFU_BLINKLEFT 1666
-#define rMV_MANEGBR_EGG2BOOT 466
-#define MV_CDI_0_1 1544
-#define ST_CDI_NOSUGAR 1542
-#define ST_CDI_EMPTY 1531
-#define MSG_SC18_MANREADY 1507
-#define MV_KSL_INMAN 1504
-#define MV_KSL_JUMPGIRL 1475
-#define MV_KSL_SWINGBOY 1462
-#define MV_SMG_HANDSDOWN 1405
-#define MV_SMG_THROW 1398
-#define ANI_JETTIE 1392
-#define ST_GRL_STAND 1337
-#define ANI_WHIRLIGIG_18 829
-#define PIC_INV_FIRECAN 1315
-#define PIC_SC14_DFLOOR 1241
-#define MSG_SC13_EATGUM 1219
-#define MV_MAN5_FALL 1165
-#define MV_KCH_START 1121
-#define MSG_SC1_UTRUBACLICK 1100
-#define ST_LFT_OPEN_NEW 1071
-#define PIC_INV_POT 985
-#define MSG_SC9_FLOWN 943
-#define GRID_TEST 937
-#define MV_GLT_OPEN 927
-#define ST_INV_APPLE_default 880
-#define MV_INV_OLDHANDLE_default 796
-#define ANI_INV_HANDLE 893
-#define PIC_SCD_8 756
-#define ST_BTT_SLEEPS 748
-#define ST_BTT_CHESHET 746
-#define PIC_SC7_RTRUBA 710
-#define ST_BRD_EMPTY 693
-#define PIC_SC6_LTRUBA 667
-#define MV_MANOTM_GLASSES2BOX 629
-#define MSG_GOTOLADDER 618
-#define ST_CLK_BUTTON 593
-#define ANI_CLOCK 588
-#define ST_MAN_DOWN 479
-#define MV_EGTR_FATEAT 350
-#define MV_EGTR_SLIM2SORROW 339
-#define MV_DYAS_TOUS 311
-#define MV_EGTR_FROMSLAPPING 349
-#define MSG_RAISEPLANK 547
-#define ST_KZW_BOTTLERIGHT 574
-#define QU_KZW_GOEDGE2 576
-#define MV_KZW_JUMPUS 582
-#define MV_HND_TAKEBOTTLE 607
-#define QU_OTM_BOX_SDVIG 646
-#define QU_MOM_SITDOWN 685
-#define MV_HGN_OPENLUKE 809
-#define PIC_INV_OLDHAMMER 405
-#define MV_INV_EGG_default 870
-#define QU_PLV_BREATHE 959
-#define QU_GRD_MORG1 1005
-#define ST_HDL_UP 624
-#define ST_SC4_COIN_default 1030
-#define MV_HDL6_FALL 1041
-#define ST_LFT_OPEN 1050
-#define QU_SC3_ENTER_LIFTUP 1062
-#define QU_SWR_JUMPDOWN 1123
-#define MSG_SC11_MANTOSWING 1128
-#define ST_KCH_EMPTY 1132
-#define MV_MAN5_VNT2BOX 1162
-#define ST_STR_LEFT 1175
-#define MV_STR_TURNR 1176
-#define ST_GMS_BOOT 1270
-#define QU_SC16_ENTER_DOWN 1295
-#define QU_KAR_SPIN 1307
-#define ST_MUG_EMPTY 1298
-#define ST_MUG_FULL 1360
-#define ST_INV_BOTTLE_default 1420
-#define QU_SC17_SHOWBOTTLE 1429
-#define MSG_SC4_CLICKLADDER 1439
-#define MSG_SC18_SHOWGIRLJUMP 1496
-#define MV_HND17_1_0 1558
-#define MV_INV_EGGGLS_default 1574
-#define MV_GFA_GREET 1593
-#define MV_GFA_GREETSOCK 1594
-#define QU_GFA_CHESHETSOCK 1609
-#define PIC_SC22_FLOOR 1621
-#define PIC_SC23_DTRUBA 1626
-#define MV_GRFU_CHMOKCYCLE 1658
-#define MV_GRFU_CHMOKLEFT 1660
-#define MV_GRFU_LOOKDOWN 1688
-#define QU_DYAS_OPENBOX_LIES 1691
-#define ST_CND_9 1721
-#define PIC_SC23_BTN2 1730
-#define MV_MAN21_HANDLEDOWN 1805
-#define rMV_MAN_TOTRUBAVER2 1833
-#define QU_SC26_AUTOCLOSE3 1951
-#define MV_CHI_MOTION 1962
-#define QU_CHI_MOVE 1963
-#define QU_CHI_HIDE 1965
-#define MV_LUK23_1_2i 1976
-#define ST_GRFM_NORM 1983
-#define MSG_SC27_CLICKBET 2048
-#define MV_BTA_HILITE 2051
-#define MV_ASS_SIT 2125
-#define rMV_ASS_SIT 2127
-#define MV_SHG_HITMAN 2147
-#define MV_GLV_DRINK 2162
-#define MV_DLD_DENY 2176
-#define MV_MAN38_PUTDOMIN 2187
-#define QU_SC38_SHOWBOTTLE 2199
-#define QU_GLV_TOSMALL 2208
-#define QU_MLS_HAND 2223
-#define MV_FFT_TUBE_FLOW 2234
-#define MV_FFT_PIPE_DENY 2245
-#define ST_DMN38_NORM5 2283
-#define MSG_SC32_STOPFLAG 2311
-#define QU_SC30_ENTER_RIGHT 2357
-#define QU_GMA20_STL_BLINK 2445
-#define QU_GMA20_FLR_BLINK 2448
-#define QU_GMA20_FLR_LOOK 2449
-#define ST_CTS_GROWUP 2467
-#define ANI_VENT_34 2473
-#define QU_SC34_SHOWBOX 2501
-#define ANI_BOARD_34 2506
-#define ANI_INV_SCISSORS 2532
-#define QU_PDV_LRG_TRY 2556
-#define MSG_SC34_TESTVENT 2557
-#define QU_SC36_ENTER_RIGHT 2563
-#define QU_GRD3_BLINK1 2585
-#define ANI_INV_MUGFULL 2633
-#define MV_TST31_FLOW 2653
-#define MV_STR_PLUUAPLE 2682
-#define rMV_MAN_TAKECOIN 2695
-#define ST_MUG17_FULL 2740
-#define QU_SC14_ENTERLIFT 1225
-#define MV_MAN_TOTRUBAHOR2 2839
-#define MSG_SC4_KOZAWFALL 2858
-#define MV_EGTR_MD1_OBL 2865
-#define MV_MAN3_GIVEEGG_3 2909
-#define MV_MAN3_TAKEEGG_2 2912
-#define PIC_INV_EGGBLACK 2921
-#define MV_DRP3_DROP2 2922
-#define MV_EGTR_FATDENY 2934
-#define ANI_GRIT1 2961
-#define QU_SC8_STANDUP 2975
-#define SND_4_003 3118
-#define SND_5_002 3143
-#define SND_5_013 3154
-#define PIC_SC15_LADDER 3253
-#define MV_CLN_BLINK2 3325
-#define QU_MAN_DEF_STARTSHOES2_R 3397
-#define MV_MAN17_GIVEHMR 3431
-#define MV_GFA_DENY 3435
-#define SND_8_010 3620
-#define SND_8_021 3631
-#define QU_SC9_SND3 3647
-#define QU_SC11_SND3 3687
-#define QU_SC13_SND5 3750
-#define SND_14_009 3791
-#define SND_16_007 3827
-#define SND_16_018 3838
-#define SND_16_029 3849
-#define SND_17_006 3870
-#define SND_17_017 3881
-#define SND_17_028 3892
-#define QU_SC20_SND1 3934
-#define QU_SC22_SND3 3986
-#define QU_SC24_SND5 4040
-#define SND_26_008 4089
-#define SND_28_006 4153
-#define QU_CLN_BLINK1 4209
-#define PIC_SC28_FRAME1 4262
-#define SND_29_005 4334
-#define SND_29_016 4350
-#define QU_SC32_SND2 4398
-#define QU_SC33_SND3 4440
-#define QU_SC35_SND5 4503
-#define SND_1_017 4548
-#define QU_SC34_SHOWBOX_FLOOR 4566
-#define QU_MID_CLEANVENT 4583
-#define PIC_MLD_OK_D 4646
-#define PIC_MSV_7_L 4666
-#define SND_29_027 4757
-#define MV_SHD_CMN 4860
-#define MSG_SC35_STOPFLOW 4864
-#define PIC_CSR_ITN_INV 4894
-#define QU_BRD28_GOL 4960
-#define MSG_SC28_TRYVTORPERS 4961
-#define MV_KBK_FROMTRUBA 4970
-#define SND_32_040 4998
-#define SND_FIN_003 5009
-#define MV_FNHND1_SCRUB 5029
-#define MV_FN4MAN_ENTER 5098
-#define SC_13 1137
 #define SC_24 1549
-#define PIC_MSV_DOT_L 5189
-#define PIC_SC23_UTRUBA 1627
-#define PIC_SC24_LADDERD 1826
-#define MV_HND17_0_1 5215
-#define MV_MAN23_TRYHANDLE 5308
-#define PIC_MAP_I02 5296
-#define PIC_MAP_S09 5230
-#define PIC_MAP_I03 5395
-#define PIC_MAP_H37 5391
-#define PIC_MAP_H26 5380
-#define PIC_MAP_H15 5371
-#define PIC_MAP_H04 5360
-#define QU_SC22_ENTER_DOWNTOUP 5327
-#define MV_MAP_NORM 5322
-#define PIC_MEX_CANCEL 5302
-#define MSG_SC22_CRANEOUT_GMA 5218
-#define MSG_SC34_RETRYVENT 5210
-#define SND_CMN_070 5199
-#define SC_7 650
-#define SC_36 2070
-#define SND_INTR_009 5154
-#define MV_IN1CLK_HIDE 5131
-#define SND_FIN_015 5087
-#define MV_FNHND3_SHOW 5037
-#define MSG_FIN_STARTFINAL 5025
-#define MV_MANFIN_TAKECOIN 5020
-#define QU_TTA9_GOL 4937
-#define PIC_CSR_ARCADE6_D 4908
-#define PIC_CSR_ARCADE3 4904
-#define MSG_BRD_TURN 4877
-#define PIC_INV_COIN_C 4831
-#define PIC_INV_BOTTLE 1424
-#define PIC_INV_BOARD 1245
-#define ANI_INV_CARPET 4596
-#define QU_SC34_SND5 4465
-#define QU_SC31_SND2 4385
-#define SND_28_018 4327
-#define ST_BOX34_MAIN2 4306
-#define ST_TTA_DOWN 4288
-#define QU_SC25_MANTOTRUBA_R 4218
-#define ST_BAL14_TOGMA 3199
-#define SND_38_019 4186
-#define SND_38_008 4173
-#define SND_27_019 4120
-#define SND_27_008 4109
-#define QU_SC21_SND3 3957
-#define SND_19_005 3913
-#define SND_18_006 3906
-#define SND_15_009 3811
-#define QU_SC12_SND5 3725
-#define QU_SC10_SND3 3669
-#define QU_SC8_SND3 3637
-#define QU_SC7_SND2 3607
-#define SND_7_023 3603
-#define SND_7_012 3592
-#define SND_7_001 3581
-#define SND_6_035 3574
-#define QU_SC6_FALLHANDLE 2995
-#define SND_6_013 3550
-#define SND_6_002 3539
-#define SND_5_025 3537
-#define SND_3_016 3523
-#define MV_MAN_STANDUP 1166
-#define QU_MAN_DEF_STOPSHOES1 3381
-#define QU_MAN_DEF_SITDOWN 3377
-#define MV_BTH_2_1 3364
-#define QU_SC27_SHOWVENT 2060
-#define MV_HDLL_RAISE 3329
-#define MV_KZW14_HIDE 3269
-#define rMV_STR_DENY 3209
-#define MV_MAN38_PUTBOTTLE_FULL 3170
-#define SND_4_015 3130
-#define SND_3_005 3104
-#define SND_2_017 3099
-#define SND_2_006 3088
-#define SND_1_007 3071
-#define QU_SC8_FALLSTEP 2977
-#define ST_MOM_EMPTY 2952
-#define MSG_SC4_COINOUT 2895
-#define rMV_MAN_TAKEBOOT 2883
-#define QU_SC6_ENTERLIFT 1054
-#define ST_LBN_3H 2795
-#define MV_LBN_2H 2792
-#define LIFTBTN_6 2786
-#define MSG_LIFT_TESTDOOR 1064
-#define QU_SC3_ENTERLIFT 2779
-#define ST_LBN_9N 2777
-#define ST_GRT14_GRIT 2727
-#define MV_GRT14_FALL 2725
-#define QU_SC6_FALLGRIT 2696
-#define MSG_SC34_ONBOARD 2550
-#define QU_SC34_FROMSTOOL 2491
-#define MV_MAN20_TAKESTOOL 2462
-#define ANI_INV_POTTIE 2390
-#define PIC_SC34_UTRUBA1 2377
-#define ST_MAN32_SIT 2277
-#define ST_FLG_RIGHT 2264
-#define ST_FLG_NORM 2259
-#define rMV_MAN29_PUSHASS 2146
-#define MSG_SC29_SHOOTGREEN 2119
-#define MV_SHG_NORM 2117
-#define MSG_SC27_STARTWIPE 2057
-#define QU_MID_SWAB 2041
-#define QU_DRV_GIVEVENT 2040
-#define QU_DRV_FROMRIGHT2 2039
-#define MV_MID_SWITCHBACK 2018
-#define ANI_MAID 2015
-#define MSG_SC26_SHOWVENT 1946
-#define ST_MAN25_ROW 1881
-#define PIC_SC26_UTRUBA 1863
-#define QU_MSH_MOVE 1812
-#define QU_MSH_CRANEOUT 1811
-#define ST_HDL22_EMPTY 1761
-#define MSG_SC23_SPINWHEEL1 1740
-#define QU_GRFB_TAIL 1642
-#define ST_GRFB_HANG 1638
-#define PIC_SC23_FLOOR 1631
-#define MV_CDI_DRYG 1534
-#define QU_GRD_LOOKRIGHT 998
-#define ST_GRL18_WALKFROM 1487
-#define ANI_BRIDGE 1378
-#define MSG_SC16_MUGCLICK 1366
-#define MV_BOY_GOOUT 1334
-#define ST_INV_FIRECAN_default 1314
-#define ST_HDLR_DOWN 1199
-#define ST_SWR_SWING 1115
-#define ANI_KACHELI 1094
-#define PIC_SCD_9 907
-#define PIC_INV_EGG 859
-#define PIC_INV_HAMMER 864
-#define ST_INV_OLDEGG_default 366
-#define PIC_INV_GLASSES 865
-#define ANI_INV_OLDHAMMER 399
-#define ST_INV_OLDBOOT_default 398
-#define ST_INV_OLDAPPLE_default 395
-#define MV_SLN_POT_MOVEBACK 844
-#define QU_HGN_PLUU 815
-#define SC_DBGMENU 726
-#define ANI_HAND 601
-#define MV_MAN_LOOKPLANK 554
-#define MSG_LOWERPLANK 540
-#define MV_MAN_TURN_RD 489
-#define MV_MAN_TURN_RU 485
-#define rMV_MAN_GOR 329
-#define MV_INV_OLDHAMMER_default 400
-#define MV_EGTR_FATOBL 372
-#define MV_EGTR_GIVESMONEY 353
-#define MV_OTM_2_4 438
-#define TrubaLeft 474
-#define MV_KZW_JUMP 558
-#define MV_KZW_TURN 562
-#define MV_KZW_GOR 564
-#define rMV_KZW_GOR 566
-#define PIC_SC4_BOTTLE 568
-#define MV_KZW_JUMPEDGE 581
-#define MV_HDL_MOVEDOWN 623
-#define QU_SC1_ENTER_UP 704
-#define QU_CST_SPINHEADUP 725
-#define QU_BTT_EAT 759
-#define MV_MAN8_DRYGUP 768
-#define PIC_SC12_RTRUBA 855
-#define MV_INV_HAMMER_default 885
-#define PIC_SC2_DTRUBA 841
-#define PIC_SC9_LTRUBA 900
-#define MV_VSN_CYCLE 905
-#define ANI_NADUVATEL 944
-#define MV_GRD_MORG 997
-#define MSG_SC8_ARCADENOW 1044
-#define PIC_SC11_LTRUBA 1119
-#define MSG_SC5_MAKEOTMFEEDBACK 1169
-#define QU_STR_TURNL 1184
-#define MSG_SC16_HIDEMAN 1357
-#define ST_JTI_EMPTY2 1395
-#define QU_GFA_START 1612
-#define ST_GRFU_UP 1648
-#define MV_GRFU_CHMOKUP 1659
-#define MV_GRFG_SHOW 1673
-#define ST_GRFG_EMPTY 1674
-#define ST_GRFG_BALD 1675
-#define MV_CND_8_9 1720
-#define PIC_SC23_BTN3 1731
-#define QU_CLN_ZHMUR 1790
-#define MV_MAN22_FROMSTOOL 1794
-#define MV_MAN21_HANDLEUP 1806
-#define MV_MAN25_TRUBATOBOARD 1892
-#define QU_SC25_MANTOTRUBA 1905
-#define rMV_MAN25_ONBOARD 1966
-#define MSG_SC26_HIDECHI 1967
-#define ST_LUK23_WHANDLE2 1977
-#define QU_GRFM_ASS 1986
-#define MV_MAN27_FLOW 1990
-#define MV_VNT27_LIES 2059
-#define QU_SC25_BACKTOTRUBA 2061
-#define QU_ASS_TAIL 2133
-#define ANI_GLAVAR 2154
-#define MV_MLS_POINT 2183
-#define QU_GLV_LOOKMAN 2212
-#define ANI_FIREFIGHTER 2229
-#define MV_FFT_PIPE_STOPFLOW 2246
-#define MSG_SC32_STARTFLAGLEFT 2310
-#define ST_RHT_CLOSED 2364
-#define ST_POTTIE_default 2392
-#define ANI_HDL32 2394
-#define PIC_SC35_LTRUBA 2406
-#define MV_HZE_FLOW 2425
-#define ST_GMA20_STOOL 2432
-#define ST_STL20_NORM 2465
-#define ST_BRD34_LEFT 2508
-#define ST_BRD34_RIGHT 2509
-#define ST_LUK34_OPEN 2544
-#define MV_PDV_SML_TRY 2552
-#define PIC_SC36_RTRUBA 2560
-#define MV_GRD3_BLINK 2580
-#define MV_GRD3_LOOKL 2583
-#define MV_GRD37_BLINK 2591
-#define MV_GRD37_LOOKL 2593
-#define ANI_GRANDMA_22 2609
-#define MV_VNT33_TURNR 2641
-#define QU_SC35_SHOWHOZECUT 2679
-#define QU_SC9_TEST1 2701
-#define ANI_TUBE_33 2715
-#define MSG_SC29_SHOWLASTRED 2731
-#define PIC_SC3_BORDER 2729
-#define MV_EGTR_MD2_OBL 2870
-#define MV_MAN3_TAKEEGG_3 2911
-#define MV_MAN3_GIVEEGG_4 2913
-#define MV_MAN_TOTRUBAHOR3 2982
-#define MV_MAN_FALLPOPA2 2983
-#define PIC_SC9_URTRUBA 2984
-#define QU_SC9_MANFALL 2986
-#define MV_BTN6_HILITE 2992
-#define MV_NDV_DENY_NOGUM 3022
-#define PIC_CMN_LOAD 3035
-#define SND_4_004 3119
-#define SND_5_003 3144
-#define SND_5_014 3155
-#define ANI_DROP_7 3185
-#define MV_DRP7_DROP 3186
-#define ANI_GRIT2 3189
-#define ST_GRIT2_STUCCO 3191
-#define MSG_SC15_LADDERTOBACK 3259
-#define ST_BTL_EMPTY 3306
-#define MV_DMS_0_1 3318
-#define QU_CLN_BLINK2 3326
-#define MV_MAN11_GIVEGUM_2 3430
-#define MV_MAN22_TRYBOOT 3433
-#define QU_MAN_DEF_SNEEZE 3464
-#define MV_GRFU_KISSOPEN 3477
-#define QU_SC6_SND1 3576
-#define SND_8_011 3621
-#define SND_8_022 3632
-#define QU_SC9_SND4 3648
-#define SND_9_010 3654
-#define QU_SC11_SND4 3688
-#define SND_16_008 3828
-#define SND_16_019 3839
-#define SND_17_007 3871
-#define SND_17_018 3882
-#define SND_17_029 3893
-#define QU_SC20_SND2 3935
-#define QU_SC22_SND4 3987
-#define SND_26_009 4090
-#define SND_28_007 4154
-#define ST_SHD01_0 4204
-#define QU_SC17_SHOWBOOT 4225
-#define ST_BRM_STAND 4226
-#define ST_LFT28_OPEN 4241
-#define QU_SC28_LIFT1_SHOWAFTER 4260
-#define MSG_SC28_TURNON_6 4272
-#define SND_29_006 4340
-#define SND_29_017 4351
-#define QU_SC30_SND1 4364
-#define MV_MAN30_ITCHBROOM 4374
-#define SND_30_010 4375
-#define QU_SC32_SND3 4399
-#define SND_32_030 4426
-#define QU_SC33_SND4 4441
-#define MV_MAN33_PUTMUGFULL 4453
-#define MV_GLV_PUTDOMINO 2158
-#define MV_MAN36_PUTCARPET 4604
-#define PIC_MNU_DEBUG_D 4631
-#define PIC_MSV_8_L 4667
-#define MV_WTR24_FLOWLOWER 1844
-#define PIC_SC11_WND1 4704
-#define ANI_EYE_30 4712
-#define SND_29_028 4758
-#define MSG_SC22_CHECKGMABOOT 4782
-#define PIC_TEST1 4783
-#define QU_LUK26_HIT 4890
-#define MV_KBK_TOTRUBA 4971
-#define SND_19_016 4995
-#define SND_FIN_004 5010
-#define QU_FN4_DOFINAL 5108
-#define ST_IN1MAN_FROM 5123
-#define SC_14 1138
 #define SC_25 1550
-#define SC_TITLES 5166
-#define PIC_SC24_LADDERUP 1827
-#define PIC_SC23_LADDER 1628
-#define PIC_SC1_OSK 1018
-#define PIC_MAP_H38 5392
-#define PIC_MAP_H27 5381
-#define PIC_MAP_H16 5372
-#define PIC_MAP_H05 5361
-#define QU_SC22_ENTER_UPTODOWN 5326
-#define MV_MOM_SITDOWN 657
-#define SC_8 651
-#define SC_37 2071
-#define QU_INTR_GETUPMAN 5136
-#define SND_FIN_016 5088
-#define MV_FNHND4_SCRUB 5049
-#define rMV_EGI_GOR 4932
-#define MV_EGI_GOR 4930
-#define PIC_CSR_ARCADE7_D 4910
-#define PIC_CSR_ARCADE4 4905
-#define PIC_INV_EGGBLACK_C 4834
-#define PIC_INV_BOOT_C 4825
-#define SND_31_010 4752
-#define SND_30_011 4376
-#define PIC_MSV_0_D 4643
-#define PIC_MSV_FULL_D 4641
-#define QU_SC31_SND3 4386
-#define SND_28_019 4328
-#define MV_TTA_GOL 4293
-#define ST_STR_GLASSES 3114
-#define MSG_SC9_FROMLADDER 4207
-#define SND_38_009 4174
-#define SND_27_009 4110
-#define QU_SC21_SND4 3958
-#define SND_19_006 3919
-#define QU_SC10_SND4 3670
-#define QU_SC8_SND4 3638
-#define QU_SC7_SND3 3608
-#define SND_7_024 3604
-#define SND_7_013 3593
-#define SND_7_002 3582
-#define SND_6_036 3575
-#define SND_6_025 3564
-#define SND_6_014 3551
-#define SND_6_003 3540
-#define SND_3_017 3533
-#define SND_4_027 3530
-#define SND_2_018 3512
-#define ST_MID_SPADE 3489
-#define MV_MAN_STOPSHOES_1 3376
-#define MV_BTH_GODOWN 3350
-#define QU_CDI_EYE 3314
-#define MV_MAN16_TAKEBOOT 3289
-#define QU_KZW14_HIDE 3274
-#define QU_SC5_SND1 3240
-#define MV_MAN13_THROWGLASSES 3197
-#define SND_4_016 3131
-#define SND_3_006 3105
-#define SND_1_008 3072
-#define QU_STR_HIDE_L 3060
-#define rMV_STR_TURNR 3051
-#define ST_MID11_SWAB 3030
-#define ST_MOM_CYCLEBK 3011
-#define ST_CLK8_NORM 2991
-#define MV_MOM_OPENEMPTY 2946
-#define QU_SC4_MANFROMBOTTLE 2851
-#define QU_SC38_EXITLIFT 2837
-#define ST_LBN_2H 2793
-#define MV_LBN_1H 2790
-#define LIFTBTN_7 2787
-#define ST_LBN_8N 2774
-#define QU_SC11_PUTBOOT1 2709
-#define QU_SC32_FLOWB 2667
-#define QU_SC33_ENTER_LEFT 2620
-#define PIC_SC34_SHADOW 2538
-#define ANI_STOPPER 2515
-#define QU_SC34_ENTER_DOWN 2379
-#define PIC_SC34_UTRUBA2 2378
-#define MSG_SC30_LEAVESCENE 2373
-#define QU_LEG_SHOW1 2347
-#define ST_LEG_UP 2324
-#define MV_MAN38_PUTBOTTLE 2285
-#define MV_ASS_HITGREEN 2138
-#define QU_SC29_MANTO_L 2103
-#define MV_MAN29_RUN 2095
-#define MV_MAN29_FROMPORTER 2094
-#define MV_MAN29_STANDUP 2092
-#define QU_DRV_PUSHBUTTON 2056
-#define ST_MID_SWAB 2017
-#define MV_DRV_FROMLEFT 2012
-#define MV_DRV_GIVEVENT 2006
-#define MV_DRV_TORIGHT 2001
-#define MV_INV_VENT_default 1969
-#define MV_BRD25_RIGHT 1899
-#define QU_WTR24_FLOWLOWER 1953
-#define ST_WTR25_FLOW 1858
-#define ST_LUK23_OPEN 1816
-#define MSG_SC23_SPINWHEEL2 1741
-#define MV_CDI_SHOW 1530
-#define MV_KSL_JUMPMAN 1509
-#define MV_GRL18_JUMPTO 1488
-#define ST_BOY18_WALK 1480
-#define ST_KSL_BOY 1463
-#define MV_SMG_SPINHEAD 1400
-#define rMV_MAN_STANDUP 1291
-#define QU_GRD2_LOOKLEFT 1289
-#define QU_GRD2_BLINK 1287
-#define PIC_SC15_WALL 1286
-#define MV_MAN14_KICKAIR 1256
-#define MSG_SC14_SHOWBALLFLY 1253
-#define MV_MAN14_FALL 1236
-#define MV_SWR_JUMPDOWN 1116
-#define MV_MAN_GOR 327
-#define MSG_SC4_COINPUT 1032
-#define ST_HDL6_default 1011
-#define MV_INV_POT_default 987
-#define ANI_INV_POT 986
-#define MV_BALL9_default 934
-#define MSG_SC5_HANDLEUP 915
-#define SC_LDR 635
-#define MV_INV_DOMINO_default 873
-#define ST_INV_HANDLE_default 895
-#define QU_SLN_POT_MORG 849
-#define MSG_SC7_HIDEBOX 817
-#define MV_BTT_23 747
-#define MV_BTT_12 745
-#define MV_BTT_01 744
-#define PIC_SC5_UTRUBA 701
-#define QU_EGTR_FATOBLRV 534
-#define MV_MAN_TOTRUBAVER 517
-#define ST_MAN_EMPTY 476
-#define MV_OTM_GLS_TURNL 424
-#define ST_EGBR_HEADRAISED 379
-#define ST_DYAS_SITS 308
-#define MV_INV_OLDDOMINO_default 368
-#define PIC_SC2_LADDER 412
-#define MV_MANEGTR_GIVESEGGFAT 417
-#define ST_OTM_VNT_LEFT 434
-#define PIC_TEST2 509
-#define MSG_KOZAWRESTART 546
-#define ST_PNK_WEIGHTLEFT 503
-#define GRID_SC4_LADDER 565
-#define QU_SC4_CLICKBUTTON 610
-#define MSG_UPDATEBOTTLE 613
-#define ANI_HANDLE 622
-#define MV_MOM_PUTBALL 666
-#define QU_BTT_SLEEP 763
-#define MSG_SC8_RESUMEFLIGHT 784
-#define MV_MAN8_TOJUMP 782
-#define ST_LUK_OPEN 806
-#define QU_CST_MORG 818
-#define PIC_INV_OLDDOMINO 371
-#define MV_VSN_TURNRIGHT 955
-#define QU_SC9_ENTER_LEFT 962
-#define MSG_SC9_PLVCLICK 965
-#define MSG_SC6_INSTHANDLE 1012
-#define MV_MAN_LIFTUP 1051
-#define QU_SC6_ENTER_LIFTUP 1069
-#define MV_MAN_STOPD 482
-#define MV_MAN_STOPU 477
-#define rMV_MAN_STOPR 331
-#define PIC_INV_VANTUZ 1161
-#define ANI_STOROZH 1172
-#define ANI_HANDLE_R 1196
-#define ST_GMA_EMPTY 1235
-#define PIC_SC15_RTRUBA 1262
-#define ANI_GRANDMA_ASS 1265
-#define ST_GRD2_STAND 1281
-#define MV_MAN16_DRINK 1354
-#define MSG_HIDEMAN 1356
-#define MV_HND17_TOCYCLE 1450
-#define QU_SC19_ENTER_WHIRLIGIG 1470
-#define MV_INV_EGGDOM_default 1562
-#define ST_GFA_SIT 1590
-#define ST_GRFU_CHMOK 1656
-#define MV_GRFU_TOKISS 1661
-#define MV_GRFG_BLINKBALD 1678
-#define MV_CND_0_1 1703
-#define PIC_SC23_BTN4 1732
-#define ST_CLN_BROOM 1771
-#define QU_SC22_FALLLEVER 1787
-#define PIC_SC24_FLOOR 1825
-#define MV_INV_LOPAT_default 1921
-#define ST_INV_LOPAT_default 1922
-#define MV_MAN25_TAKESPADE 1926
-#define PIC_SC29_LFLOOR 2142
-#define ST_SHG_EMPTY 2148
-#define MV_GLV_DRINK_NOHMR 2163
-#define ST_DLD_SIT2 2173
-#define MV_DLD_BLINK 2175
-#define ST_MLS_RIGHT 2180
-#define QU_SC38_SHOWDOMINO 2203
-#define MV_FFT_PIPE_FLOW 2242
-#define MV_FFT_PIPE_OPENEYE 2243
-#define QU_FFT_PIPE_START 2296
-#define MSG_SC32_STARTFLAGRIGHT 2309
-#define ST_INV_PIPE_default 2319
-#define MV_MAN36_GOIN 2366
-#define ST_GMA20_FLOOR 2429
-#define MV_GMA20_STD_LOOKTRUBA 2438
-#define PIC_SC20_RTRUBA 2439
-#define PIC_SC31_DTRUBA 2441
-#define PIC_SC31_UTRUBA 2442
-#define MV_MAN20_BOOTTOSTOOL 2443
-#define MV_GMA_0_1 2444
-#define QU_SC35_MANRETIRE 2539
-#define MV_GRD3_BLINK1 2581
-#define QU_GRD3_BLINK 2584
-#define QU_GRD3_LOOKL 2586
-#define ANI_RING 2604
-#define QU_SC22_FROMSTOOL_GMA 2612
-#define MV_MUG33_FILL 2624
-#define ST_JTI33_EMPTY 2629
-#define ST_VNT33_RIGHT 2639
-#define ANI_SCISSORS_36 2647
-#define MV_MAN36_TAKESCISSORS 2650
-#define PIC_SC32_VESSELS 2665
-#define MV_HZE_UNCUT 2677
-#define QU_SC3_RELEASEEGG 2680
-#define MSG_SC3_RELEASEEGG 2681
-#define MV_GRT6_BREAK 678
-#define MV_MAN17_PUTMUG 2741
-#define QU_SC17_SHOWMUG 2742
-#define QU_SC35_ENTER_LIFTDOWN 2818
-#define MV_EGTR_MD2_BOLTLEGS 2868
-#define MSG_SC6_JUMPBK 2900
-#define MV_MAN3_TAKEEGG_4 2910
-#define ST_STP8_EMPTY 2981
-#define ANI_BUTTON_6 2988
-#define MV_PCH2_NORM 3020
-#define QU_SC8_ENTER_UP 3036
-#define SND_2_007 3089
-#define SND_4_005 3120
-#define SND_5_004 3145
-#define SND_5_015 3156
-#define ST_DRP7_EMPTY 3187
-#define QU_BTT_CLOCK_SPOON 3196
-#define MV_MAN13_PUTHAMMER 3206
-#define MSG_SC18_CLICKBOARD 3297
-#define MV_DMS_THREE 3321
-#define MV_MAN22_TRYTAKESOCK 3330
-#define MSG_SC23_ONSTOOL 3334
-#define QU_SC23_FROMSTOOL 3338
-#define MSG_SC23_FROMSTOOL 3339
-#define ST_DRP26_NORM 3347
-#define QU_MAN_DEF_STOPSHOES1_DEF 3393
-#define QU_MAN_DEF_STOPSHOES2 3396
-#define PIC_SC26_LADDER 3403
-#define ST_MAN_LADDERDOWN_R 3419
-#define QU_WMN_SHOWAFTER 3457
-#define MV_DRP24_TOFLOOR 3508
-#define QU_DRP24_TOWATER 3509
-#define QU_SC6_SND2 3577
-#define SND_8_001 3611
-#define SND_8_012 3622
-#define SND_8_023 3633
-#define QU_SC9_SND5 3649
-#define SND_9_011 3655
-#define QU_SC11_SND5 3689
-#define SND_16_009 3829
-#define SND_17_008 3872
-#define SND_17_019 3883
-#define QU_SC20_SND3 3936
-#define SND_20_010 3943
-#define QU_SC22_SND5 3988
-#define SND_22_030 4013
-#define SND_28_008 4155
-#define ST_SHD01_1 4205
-#define MV_MAN17_PUTBOOT 4223
-#define MV_LFT28_CLOSE 4242
-#define MV_CTS34_FALLRIGHT 4315
-#define ST_VNT34_RIGHT3 4318
-#define SND_29_007 4341
-#define SND_29_018 4352
-#define QU_SC30_SND2 4365
-#define QU_SC32_SND4 4400
-#define SND_32_020 4416
-#define SND_32_031 4427
-#define QU_SC33_SND5 4442
-#define PIC_MNU_CONTINUE_L 4626
-#define PIC_MSV_9_L 4668
-#define MV_LFT_TRY 4671
-#define ANI_BEARDED_28 4679
-#define PIC_SC11_WND2 4705
-#define MV_EYE30_SHOW 4713
-#define QU_EYE30_BLINK 4721
-#define MSG_SC15_STOPCHANTING 4753
-#define SND_29_029 4759
-#define SND_11_030 4885
-#define MV_GMA20_STD_DENY 4887
-#define SND_CMN_060 4921
-#define MV_BRDCMN_STOPR 4944
-#define rMV_KBK_TOTRUBA 4974
-#define MV_KBK_TURN_RL 4975
-#define SND_FIN_005 5011
-#define ST_FNFNG_BEFORE 5064
-#define MV_IN1MAN_0_1 5122
-#define SC_15 1139
 #define SC_26 1551
-#define PIC_SC8_LADDERD 1106
-#define MV_MAN22_TRYBOX 5303
-#define SND_5_026 5316
-#define SND_CMN_071 5317
-#define PIC_SC11_HINT 5170
-#define PIC_MAP_H17 5373
-#define PIC_MAP_H28 5382
-#define PIC_MAP_H06 5362
-#define SND_CMN_072 5352
-#define MV_EGTR_FATASK 5332
-#define PIC_CSR_ITN_GREEN 5330
-#define SND_11_031 5171
-#define SC_9 652
+#define SC_27 1552
+#define SC_28 2062
+#define SC_29 2063
+#define SC_3 303
+#define SC_30 2064
+#define SC_31 2065
+#define SC_32 2066
+#define SC_33 2067
+#define SC_34 2068
+#define SC_35 2069
+#define SC_36 2070
+#define SC_37 2071
 #define SC_38 2072
-#define SND_FIN_017 5089
-#define PIC_CSR_ARCADE5 4906
-#define PIC_INV_POT_C 4848
-#define PIC_INV_SUGAR_H 4818
-#define PIC_INV_POTTIE_H 4814
-#define PIC_INV_MUG_H 4809
-#define PIC_INV_GUM_H 4803
-#define PIC_INV_BOTTLEFULL_H 4790
-#define PIC_TEST3 4784
-#define ST_TBE36_NORM 4751
-#define QU_SC28_LIFT0_START 4676
-#define MV_PDV_CUT_DENY 4586
-#define SND_34_030 4490
-#define QU_SC31_SND4 4387
-#define PIC_SC28_FRAME4 4264
-#define QU_SC28_LIFT1_START 4254
-#define ANI_MAN_28 4247
-#define SND_22_031 4002
-#define SND_21_021 3975
-#define SND_21_010 3964
-#define QU_SC21_SND5 3959
-#define SND_19_007 3920
-#define SND_18_008 3908
-#define SND_10_010 3676
-#define QU_SC10_SND5 3671
-#define QU_SC8_SND5 3639
-#define QU_SC7_SND4 3609
-#define SND_7_025 3605
-#define SND_7_014 3594
-#define SND_7_003 3583
-#define SND_6_026 3565
-#define SND_6_015 3552
-#define SND_6_004 3541
-#define SND_3_018 3534
-#define SND_4_028 3531
-#define SND_2_019 3513
-#define QU_SC25_TRYROWHAND_R 3494
-#define QU_MID_SPADE 3490
-#define MV_MAN27_SWAB2SPADE 3487
-#define ANI_BEARDED_CMN 3420
-#define MV_BTH_3_2 3362
-#define ST_VNT26_UP2 1948
-#define ST_GMS_BOOTLESS2 3316
-#define ST_BOY_TEMP 3283
-#define ANI_KOZAWKA_14 3261
-#define QU_SC5_SND2 3241
-#define QU_SC4_SND1 3235
-#define SND_4_017 3132
-#define SND_3_007 3106
-#define SND_2_008 3090
-#define SND_1_009 3073
-#define MSG_SC13_OPENBRIDGE 3064
-#define QU_STR_LTOR 3054
-#define rMV_STR_SHOW 3049
-#define MSG_SC11_HITMAN 3019
-#define MV_MOM_STOPBK 3013
-#define MSG_SC10_LADDERTOFORE 3004
-#define MV_MAN8_SITDOWN 2968
-#define ANI_MAMASHA_4 660
-#define ST_PMS_MINUS 2942
-#define MV_MAN_TOLADDER2 2841
-#define MV_LBN_0H 2834
-#define QU_SC30_ENTER_LIFTUP 2825
-#define ST_LBN_1H 2791
-#define LIFTBTN_8 2788
-#define ST_LBN_9P 2778
-#define ST_LBN_7N 2771
-#define ANI_LIFTBUTTON 2751
-#define QU_SC11_PUTBOOT2 2710
-#define ST_NBL_EMPTY 1078
-#define MV_NBL_OUT 1077
-#define ST_NBL_NORM 1076
-#define QU_SC34_LEAVEBOARD 2575
-#define ST_SPR_NORM 2517
-#define MSG_SC34_UNCLIMB 2492
-#define QU_CTS_BACK 2415
-#define MV_FLG_CYCLEL 2262
-#define QU_LEG_HIDE 2353
-#define QU_LEG_SHOW2 2348
-#define MV_LEG_POT0_MOVE1 2326
-#define MV_MAN29_STANDUP_NORM 2093
-#define MV_MAN29_TOPORTER_L 2087
-#define PIC_SC29_UTRUBA 2080
-#define QU_DRV_LOOKRIGHT 2033
-#define MV_DRV_FROMRIGHT_V 2013
-#define QU_SC26_OPEN1 1935
-#define PIC_SC25_STEP 1894
-#define rMV_MAN25_STARTROW 1889
-#define PIC_SC25_LADDERDOWN 1855
-#define ST_WTR24_FLOW 1836
-#define ST_JET24_FLOW 1839
-#define MV_MSH_CRANEOUT 1757
-#define ANI_MESHOK 1754
-#define MSG_SC23_SPINWHEEL3 1742
-#define ST_GRFB_SIT 1687
-#define PIC_SC22_LTRUBA 1584
-#define ANI_CORDIE 1529
-#define QU_SC19_MANJUMP1 1516
-#define MV_KSL_INBOY 1491
-#define ST_BOY18_WALKTO 1482
-#define MV_KSL_SWINGGIRL 1464
-#define QU_SMG_STARTFINGERS 1406
-#define MV_SMG_DENIES 1401
-#define MSG_SC16_HIDEWIRE 1349
-#define MV_GRL_LAUGH 1343
-#define MV_BOY_GOIN 1329
-#define MV_BAL14_FALL 1258
-#define ST_INV_BALL_default 1244
-#define MSG_SC13_UNEATGUM 1218
-#define QU_SC13_CLOSEBRIDGE 1214
-#define MV_SWR_1_2 1146
-#define ANI_SWINGER 1113
-#define MV_MAN_STOPLADDER 454
-#define MV_MAN9_SHOOT 922
-#define MV_PLV_BREATHE 920
-#define ST_BLK_OPEN 913
-#define PIC_INV_DOMINO 860
-#define ANI_INV_EGG 869
-#define ANI_INV_OLDDOMINO 367
-#define PIC_INV_OLDGLASSES 408
-#define QU_SLN_BOOT_KICK 846
-#define ANI_SLONIK 827
-#define MSG_SC7_SHOWBOX 816
-#define MV_MAN8_DRYGLADDER 787
-#define PIC_SC8_UTRUBA 753
-#define MV_HND_POINT 602
-#define ST_BTN_UP 600
-#define QU_EGTR_FATBOLTLEGS 533
-#define QU_EGTR_SLIMOBL 527
-#define QU_EGTR_SLIMTRAIN 525
-#define QU_EGTR_SLIMTOSORROW 524
-#define rMV_EGBR_KACHAET 461
-#define MV_MANEGTR_TAKESEGG 415
-#define MV_MANDYAS_GIVESCOIN 361
-#define MV_OTM_VNT_BOLTHEAD 433
-#define MV_MANEGBR_EGG2GLASSES 442
-#define QU_SC1_ENTER 320
-#define ST_KZW_PLANK 499
-#define MV_KZW_WALKPLANK 500
-#define MV_KZW_JUMPROTATE 561
-#define MV_KZW_STANDUP 563
-#define QU_OTM_GLS_MORGLEFT 638
-#define QU_OTM_BOX_MORGL 642
-#define QU_OTM_BOX_TURNR 644
-#define ST_MAN8_HANDSUP 773
-#define ST_MAN8_STAND 774
-#define MV_MAN7_BOX2HANDLE 801
-#define MV_VSN_DRYG 957
-#define PIC_SC10_DTRUBA 974
-#define PIC_SC10_LADDER 995
-#define MSG_SC1_SHOWOSK 1019
-#define MV_MAN_TURN_SDL 1084
-#define MV_MAN_TURN_SUL 1087
-#define QU_SWR_SWING 1118
-#define QU_SC13_ENTER_UP 1183
-#define MSG_SC13_SHOWGUM 1215
-#define ST_MAN14_KICK 1238
-#define QU_GMA_BLINK 1252
-#define MV_GMS_0_1 1271
-#define MSG_SC16_SHOWMAN 1358
-#define MSG_SC16_TESTMUG 1359
-#define MV_WHR19_SPIN 1317
-#define QU_SC14_STARTARCADE 1390
-#define ST_HND17_ATTRACT 1451
-#define QU_HND17_ATTRACT 1455
-#define PIC_SC18_RTRUBA 1520
-#define QU_SC21_ENTER_LEFT 1556
-#define ST_INV_EGGGLS_default 1575
-#define MV_GFA_BREATHESOCK 1591
-#define MV_GFA_SWINGSOCK 1597
-#define MV_GFA_TOSWING 1599
-#define QU_SC22_ENTER_DOWN 1620
-#define ST_GRFU_LEFT 1647
-#define QU_SC23_FROMCALENDAREXIT 1735
-#define MV_MAN21_BROOMTOCOIN 1772
-#define PIC_INV_LEVERHANDLE 1784
-#define MSG_SC22_HANDLEDOWN 1796
-#define QU_SC24_ENTER_UP 1830
-#define QU_SC25_TRYWATER 1906
-#define ANI_GIRAFFE_MIDDLE 1981
-#define MV_MAN27_THROWBET 1989
-#define ANI_VENT27 2058
-#define MV_PTR_MOVE 2083
-#define MSG_SC29_ENABLERIDEBACK 2105
-#define MV_STR1_SHOOT 2109
-#define ST_STR1_STAND 2110
-#define ST_ASS_EMPTY 2124
-#define QU_SC29_ESCAPE 2129
-#define ANI_SHELL_RED 2130
-#define MV_GLV_TOSMALL 2160
-#define MV_GLV_LOOKMAN 2167
-#define MV_BTL38_NORM 2189
-#define ANI_DOMINO38 2200
-#define QU_GLV_DRINK_NOHMR 2211
-#define QU_GLV_LOOKMAN_NOHMR 2213
-#define MSG_SC38_POINT 2226
-#define ST_FFT_PIPE 2240
-#define MV_FFT_LOOKFLAG 2247
-#define ST_CTS_EMPTY 2269
-#define MV_LEG_0_1 2343
-#define ANI_ROTOHRUST 2360
-#define MV_MAN32_STARTSPIN 2401
-#define ST_MAN32_SPIN 2402
-#define QU_CTS_GROWMAN 2417
-#define MV_GMA20_STL_NOSE 2433
-#define MV_CTS_CYCLEUP 2469
-#define MV_PDV_CUT_BREATHE 2526
-#define ST_INV_STOPPER_default 2537
-#define ST_GRD3_STAND 2579
-#define ANI_GUARD_37 2588
-#define PIC_INV_MUGFULL 2632
-#define MV_INV_MUGFULL_default 2634
-#define ST_TSTO_NORM 2658
-#define MSG_SC29_SHOWLASTGREEN 2730
-#define MV_MAN17_DRINK 2743
-#define QU_SC4_MANTOBOTTLE 2850
-#define MV_EGTR_MD2_DENY 2871
-#define ST_MOM_LIFT 2894
-#define QU_MOM_STANDUP 2899
-#define QU_VSN_FROML 2999
-#define MV_SWR_SPOLZING_NOVNT 3005
-#define ST_PCH_NORM 980
-#define SND_4_006 3121
-#define SND_5_005 3146
-#define SND_5_016 3157
-#define MV_MAN5_VNT2GLS 3184
-#define MV_MAN6_LOOK 3210
-#define rMV_MAN22_TAKETABUR 3337
-#define MSG_SC27_HANDLERTOFRONT 3371
-#define MV_MAN_STOPSHOES_2 3388
-#define MV_GFA_DENY_NOSOCK 3436
-#define QU_MAN_DEF_CLEAN_R 3463
-#define ST_GRFM_AFTER 3472
-#define QU_GRFU_OPENEYES 3478
-#define MSG_SC26_SHOWCHI 3495
-#define QU_SC6_SND3 3578
-#define SND_8_002 3612
-#define SND_8_013 3623
-#define SND_8_024 3634
-#define SND_9_001 3640
-#define SND_9_012 3656
-#define SND_11_020 3704
-#define SND_17_009 3873
-#define QU_SC20_SND4 3937
-#define SND_20_011 3944
-#define SND_28_009 4156
-#define ST_BRM_LIES2 4227
-#define ST_BOT1_NORM 4233
-#define ANI_LIFT_28 4238
-#define MSG_SC34_SHOWVENT 2481
-#define SND_29_008 4342
-#define SND_29_019 4353
-#define SND_30_001 4359
-#define QU_SC30_SND3 4366
-#define QU_SC32_SND5 4401
-#define SND_32_010 4406
-#define SND_32_021 4417
-#define SND_32_032 4428
-#define QU_SC33_SHOWMUGFULL 4454
-#define ST_BOX34_FLOOR 4565
-#define SC_MAINMENU 4620
-#define PIC_MNU_EXIT_L 4622
-#define PIC_MLD_CANCEL_D 4648
-#define PIC_MSV_1_D 4651
-#define PIC_SC28_DARK0 4675
-#define QU_EYE30_SHOW 4719
-#define MV_LEG31_HIDE 4724
-#define MV_BRDCMN_GOR 4735
-#define SND_CMN_050 4745
-#define MV_BOT15_NORM 4780
-#define PIC_CSR_ITN 4893
-#define SND_CMN_061 4922
-#define rMV_KBK_TURN_RL 4976
+#define SC_4 304
+#define SC_5 305
+#define SC_6 649
+#define SC_7 650
+#define SC_8 651
+#define SC_9 652
+#define SC_COMMON 321
+#define SC_DBGMENU 726
 #define SC_FINAL1 4999
-#define SND_FIN_006 5012
-#define ST_FNHND6_AFTER2 5070
-#define SND_FIN_028 5103
-#define MV_IN1MAN_GODOWN 5124
-#define SC_16 1140
-#define SC_27 1552
-#define PIC_MSV_SPACE_D 5190
-#define PIC_SC23_LADDERU 3411
-#define PIC_SC34_DTRUBA 2376
-#define QU_CTS34_FALLRIGHT 4317
-#define PIC_MAP_S31_1 5253
-#define PIC_MAP_H18 5394
-#define PIC_MAP_H29 5383
-#define PIC_MAP_H07 5363
-#define SND_CMN_073 5353
-#define PIC_MOV_OK 5344
-#define SC_MAP 5222
-#define QU_INTR_DUMMY 5168
-#define ST_IN1HAND_AFTER 5116
-#define ANI_IN1MAN 5110
-#define ANI_FN4MAN 5097
-#define SND_FIN_018 5090
-#define SND_FIN_007 5079
-#define ST_FNHND6_AFTER3 5076
-#define QU_FN3_DOFINAL 5072
-#define ST_FNHND5_BEFORE 5054
-#define ST_FCN_NORM 5017
-#define ST_FCN_EMTY 5016
-#define QU_BRD16_TURNR 4949
-#define MSG_SC9_STARTTIOTIA 4942
-#define ANI_EGGIE 4929
-#define SND_CMN_062 4927
-#define PIC_CSR_ARCADE6 4907
-#define SND_8_025 4870
-#define PIC_INV_STOOL_C 4852
-#define PIC_INV_EGGGLS_C 4838
-#define PIC_INV_EGGAPL_C 4833
-#define PIC_INV_APPLE 862
-#define QU_MAN_DEF_LOOKUP 4776
-#define ANI_TUBE_36 4749
-#define QU_LEG31_HIDE 4728
-#define MSG_SC28_TURNOFF_0 4678
-#define QU_DRV_PUSHBUTTON_NOVENT 4578
-#define SND_34_031 4491
-#define SND_34_020 4480
-#define SND_33_010 4447
-#define QU_SC31_SND5 4388
-#define SND_31_001 4377
-#define QU_SC28_LIFT6_START2 4295
-#define MV_MAN28_STOPWASH 4252
-#define MV_MAN28_WASH 4251
-#define QU_SC28_LIFT2_START 4246
-#define QU_SC25_TRYHAND 4219
-#define MSG_SC25_ENTERTRUBA 4214
-#define SND_21_022 3976
-#define SND_21_011 3965
-#define SND_19_008 3921
-#define SND_18_009 3909
-#define SND_13_030 3775
-#define SND_12_020 3740
-#define SND_10_011 3677
-#define QU_SC7_SND5 3610
-#define SND_7_015 3595
-#define SND_7_004 3584
-#define SND_6_027 3566
-#define SND_6_016 3553
-#define SND_6_005 3542
-#define SND_4_029 3535
-#define QU_SC25_TRYSPADE 3498
-#define MV_CHI_NORM 3484
-#define ST_WMN_AFTER 3455
-#define QU_SC28_ENTERWMN 3451
-#define MV_BTH_GOUP_5 3356
-#define ANI_BITAHANDLER 3349
-#define MV_CDI_LOOK 3312
-#define ST_BT16_NORM 3287
-#define ST_WR16_NORM 3284
-#define QU_GRL_FALL 3280
-#define QU_SC5_SND3 3242
-#define QU_SC4_SND2 3236
-#define QU_SC3_SND1 3230
-#define MV_MAN14_KICKGMA 3211
-#define QU_STR_THROWGLASSES_L 3203
-#define MV_STR_0_1 3198
-#define SND_4_018 3133
-#define SND_4_007 3122
-#define SND_3_008 3107
-#define SND_2_009 3091
-#define QU_STR_NOSE_L 3057
-#define SND_DBGMENU_001 2929
-#define QU_SC6_DROPS 2898
-#define ANI_FIRECAN_17 2860
-#define ST_MAN_GOLADDER2 2843
-#define ST_LBN_0H 2835
-#define MV_LBN_0 2831
-#define LIFTBTN_9 2789
-#define ST_LBN_8P 2775
-#define ST_LBN_6N 2768
-#define ST_KDK_NORM 2672
-#define PIC_SC37_MASK 2608
-#define MV_MAN34_BOARD_BUMP2 2571
-#define PIC_SC35_OUTLET 2518
-#define QU_SC34_SHOWSTOOL 2496
-#define MV_MAN20_PUTSTOOL 2461
-#define ANI_PUZODUV 2418
-#define MV_LEG_POT2_MOVE1 2335
-#define MV_LEG_POT1_MOVE2 2331
-#define MV_LEG_POT0_MOVE2 2327
-#define ST_LEG_DOWN 2325
-#define MV_ASS_HITRED 2139
-#define MSG_SC29_STOPRIDE 2107
-#define QU_SC29_MANFROM_L 2101
-#define PIC_SC28_FLOOR 2075
-#define ST_BTA_FALL 2054
-#define ST_DRV_SITNOVENT 1999
-#define ST_DRV_VENT 1996
-#define rMV_BRD25_RIGHT 1903
-#define QU_SC26_OPEN2 1937
-#define MV_MAN26_TURNVENT_L 1933
-#define ST_LUK23U_OPEN 1820
-#define ANI_LUK23_U 1817
-#define ANI_LUK23_D 1813
-#define PIC_SC22_MONETOPR 1809
-#define QU_SC22_FALLSACK 1791
-#define MV_MAN22_FALL 1751
-#define MV_MAN22_PUTTABUR 1748
-#define MSG_SC23_SPINWHEEL4 1743
-#define QU_GRFG_BLINKHAIR 1686
-#define QU_GRFG_SHOWHAIR 1685
-#define QU_GRFU_TURN_UL 1662
-#define rMV_MANEGBR_EGG2GLASSES 469
-#define QU_SC19_MANJUMP2 1517
-#define MSG_SC18_SHOWBOYJUMPTO 1497
-#define MV_MAN17_PUTSUGAR 1414
-#define PIC_SC17_BOX 1409
-#define ANI_WHIRLGIG_13 1383
-#define MV_BOY_DRINK 1333
-#define QU_WHR19_SPIN 1316
-#define MV_WHR18_SPIN 1300
-#define MV_MAN13_PUTFIRECAN 1311
-#define ANI_INV_BALL 1242
-#define MV_GMA_JUMPBK 1231
-#define QU_SC14_ENTER_RIGHT 1223
-#define MV_MAN13_HANDLEDOWN 1202
-#define MV_MAN13_THROWGUM 1194
-#define MV_SWR_SPOLZING 1148
-#define MSG_SC5_MAKEMANFLIGHT 1136
-#define QU_SC5_ENTER_UP 1135
-#define MV_MAN_HMRKICK 1028
-#define MV_SC2_BOX_default 1021
-#define MV_HDL6_default 1010
-#define MSG_SC10_CLICKGUM 992
-#define MSG_SC9_SHOWBALL 936
-#define ANI_PBAR 896
-#define ST_INV_HAMMER_default 886
-#define MV_INV_COIN_default 876
-#define ANI_INV_OLDGLASSES 402
-#define QU_SLN_POT_TURNBACK 852
-#define MV_SLN_POT_MORG 836
-#define MSG_TAKEBOTTLE 614
-#define MV_KZW_JUMPOUT 586
-#define MV_SPR_LOWER 543
-#define QU_SC3_ENTER 473
-#define QU_SC2_ENTER 472
-#define MV_DYAS_GIVESEGG 314
-#define ST_EGTR_SLAPPIN 346
-#define MV_EGTR_SLIMOBL 337
-#define MV_EGTR_TOSLAP 345
-#define MV_MANDYAS_GIVESBOOT 358
-#define MV_MANDYAS_GIVESDOM 375
-#define ST_MAN_INTRUBAHOR 446
-#define PIC_SC1_LTRUBA 470
-#define MV_MAN_FROMLADDERD 494
-#define QU_SC3_ENTER_RIGHT 705
-#define QU_BTT_CHESHET 757
-#define MV_BRD_DROPBALL 694
-#define ANI_LUKE 803
-#define PIC_INV_OLDHANDLE 798
-#define ST_INV_DOMINO_default 874
-#define MV_NDV_EAT 945
-#define QU_SC9_ENTER_RIGHT 963
-#define ANI_GUARD1 996
-#define ST_SC4_BOOT_default 1037
-#define ST_HDL6_LIES 1042
-#define MV_MAN_LIFTDOWN 1052
-#define MV_MAN_TURN_SLD 1079
-#define MV_MAN_TURN_SLU 1080
-#define PIC_SC8_LADDER 754
-#define MV_INV_GUM_default 1155
-#define PIC_SC13_UTRUBA 1170
-#define MV_STR_HIDE 1181
-#define MV_GMA_THROW 1232
-#define MV_GMS_DRYG 1269
-#define QU_SC17_ENTER_RIGHT 1325
-#define ANI_WIRE16 1344
-#define ST_INV_MUG_default 1372
-#define MSG_SC16_SHOWMUGFULL 1396
-#define QU_HND_TAKE0 1440
-#define MV_HND17_ASK 1447
-#define MV_MAN_TOLADDERD 1524
-#define ANI_INV_EGGDOM 1561
-#define ST_INV_EGGDOM_default 1563
-#define PIC_INV_EGGAPL 1578
-#define PIC_INV_EGGGLS 1580
-#define ANI_GRANDFA 1588
-#define QU_GFA_BREATHESOCK 1611
-#define MV_GRFU_BLINKDOWN 1652
-#define ANI_CALENDWHEEL 1702
-#define MV_CND_1_2 1706
-#define MSG_SC23_CLICKBTN1 1736
-#define MV_INV_LEVERHANDLE_default 1778
-#define PIC_INV_STOOL 1785
-#define QU_SC22_TOSTOOL 1801
-#define MV_INV_SWAB_default 1918
-#define MV_MAN26_OPENLUK 1934
-#define QU_GRFM_NECK 1988
-#define ST_DRV_RIGHT 2010
-#define PIC_SC27_FLOOR 2053
-#define MV_STR2_SHOOT 2112
-#define ST_STR2_STAND 2113
-#define MV_MAN38_PUTDOMINO 2186
-#define ANI_BOTTLE38 2188
-#define MV_DMN38_NORM2 2204
-#define QU_DLD_GLOT 2217
-#define MV_FFT_TUBE_OPENEYE 2235
-#define QU_GLV_PROPOSE 2280
-#define ST_MLS_LEFT2 2291
-#define MV_FFT_PIPE_FLOWOPEN 2300
-#define QU_FFT_TUBE_FLOWOPEN 2306
-#define ST_INV_TUBE_default 2316
-#define ANI_INV_PIPE 2317
-#define QU_SC30_ENTER_LEFT 2356
-#define ST_RHT_OPEN 2362
-#define MV_LEG_POT0_OUT 2374
-#define MV_MAN32_STOPSPIN 2404
-#define MV_MAN35_JUMPOUT 2411
-#define MV_GMA_1_2 2455
-#define ST_CTS31_EMPTY 2458
-#define QU_SC31_ENTER_DOWN 2459
-#define MSG_SC34_SHOWBOX 2497
-#define ST_PDV_CUT 2522
-#define QU_PDV_CUT_TRY 2529
-#define MV_INV_SCISSORS_default 2533
-#define ST_RNG_OPEN 2606
-#define ST_RNG_CLOSED 2607
-#define ST_GMA22_EMPTY 2611
-#define ST_VNT33_DOWN 2640
-#define MV_VNT33_TURND 2638
-#define ANI_TESTO_31 2652
-#define MV_TEST 2683
-#define MV_MAN11_PUTBOOT1 2702
-#define MV_BTS11_DOUBLE 2705
-#define QU_SC32_ENTER_UP 2714
-#define ANI_JET_17 2746
-#define QU_SC35_ENTERLIFT 2815
-#define QU_SC35_EXITLIFT 2816
-#define QU_SC32_ENTERLIFT 2827
-#define MV_EGTR_MD1_DENY 2866
-#define MV_EGTR_0_1 2918
-#define ANI_INV_EGGBLACK 357
-#define MV_EGTR_SLIMDENY 2933
-#define MSG_SC15_PULL 2940
-#define MSG_SC37_PULL 2945
-#define MV_MAN1_EGG2DOM 443
-#define ST_GRT1_NORM 2963
-#define MV_SWR_STAND 948
-#define QU_NTL_MOVE 3027
-#define MV_HDLR_RISE 3043
-#define SND_5_006 3147
-#define SND_5_017 3158
-#define MV_GLV_PUTDOMINO_NOHMR 3180
-#define PIC_SC17_PIPE 3292
-#define ST_MLS_RIGHT2 3323
-#define MV_MAN_SNEEZE 3386
-#define QU_SC6_SND4 3579
-#define SND_8_003 3613
-#define SND_8_014 3624
-#define SND_9_002 3641
-#define SND_9_013 3657
-#define SND_11_010 3694
-#define SND_11_021 3705
-#define SND_20_001 3929
-#define QU_SC20_SND5 3938
-#define SND_20_012 3945
-#define SND_22_010 3993
-#define SND_CMN_040 4033
-#define SND_22_032 1765
-#define MV_MAN25_STOPROW 1883
-#define PIC_SC28_DARK1 4266
-#define SND_29_009 4343
-#define SND_30_002 4360
-#define QU_SC30_SND4 4367
-#define SND_30_013 4378
-#define SND_32_011 4407
-#define SND_32_022 4418
-#define SND_32_033 4429
-#define SND_3_019 4549
-#define ANI_TEST 4552
-#define PIC_MSV_OK_D 4635
-#define PIC_MSV_CANCEL_D 4637
-#define PIC_MSV_2_D 4652
-#define QU_TBL_GOL 4708
-#define MV_EYE30_LOOK 4716
-#define ST_LEG31_NORM 4725
-#define SND_CMN_051 4746
-#define PIC_TEST4 4785
-#define PIC_CSR_GOL 4897
 #define SC_FINAL2 5000
-#define SND_FIN_029 5104
-#define ST_IN1GLS_NORM 5121
-#define ST_IN2BOOT_NORM 5142
-#define SC_17 1141
-#define SC_28 2062
-#define MSG_SC32_TRUBATOFRONT 5180
-#define PIC_SC2_LADDER2 5205
-#define QU_SC21_SND6 5214
-#define PIC_MAP_P10 5286
-#define ST_BTN32_OFF 5349
-#define PIC_HLP_BGR 3562
-#define PIC_MAP_S31_2 5254
-#define PIC_MAP_S32_1 5255
-#define PIC_MAP_H08 5364
-#define PIC_MOV_CANCEL 5345
-#define PIC_SC36_MASK 5221
-#define QU_MSH_CRANEOUT_GMA 5219
-#define SND_FIN_019 5091
-#define SND_FIN_008 5080
-#define QU_FN3_SHOWHMR 5073
-#define MSG_SC35_TRYFLY 4985
-#define QU_BRD16_GOR 4951
-#define ST_EGI_GOR 4931
-#define SND_CMN_063 4928
-#define PIC_CSR_ARCADE7 4909
-#define PIC_INV_GUM2_C 4858
-#define PIC_INV_VANTUZ_C 4856
-#define PIC_INV_TUBE_C 4855
-#define PIC_INV_SOCK_C 4851
-#define PIC_INV_PIPE_H 4812
-#define PIC_INV_MUG_H2 4810
-#define PIC_INV_BOTTLEFULL 1425
-#define PIC_SCD_RESTART 4766
-#define MSG_SC35_CHECKPIPESOUND 4761
-#define rMV_BRDCMN_GOR 4739
-#define ST_TBL_L 4701
-#define ANI_TENNBALL 4699
-#define MV_EGTR_MD2_SHOW 4695
-#define MV_BOT34_NORM 4561
-#define SND_34_032 4492
-#define SND_34_021 4481
-#define SND_34_010 4470
-#define SND_33_011 4448
-#define SND_31_002 4380
-#define ST_TTA_GOL 4292
-#define MV_TTA_TURN_DL 4291
-#define MSG_SC28_STARTWORK1 4255
-#define ST_MAN28_RIGHT 4249
-#define QU_SC28_LIFT3_START 4245
-#define SND_21_023 3977
-#define SND_21_012 3966
-#define SND_21_001 3950
-#define SND_19_009 3922
-#define SND_13_031 3776
-#define SND_13_020 3765
-#define SND_12_010 3730
-#define SND_10_012 3678
-#define SND_10_001 3662
-#define SND_7_016 3596
-#define SND_7_005 3585
-#define SND_6_028 3567
-#define SND_6_017 3556
-#define SND_6_006 3543
-#define SND_CMN_030 3470
-#define QU_SC28_WMN_END 3453
-#define MV_WMN28_IN_1 3443
-#define MV_BTH_4_3 3360
-#define MV_CDI_HIDEEYE 3313
-#define MV_MAN16_PUTBOOT 3288
-#define MV_BT16_FILL 3286
-#define QU_GRL_DRYG 3282
-#define MSG_SC14_STARTARCADE 3252
-#define QU_SC5_SND4 3243
-#define QU_SC4_SND3 3237
-#define QU_SC3_SND2 3231
-#define MV_STR_THROWGLASSES 3200
-#define MV_BTL38_FULL 3171
-#define SND_4_019 3134
-#define SND_4_008 3123
-#define SND_3_009 3108
-#define MV_HDLL_LOWER 3061
-#define MV_MID11_LOOK 3031
-#define QU_SC10_ENTER_DOWN 3003
-#define MV_BOT4_LEFT 2881
-#define MV_NDV_BLOW2 2855
-#define QU_SC38_ENTERLIFT 2836
-#define QU_SC10_ENTERLIFT 1067
-#define ST_LBN_5N 2765
-#define MSG_LIFT_GO 1065
-#define ST_LBN_7P 2772
-#define MV_LBN_1 2752
-#define ST_GRT9_GRIT 2722
-#define MV_PDV_GROW 2419
-#define PIC_SCD_30 2359
-#define ST_DMN38_6 2288
-#define MV_DMN38_NORM3 2250
-#define ST_PTR_NORM 2084
-#define QU_DRV_LOOKLEFT2 2034
-#define ST_BTA_NORM 2028
-#define MV_MID_LOOK 2023
-#define MV_MID_BROOM 2021
-#define MV_DRV_TORIGHT_V 2009
-#define ST_DRV_LEFT 2008
-#define ST_DRV_DRIVE 1997
-#define QU_SC26_OPEN3 1939
-#define ANI_GIRAFFE_TOP 1645
-#define ST_MSH_EMPTY 1758
-#define MV_MAN23_PUSH1 1724
-#define MV_GRFU_KISS 1682
-#define QU_GRFU_TURN_LU 1663
-#define MV_GRFB_0_1 1637
-#define PIC_SC21_UTRUBA 1554
-#define ST_CDI_EMPTY2 1543
-#define QU_SC19_MANJUMP3 1518
-#define ANI_BOY18 1477
-#define MV_KSL_JUMPBOY 1473
-#define MSG_SC17_FILLBOTTLE 1436
-#define QU_SC16_SHOWMUG 1361
-#define QU_SC13_SPIN 1386
-#define ANI_GUARD2 1279
-#define QU_GMA_JUMPBK 1251
-#define MV_INV_GUM2_default 1205
-#define MV_SWR_2_3 1152
-#define MV_MAN_GOD 481
-#define MV_MAN_STARTLADDER 452
-#define MV_TEST_JUMPFW 1074
-#define MSG_SC2_PUTMANUP 1026
-#define MSG_SC6_BTNPUSH 1017
-#define QU_NDV_MORG 971
-#define ANI_INV_COIN 875
-#define PIC_INV_HANDLE 867
-#define ST_INV_OLDGLASSES_default 404
-#define ANI_INV_OLDHANDLE 795
-#define ANI_INV_OLDEGG 364
-#define PIC_INV_SEL 868
-#define QU_SLN_BOOT_MORG 847
-#define MV_SLN_BOOT_LOOK 833
-#define PIC_SCD_SEL 734
-#define GRID_SC6_MAMASHA 684
-#define MV_MAN_JUMPONPLANK 551
-#define QU_SC4_ENTER 539
-#define QU_EGTR_SLIMBOLTLEGS 523
-#define ANI_PLANK 501
-#define MV_MAN_GOU 460
-#define ST_MAN_GOR 326
-#define rMV_EGBR_LOWERHEAD 462
-#define ST_MAN_GOLADDERD 456
-#define MV_MAN_GOLADDERDOWN 455
-#define ST_OTM_GLS_RIGHT 423
-#define MV_EGBR_BRK_GLASSES 387
-#define ST_DYAS_SITSOPEN 309
-#define ST_DYAS_SITSTOUS 312
-#define MV_DYAS_OPENBOX_LIES 323
-#define rMV_MAN_TOTRUBAHOR 447
-#define PIC_SC4_LTRUBA 506
-#define QU_SC4_GOCLOCK 595
-#define MV_MOM_SHAKE 663
-#define QU_SC6_ENTER_LEFT 708
-#define QU_BTT_DRINK 758
-#define ST_HGN_LOOK 811
-#define QU_SC9_EATBALL 942
-#define ST_VSN_LEFT 954
-#define PIC_SC10_RTRUBA 973
-#define MSG_SC2_HIDELADDER 1023
-#define QU_STR_PLUU 1189
-#define MV_HDLL_0_1 1210
-#define QU_SC16_ENTER_LEFT 1294
-#define MSG_SC16_STARTLAUGH 1374
-#define MV_MUG_0_1 1297
-#define ST_BOTTLE_FULL 1431
-#define QU_HND_TAKE1 1441
-#define QU_SC21_ENTER_UP 1629
-#define MV_GRFU_TURN_UL 1653
-#define MV_GRFU_STARTCHMOK 1657
-#define MSG_SC23_CLICKBTN2 1737
-#define MV_MAN22_HANDLEDOWN 1795
-#define PIC_SC21_DTRUBA 1823
-#define QU_SC25_LADDERUP 1925
-#define MV_CHI_SHOW 1958
-#define PIC_SC27_HITZONE 2055
-#define ANI_SHOOTER1 2108
-#define QU_DLD_ICK 2219
-#define MV_FFT_TUBE_STOP 2238
-#define MV_FFT_PIPE_BLINK 2248
-#define ANI_CACTUS 2267
-#define MV_LEG_1_2 2344
-#define PIC_SC30_LTRUBA 2354
-#define MV_LEG_POT1_OUT 2369
-#define PIC_SC31_RTRUBA 2440
-#define ANI_CACTUS_31 2456
-#define QU_SC20_SHOWSTOOL 2466
-#define ST_CTS31_GROWN2 2472
-#define MV_STL34_PUTBOX 2487
-#define MSG_SC35_STARTFLOW 2523
-#define ANI_LUK_34 2541
-#define ST_GRD37_STAND 2590
-#define QU_GRD37_LOOKR 2598
-#define PIC_SC37_WALL1 2600
-#define MV_MAN33_PUTMUG 2621
-#define ST_MUG33_FULL 2626
-#define rMV_MAN_HMRKICK 2694
-#define MV_MAN11_PUTBOOT2 2703
-#define QU_SC11_SHOWBOOT 2708
-#define ANI_DOMINO_3 2732
-#define ST_MUG17_EMPTY 2739
-#define QU_SC32_ENTER_LIFTUP 2829
-#define MSG_SC6_TESTNUMBALLS 2904
-#define MV_MAN3_GIVEBLACK_1 2914
-#define MSG_SC8_STANDUP 2976
-#define ST_BTN6_ON 2994
-#define QU_VSN_TURNR 2998
-#define MV_SWR_SPOLZING_BALD 3006
-#define MSG_SC13_CLOSEBRIDGE 3046
-#define SND_5_007 3148
-#define SND_5_018 3159
-#define MV_RPE15_NORM 3256
-#define QU_SC38_SHOWHMR 2197
-#define MV_CLN_TUZH 3324
-#define MV_MAN22_STANDTABUR_R 3331
-#define QU_SC23_SHOWSTOOL 3335
-#define MSG_SC26_CLICKVENT 1947
-#define QU_MAN_DEF_STOPSHOES2_R 3402
-#define MV_SWR_DENY_BALD 3429
-#define MV_MAN22_TRYBOOT_NOSOCK 3434
-#define QU_SC6_SND5 3580
-#define SND_8_004 3614
-#define SND_8_015 3625
-#define SND_9_003 3642
-#define SND_9_014 3658
-#define SND_11_011 3695
-#define SND_11_022 3706
-#define SND_20_002 3930
-#define SND_20_013 3946
-#define SND_22_011 3994
-#define SND_22_022 4005
-#define SND_CMN_041 4034
-#define SND_22_033 1766
-#define MV_MAN1_FALL 4228
-#define PIC_SC28_FRAME6 4263
-#define PIC_SC28_DARK2 4267
-#define MSG_SC28_TURNOFF_1 4279
-#define SND_30_003 4361
-#define QU_SC30_SND5 4368
-#define SND_30_014 4379
-#define SND_32_001 4392
-#define SND_32_012 4408
-#define SND_32_023 4419
-#define SND_32_034 4430
-#define SND_35_020 4518
-#define MV_MAN34_STANDBOX_FLOOR 4569
-#define MV_CPT36_NORM 4601
-#define MV_RHT_CLOSE 2363
-#define MV_MAN34_PUTSTOOL_BOX 4613
-#define PIC_MNU_LOAD_D 4627
-#define PIC_MSV_EMPTY_L 4640
-#define PIC_MSV_3_D 4653
-#define PIC_MSV_DOTS_L 4669
-#define MV_TBL_WALKR 4706
-#define MV_EYE30_BLINK 4717
-#define QU_EYE30_LOOK 4720
-#define SND_CMN_052 4747
-#define PIC_TEST5 4786
-#define QU_BALL_WALKL 4920
-#define QU_BRD16_TRY 4955
 #define SC_FINAL3 5001
-#define ANI_FN2_HAND1 5028
-#define MV_IN2BOOT_FALL 5141
-#define SC_18 1142
-#define SC_29 2063
-#define SND_25_030 5175
-#define MSG_LIFT_CLOSEDOOR 5194
-#define MV_MAN23_TRYBROOM 5307
-#define PIC_MAP_P11 5287
-#define QU_SC23_ENTER_DOWNTOUP 5328
-#define PIC_MAP_H19 5393
-#define PIC_MAP_S30 5252
-#define PIC_MAP_S32_2 5256
+#define SC_FINAL4 2460
+#define SC_INTRO1 3896
+#define SC_INTRO2 3907
+#define SC_INV 858
+#define SC_LDR 635
+#define SC_MAINMENU 4620
+#define SC_MAP 5222
+#define SC_TEST 903
+#define SC_TITLES 5166
+#define ST_MAN_EMPTY 476
+#define TrubaDown 697
+#define TrubaLeft 474
+#define TrubaRight 696
+#define TrubaUp 680
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_INPUT_H */


Commit: eeec3a79cb656d76617d923bbf463aa30460ba67
    https://github.com/scummvm/scummvm/commit/eeec3a79cb656d76617d923bbf463aa30460ba67
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:08-07:00

Commit Message:
FULLPIPE: Renamed gameobj.h to constants.h

Changed paths:
  A engines/fullpipe/constants.h
  R engines/fullpipe/gameobj.h
    engines/fullpipe/init.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
new file mode 100644
index 0000000..b609d7b
--- /dev/null
+++ b/engines/fullpipe/constants.h
@@ -0,0 +1,122 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_CONSTANTS_H
+#define FULLPIPE_CONSTANTS_H
+
+namespace Fullpipe {
+
+#define ANI_IN1MAN 5110
+#define ANI_INV_MAP 5321
+#define ANI_MAN 322
+#define MV_MAN_TURN_LU 486
+#define PIC_CMN_EVAL 3468
+#define PIC_CSR_ARCADE1 4901
+#define PIC_CSR_ARCADE2 4902
+#define PIC_CSR_ARCADE2_D 4903
+#define PIC_CSR_ARCADE3 4904
+#define PIC_CSR_ARCADE4 4905
+#define PIC_CSR_ARCADE5 4906
+#define PIC_CSR_ARCADE6 4907
+#define PIC_CSR_ARCADE6_D 4908
+#define PIC_CSR_ARCADE7 4909
+#define PIC_CSR_ARCADE7_D 4910
+#define PIC_CSR_ARCADE8 4911
+#define PIC_CSR_DEFAULT 4891
+#define PIC_CSR_DEFAULT_INV 4892
+#define PIC_CSR_GOD 4900
+#define PIC_CSR_GOFAR_L 4895
+#define PIC_CSR_GOFAR_R 4896
+#define PIC_CSR_GOL 4897
+#define PIC_CSR_GOR 4898
+#define PIC_CSR_GOU 4899
+#define PIC_CSR_HELPERBGR 5331
+#define PIC_CSR_ITN 4893
+#define PIC_CSR_ITN_GREEN 5330
+#define PIC_CSR_ITN_INV 4894
+#define PIC_CSR_ITN_RED 5329
+#define PIC_CSR_LIFT 5176
+#define PIC_CSR_MAP 5339
+#define PIC_INV_MENU 991
+#define PIC_MAP_A13 5275
+#define PIC_MAP_S01 5223
+#define SC_1 301
+#define SC_10 653
+#define SC_11 654
+#define SC_12 655
+#define SC_13 1137
+#define SC_14 1138
+#define SC_15 1139
+#define SC_16 1140
+#define SC_17 1141
+#define SC_18 1142
+#define SC_19 1143
+#define SC_2 302
+#define SC_20 1144
+#define SC_21 1546
+#define SC_22 1547
+#define SC_23 1548
+#define SC_24 1549
+#define SC_25 1550
+#define SC_26 1551
+#define SC_27 1552
+#define SC_28 2062
+#define SC_29 2063
+#define SC_3 303
+#define SC_30 2064
+#define SC_31 2065
+#define SC_32 2066
+#define SC_33 2067
+#define SC_34 2068
+#define SC_35 2069
+#define SC_36 2070
+#define SC_37 2071
+#define SC_38 2072
+#define SC_4 304
+#define SC_5 305
+#define SC_6 649
+#define SC_7 650
+#define SC_8 651
+#define SC_9 652
+#define SC_COMMON 321
+#define SC_DBGMENU 726
+#define SC_FINAL1 4999
+#define SC_FINAL2 5000
+#define SC_FINAL3 5001
+#define SC_FINAL4 2460
+#define SC_INTRO1 3896
+#define SC_INTRO2 3907
+#define SC_INV 858
+#define SC_LDR 635
+#define SC_MAINMENU 4620
+#define SC_MAP 5222
+#define SC_TEST 903
+#define SC_TITLES 5166
+#define ST_MAN_EMPTY 476
+#define TrubaDown 697
+#define TrubaLeft 474
+#define TrubaRight 696
+#define TrubaUp 680
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_CONSTANTS_H */
diff --git a/engines/fullpipe/gameobj.h b/engines/fullpipe/gameobj.h
deleted file mode 100644
index 7b24dd7..0000000
--- a/engines/fullpipe/gameobj.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef FULLPIPE_GAMEOBJ_H
-#define FULLPIPE_GAMEOBJ_H
-
-namespace Fullpipe {
-
-#define ANI_IN1MAN 5110
-#define ANI_INV_MAP 5321
-#define ANI_MAN 322
-#define MV_MAN_TURN_LU 486
-#define PIC_CMN_EVAL 3468
-#define PIC_CSR_ARCADE1 4901
-#define PIC_CSR_ARCADE2 4902
-#define PIC_CSR_ARCADE2_D 4903
-#define PIC_CSR_ARCADE3 4904
-#define PIC_CSR_ARCADE4 4905
-#define PIC_CSR_ARCADE5 4906
-#define PIC_CSR_ARCADE6 4907
-#define PIC_CSR_ARCADE6_D 4908
-#define PIC_CSR_ARCADE7 4909
-#define PIC_CSR_ARCADE7_D 4910
-#define PIC_CSR_ARCADE8 4911
-#define PIC_CSR_DEFAULT 4891
-#define PIC_CSR_DEFAULT_INV 4892
-#define PIC_CSR_GOD 4900
-#define PIC_CSR_GOFAR_L 4895
-#define PIC_CSR_GOFAR_R 4896
-#define PIC_CSR_GOL 4897
-#define PIC_CSR_GOR 4898
-#define PIC_CSR_GOU 4899
-#define PIC_CSR_HELPERBGR 5331
-#define PIC_CSR_ITN 4893
-#define PIC_CSR_ITN_GREEN 5330
-#define PIC_CSR_ITN_INV 4894
-#define PIC_CSR_ITN_RED 5329
-#define PIC_CSR_LIFT 5176
-#define PIC_CSR_MAP 5339
-#define PIC_INV_MENU 991
-#define PIC_MAP_A13 5275
-#define PIC_MAP_S01 5223
-#define SC_1 301
-#define SC_10 653
-#define SC_11 654
-#define SC_12 655
-#define SC_13 1137
-#define SC_14 1138
-#define SC_15 1139
-#define SC_16 1140
-#define SC_17 1141
-#define SC_18 1142
-#define SC_19 1143
-#define SC_2 302
-#define SC_20 1144
-#define SC_21 1546
-#define SC_22 1547
-#define SC_23 1548
-#define SC_24 1549
-#define SC_25 1550
-#define SC_26 1551
-#define SC_27 1552
-#define SC_28 2062
-#define SC_29 2063
-#define SC_3 303
-#define SC_30 2064
-#define SC_31 2065
-#define SC_32 2066
-#define SC_33 2067
-#define SC_34 2068
-#define SC_35 2069
-#define SC_36 2070
-#define SC_37 2071
-#define SC_38 2072
-#define SC_4 304
-#define SC_5 305
-#define SC_6 649
-#define SC_7 650
-#define SC_8 651
-#define SC_9 652
-#define SC_COMMON 321
-#define SC_DBGMENU 726
-#define SC_FINAL1 4999
-#define SC_FINAL2 5000
-#define SC_FINAL3 5001
-#define SC_FINAL4 2460
-#define SC_INTRO1 3896
-#define SC_INTRO2 3907
-#define SC_INV 858
-#define SC_LDR 635
-#define SC_MAINMENU 4620
-#define SC_MAP 5222
-#define SC_TEST 903
-#define SC_TITLES 5166
-#define ST_MAN_EMPTY 476
-#define TrubaDown 697
-#define TrubaLeft 474
-#define TrubaRight 696
-#define TrubaUp 680
-
-} // End of namespace Fullpipe
-
-#endif /* FULLPIPE_INPUT_H */
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index b1c9d6d..4e35209 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -27,7 +27,7 @@
 #include "fullpipe/objectnames.h"
 #include "fullpipe/input.h"
 
-#include "fullpipe/gameobj.h"
+#include "fullpipe/constants.h"
 
 namespace Fullpipe {
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 9f4901d..bb0d632 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -27,7 +27,7 @@
 #include "fullpipe/statics.h"
 #include "fullpipe/messages.h"
 
-#include "fullpipe/gameobj.h"
+#include "fullpipe/constants.h"
 
 #include "common/algorithm.h"
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 8a7d780..68be347 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -34,7 +34,7 @@
 #include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
 
-#include "fullpipe/gameobj.h"
+#include "fullpipe/constants.h"
 
 namespace Fullpipe {
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index d4c4948..cf63df1 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -31,7 +31,7 @@
 #include "fullpipe/scene.h"
 #include "fullpipe/statics.h"
 
-#include "fullpipe/gameobj.h"
+#include "fullpipe/constants.h"
 
 namespace Fullpipe {
 
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 2fa53e2..6c3ba3f 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -27,7 +27,7 @@
 #include "fullpipe/statics.h"
 #include "fullpipe/messages.h"
 
-#include "fullpipe/gameobj.h"
+#include "fullpipe/constants.h"
 #include "fullpipe/objectnames.h"
 
 namespace Fullpipe {


Commit: 274f7d173741e8189c5ed5fa9583aec102a38f37
    https://github.com/scummvm/scummvm/commit/274f7d173741e8189c5ed5fa9583aec102a38f37
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:08-07:00

Commit Message:
FULLPIPE: Implement stubs for ModalObject

Changed paths:
  A engines/fullpipe/modal.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 27ccb29..a8f9428 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -31,6 +31,7 @@
 #include "fullpipe/gameloader.h"
 #include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
+#include "fullpipe/modal.h"
 
 namespace Fullpipe {
 
@@ -52,6 +53,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_scrollSpeed = 0;
 	_currSoundListCount = 0;
 
+	_updateTicks = 0;
+
 	_currArchive = 0;
 
 	_soundEnabled = true;
@@ -60,7 +63,10 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_inputController = 0;
 	_inputDisabled = false;
 
-	_needQuit = false;
+	_modalObject = 0;
+
+	_gameContinue = true;
+	_needRestart = false;
 	_flgPlayIntro = true;
 
 	_musicAllowed = -1;
@@ -115,7 +121,8 @@ Common::Error FullpipeEngine::run() {
 
 	_isSaveAllowed = false;
 
-	loadGam("fullpipe.gam");
+	if (!loadGam("fullpipe.gam"))
+		return Common::kNoGameDataFoundError;
 
 	EntranceInfo ent;
 
@@ -132,43 +139,30 @@ Common::Error FullpipeEngine::run() {
 
 	_currentScene->draw();
 
-	while (!g_fullpipe->_needQuit) {
+	_gameContinue = true;
+
+	while (_gameContinue) {
 		updateEvents();
+
+		updateScreen();
+
+		if (_needRestart) {
+			if (_modalObject) {
+				delete _modalObject;
+				_modalObject = 0;
+			}
+
+			freeGameLoader();
+			_currentScene = 0;
+			_updateTicks = 0;
+			
+			loadGam("fullpipe.gam");
+			_needRestart = false;
+		}
+
 		_system->delayMillis(10);
 		_system->updateScreen();
 
-		switch (g_fullpipe->_keyState) {
-		case Common::KEYCODE_q:
-			g_fullpipe->_needQuit = true;
-			break;
-		case Common::KEYCODE_UP:
-			_sceneRect.moveTo(_sceneRect.left, _sceneRect.top + 10);
-			_currentScene->draw();
-			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
-			break;
-		case Common::KEYCODE_DOWN:
-			_sceneRect.moveTo(_sceneRect.left, _sceneRect.top - 10);
-			_currentScene->draw();
-			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
-			break;
-		case Common::KEYCODE_LEFT:
-			_sceneRect.moveTo(_sceneRect.left + 10, _sceneRect.top);
-			_currentScene->draw();
-			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
-			break;
-		case Common::KEYCODE_RIGHT:
-			_sceneRect.moveTo(_sceneRect.left - 10, _sceneRect.top);
-			_currentScene->draw();
-			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
-			break;
-		case Common::KEYCODE_z:
-			_sceneRect.moveTo(0, 0);
-			_currentScene->draw();
-			g_fullpipe->_keyState = Common::KEYCODE_INVALID;
-			break;
-		default:
-			break;
-		}
 	}
 
 
@@ -192,7 +186,7 @@ void FullpipeEngine::updateEvents() {
 			_mouseY = event.mouse.y;
 			break;
 		case Common::EVENT_QUIT:
-			_needQuit = true;
+			_gameContinue = false;
 			break;
 		default:
 			break;
@@ -200,6 +194,14 @@ void FullpipeEngine::updateEvents() {
 	}
 }
 
+void FullpipeEngine::freeGameLoader() {
+	warning("STUB: FullpipeEngine::freeGameLoader()");
+}
+
+void FullpipeEngine::updateScreen() {
+	warning("STUB: FullpipeEngine::updateScreen()");
+}
+
 int FullpipeEngine::getObjectEnumState(const char *name, const char *state) {
 	CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 760bd4e..aa3b4d8 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -44,6 +44,7 @@ enum FullpipeGameFeatures {
 };
 
 class BehaviorManager;
+class CBaseModalObject;
 class CGameLoader;
 class CGameVar;
 class CInputController;
@@ -138,8 +139,12 @@ public:
 
 	void initMap();
 	void updateMapPiece(int mapId, int update);
+	void updateScreen();
 
-	bool _needQuit;
+	void freeGameLoader();
+
+	bool _gameContinue;
+	bool _needRestart;
 	bool _flgPlayIntro;
 	int _musicAllowed;
 
@@ -160,6 +165,10 @@ public:
 	Scene *_inventoryScene;
 	CInventory2 *_inventory;
 
+	int32 _updateTicks;
+
+	CBaseModalObject *_modalObject;
+
 	int (*_updateScreenCallback)(void *);
 	int (*_updateCursorCallback)();
 
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 88b8663..997c0b6 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -406,7 +406,7 @@ void Picture::drawRotated(int x, int y, int angle) {
 }
 
 void Picture::displayPicture() {
-	if (g_fullpipe->_needQuit)
+	if (!g_fullpipe->_gameContinue)
 		return;
 
 	getData();
@@ -424,7 +424,7 @@ void Picture::displayPicture() {
 	g_fullpipe->_system->delayMillis(10);
 	g_fullpipe->_system->updateScreen();
 
-	while (!g_fullpipe->_needQuit) {
+	while (g_fullpipe->_gameContinue) {
 		g_fullpipe->updateEvents();
 		g_fullpipe->_system->delayMillis(10);
 		g_fullpipe->_system->updateScreen();
diff --git a/engines/fullpipe/modal.h b/engines/fullpipe/modal.h
new file mode 100644
index 0000000..86b166e
--- /dev/null
+++ b/engines/fullpipe/modal.h
@@ -0,0 +1,38 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_MODAL_H
+#define FULLPIPE_MODAL_H
+
+namespace Fullpipe {
+
+class CBaseModalObject {
+	int _parentObj;
+
+ public:
+ 	CBaseModalObject() : _parentObj(0) {}
+};
+
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_MODAL_H */


Commit: 1c75ebcca93bd1eb260166e17adacdcfac721099
    https://github.com/scummvm/scummvm/commit/1c75ebcca93bd1eb260166e17adacdcfac721099
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:09-07:00

Commit Message:
FULLPIPE: main loop stub

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index a8f9428..07a6651 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -165,6 +165,9 @@ Common::Error FullpipeEngine::run() {
 
 	}
 
+	freeGameLoader();
+
+	cleanup();
 
 	return Common::kNoError;
 }
@@ -198,6 +201,10 @@ void FullpipeEngine::freeGameLoader() {
 	warning("STUB: FullpipeEngine::freeGameLoader()");
 }
 
+void FullpipeEngine::cleanup() {
+	warning("STUB: FullpipeEngine::cleanup()");
+}
+
 void FullpipeEngine::updateScreen() {
 	warning("STUB: FullpipeEngine::updateScreen()");
 }
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index aa3b4d8..37dc827 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -142,6 +142,7 @@ public:
 	void updateScreen();
 
 	void freeGameLoader();
+	void cleanup();
 
 	bool _gameContinue;
 	bool _needRestart;


Commit: 856eb1b0fa92068fd7b61a8c9a6350af596f3f00
    https://github.com/scummvm/scummvm/commit/856eb1b0fa92068fd7b61a8c9a6350af596f3f00
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:09-07:00

Commit Message:
FULLPIPE: Implemented FullpipeEngine::updateScreen()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/input.cpp
    engines/fullpipe/input.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/modal.h
    engines/fullpipe/module.mk
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 07a6651..e762331 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -32,6 +32,7 @@
 #include "fullpipe/messages.h"
 #include "fullpipe/behavior.h"
 #include "fullpipe/modal.h"
+#include "fullpipe/input.h"
 
 namespace Fullpipe {
 
@@ -68,6 +69,9 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_gameContinue = true;
 	_needRestart = false;
 	_flgPlayIntro = true;
+	_flgSavegameMenuRequested = false;
+
+	_isProcessingMessages = false;
 
 	_musicAllowed = -1;
 
@@ -87,6 +91,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_msgY = 0;
 	_msgObjectId2 = 0;
 	_msgId = 0;
+	_mouseVirtX = 0;
+	_mouseVirtY = 0;
 
 	_behaviorManager = 0;
 
@@ -206,7 +212,45 @@ void FullpipeEngine::cleanup() {
 }
 
 void FullpipeEngine::updateScreen() {
-	warning("STUB: FullpipeEngine::updateScreen()");
+	_mouseVirtX = _mouseX + _sceneRect.left;
+	_mouseVirtY = _mouseY + _sceneRect.top;
+
+	//if (inputArFlag)
+	//	updateGame_inputArFlag();
+
+	if (_modalObject || _flgSavegameMenuRequested && (_gameLoader->updateSystems(42), _modalObject != 0)) {
+		if (_flgSavegameMenuRequested) {
+			if (_modalObject->init(42)) {
+				_modalObject->update();
+			} else {
+				_modalObject->saveload();
+				CBaseModalObject *tmp = _modalObject->_parentObj;
+
+				if (_modalObject)
+					delete _modalObject;
+
+				_modalObject = tmp;
+			}
+		}
+	} else if (_currentScene) {
+		_currentScene->draw();
+
+		if (_inventoryScene)
+			_inventory->draw();
+
+		if (_updateScreenCallback)
+			_updateScreenCallback();
+
+		//if (inputArFlag && _currentScene) {
+		//	vrtTextOut(*(_DWORD *)g_vrtHandle, smallNftData, "DEMO", 4, 380, 580);
+		//	vrtTextOut(*(_DWORD *)g_vrtHandle, smallNftData, "Alt+F4 - exit", 14, 695, 580);
+		//}
+	} else {
+		//vrtRectangle(*(_DWORD *)g_vrtHandle, 0, 0, 0, 800, 600);
+	}
+	_inputController->drawCursor(_mouseX, _mouseY);
+
+	++_updateTicks;
 }
 
 int FullpipeEngine::getObjectEnumState(const char *name, const char *state) {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 37dc827..15bb28f 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -108,6 +108,7 @@ public:
 	bool _savesEnabled;
 	bool _updateFlag;
 	bool _flgCanOpenMap;
+	bool _flgSavegameMenuRequested;
 
 	Common::Rect _sceneRect;
 	int _sceneWidth;
@@ -133,6 +134,12 @@ public:
 	int _msgObjectId2;
 	int _msgId;
 
+	Common::List<ExCommand *> _exCommandList;
+	bool _isProcessingMessages;
+
+	int _mouseVirtX;
+	int _mouseVirtY;
+
 	BehaviorManager *_behaviorManager;
 
 	MovTable *_movTable;
@@ -170,7 +177,7 @@ public:
 
 	CBaseModalObject *_modalObject;
 
-	int (*_updateScreenCallback)(void *);
+	int (*_updateScreenCallback)();
 	int (*_updateCursorCallback)();
 
 	int _cursorId;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 1d53cd3..939da17 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -225,6 +225,12 @@ bool CGameLoader::gotoScene(int sceneId, int entranceId) {
 	return true;
 }
 
+bool CGameLoader::preloadScene(int sceneId, int entranceId) {
+	warning("STUB: preloadScene(%d, %d), ", sceneId, entranceId);
+
+	return true;
+}
+
 int CGameLoader::getSceneTagBySceneId(int sceneId, SceneTag **st) {
 	if (_sc2array.size() > 0 && _gameProject->_sceneTagList->size() > 0) {
 		for (uint i = 0; i < _sc2array.size(); i++) {
@@ -248,6 +254,25 @@ void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAn
 	warning("STUB: CGameLoader::applyPicAniInfo()");
 }
 
+void CGameLoader::updateSystems(int counterdiff) {
+	if (g_fullpipe->_currentScene) {
+		g_fullpipe->_currentScene->update(counterdiff);
+
+		_exCommand._messageKind = 17;
+		_updateCounter++;
+		_exCommand._messageNum = 33;
+		_exCommand._excFlags = 0;
+		postMessage(&_exCommand);
+	}
+
+	processMessages();
+
+	if (_preloadId1) {
+		processMessages();
+		preloadScene(_preloadId1, _preloadId2);
+	}
+}
+
 CGameVar *FullpipeEngine::getGameLoaderGameVar() {
 	if (_gameLoader)
 		return _gameLoader->_gameVar;
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 36c99f2..4ba4829 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -41,6 +41,9 @@ class CGameLoader : public CObject {
 	virtual bool load(MfcArchive &file);
 	bool loadScene(int sceneId);
 	bool gotoScene(int sceneId, int entranceId);
+	bool preloadScene(int sceneId, int entranceId);
+
+	void updateSystems(int counterdiff);
 
 	int getSceneTagBySceneId(int sceneId, SceneTag **st);
 	void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index bb6d8ba..78c6e50 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -78,6 +78,10 @@ void CInputController::setCursorMode(bool enabled) {
 		_inputFlags &= ~1;
 }
 
+void CInputController::drawCursor(int x, int y) {
+	warning("STUB: CInputController::drawCursor(%d, %d)", x, y);
+}
+
 CursorInfo::CursorInfo() {
 	pictureId = 0;
 	picture = 0;
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
index 72742b0..06013ab 100644
--- a/engines/fullpipe/input.h
+++ b/engines/fullpipe/input.h
@@ -63,6 +63,8 @@ class CInputController {
 	void setInputDisabled(bool state);
 	void addCursor(CursorInfo *cursor);
 	void setCursorMode(bool mode);
+
+	void drawCursor(int x, int y);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 8df06e6..c88d6f9 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -97,7 +97,7 @@ bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartia
 }
 
 void CInventory2::addItem(int itemId, int value) {
-	warning("STUB: CInventory2::addItem");
+	warning("STUB: CInventory2::addItem(%d, %d)", itemId, value);
 }
 
 void CInventory2::rebuildItemRects() {
@@ -106,4 +106,8 @@ void CInventory2::rebuildItemRects() {
 	warning("STUB: CInventory2::rebuildItemRects()");
 }
 
+void CInventory2::draw() {
+	warning("STUB: CInventory2::draw()");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 36170b8..a61df38 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -101,6 +101,7 @@ class CInventory2 : public CInventory {
 
 	Scene *getScene() { return _scene; }
 
+	void draw();
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 69b29dc..ee9210f 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -79,6 +79,10 @@ bool ExCommand::load(MfcArchive &file) {
 	return true;
 }
 
+void ExCommand::handleMessage() {
+	warning("STUB: ExCommand::handleMessage()");
+}
+
 Message::Message() {
 	_messageKind = 0;
 	_parentId = 0;
@@ -416,4 +420,21 @@ void clearMessageHandlers() {
 	}
 }
 
+void postMessage(ExCommand *ex) {
+	g_fullpipe->_exCommandList.push_back(ex);
+}
+
+void processMessages() {
+	if (!g_fullpipe->_isProcessingMessages) {
+		g_fullpipe->_isProcessingMessages = true;
+
+		while (g_fullpipe->_exCommandList.size()) {
+			ExCommand *ex = g_fullpipe->_exCommandList.front();
+			ex->handleMessage();
+			g_fullpipe->_exCommandList.pop_front();
+		}
+		g_fullpipe->_isProcessingMessages = false;
+	}
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index c8fe264..0ae11ff 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -69,6 +69,8 @@ class ExCommand : public Message {
 	virtual ~ExCommand() {}
 
 	virtual bool load(MfcArchive &file);
+
+	void handleMessage();
 };
 
 class CObjstateCommand : public CObject {
@@ -138,7 +140,8 @@ int getMessageHandlersCount();
 bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id);
 bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
 void clearMessageHandlers();
-
+void postMessage(ExCommand *ex);
+void processMessages();
 
 } // End of namespace Fullpipe
 
diff --git a/engines/fullpipe/modal.h b/engines/fullpipe/modal.h
index 86b166e..fb22798 100644
--- a/engines/fullpipe/modal.h
+++ b/engines/fullpipe/modal.h
@@ -26,12 +26,20 @@
 namespace Fullpipe {
 
 class CBaseModalObject {
-	int _parentObj;
+ public:
+
+	CBaseModalObject *_parentObj;
 
  public:
  	CBaseModalObject() : _parentObj(0) {}
-};
+	virtual ~CBaseModalObject() {}
 
+	virtual bool handleMessage(ExCommand *message);
+	virtual bool init(int counterdiff);
+	virtual bool update();
+
+	void saveload();
+};
 
 } // End of namespace Fullpipe
 
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 1771036..602478c 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -10,6 +10,7 @@ MODULE_OBJS = \
 	input.o \
 	inventory.o \
 	messages.o \
+	modal.o \
 	motion.o \
 	ngiarchive.o \
 	scene.o \
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index bb0d632..146cd6e 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -406,6 +406,11 @@ void Scene::updateScrolling() {
 	warning("STUB Scene::updateScrolling()");
 }
 
+void Scene::update(int counterdiff) {
+	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s)
+		((StaticANIObject *)*s)->update(counterdiff);
+}
+
 void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	if (!_picObjList.size() && !_bigPictureArray1Count)
 		return;
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index b3dbdcc..2a6fafd 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -54,6 +54,8 @@ class Scene : public Background {
 	void drawContent(int minPri, int maxPri, bool drawBG);
 	void updateScrolling();
 
+	void update(int counterdiff);
+
 	StaticANIObject *getAniMan();
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
 	StaticANIObject *getStaticANIObject1ByName(char *name, int a3);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 6c3ba3f..5d0ba0d 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -352,6 +352,10 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
 	return &p;
 }
 
+void StaticANIObject::update(int counterdiff) {
+	warning("STUB: StaticANIObject::update(%d)", counterdiff);
+}
+
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index bfd7e70..ccac7de 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -195,6 +195,8 @@ class StaticANIObject : public GameObject {
 	void initMovements();
 	void loadMovementsPixelData();
 
+	void update(int counterdiff);
+
 	Statics *addReverseStatics(Statics *ani);
 	void draw();
 	void draw2();


Commit: 6e64897e725e06fe00a39629fdfd7dec35a9574f
    https://github.com/scummvm/scummvm/commit/6e64897e725e06fe00a39629fdfd7dec35a9574f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:09-07:00

Commit Message:
FULLPIPE: Rename some CGameLoader members

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 939da17..c627550 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -62,8 +62,8 @@ CGameLoader::CGameLoader() {
 	_preloadCallback = 0;
 	_readSavegameCallback = 0;
 	_gameVar = 0;
-	_preloadId1 = 0;
-	_preloadId2 = 0;
+	_preloadSceneId = 0;
+	_preloadEntranceId = 0;
 	_updateCounter = 0;
 
 	g_fullpipe->_msgX = 0;
@@ -267,9 +267,9 @@ void CGameLoader::updateSystems(int counterdiff) {
 
 	processMessages();
 
-	if (_preloadId1) {
+	if (_preloadSceneId) {
 		processMessages();
-		preloadScene(_preloadId1, _preloadId2);
+		preloadScene(_preloadSceneId, _preloadEntranceId);
 	}
 }
 
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 4ba4829..e1a0bac 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -63,8 +63,8 @@ class CGameLoader : public CObject {
 	char *_gameName;
 	ExCommand _exCommand;
 	int _updateCounter;
-	int _preloadId1;
-	int _preloadId2;
+	int _preloadSceneId;
+	int _preloadEntranceId;
 };
 
 CInventory2 *getGameLoaderInventory();


Commit: 633a0fcd86e47b16d77be32a822f3e57120b9796
    https://github.com/scummvm/scummvm/commit/633a0fcd86e47b16d77be32a822f3e57120b9796
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:09-07:00

Commit Message:
FULLPIPE: Fix scene loading

Changed paths:
    engines/fullpipe/gameloader.cpp



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index c627550..7ae5919 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -135,7 +135,7 @@ bool CGameLoader::loadScene(int sceneId) {
 	if (idx < 0)
 		return false;
 
-	if (st->_scene)
+	if (!st->_scene)
 		st->loadScene();
 
 	if (st->_scene) {
@@ -184,7 +184,7 @@ bool CGameLoader::gotoScene(int sceneId, int entranceId) {
 		sg->setSubVarAsInt("Entrance", entranceId);
 
 	if (!g_fullpipe->sceneSwitcher(_sc2array[sc2idx]._entranceData[entranceIdx]))
-		return 0;
+		return false;
 
 	g_fullpipe->_msgObjectId2 = 0;
 	g_fullpipe->_msgY = -1;


Commit: 9232315880633e66f99e874623446664ca262719
    https://github.com/scummvm/scummvm/commit/9232315880633e66f99e874623446664ca262719
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:09-07:00

Commit Message:
FULLPIPE: Fix CGameVar::addSubVar()

Changed paths:
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index cf63df1..c49dafc 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -318,12 +318,12 @@ bool CGameVar::addSubVar(CGameVar *subvar) {
 
 		var->_nextVarObj = subvar;
 		subvar->_prevVarObj = var;
-		subvar->_parentVarObj = var;
+		subvar->_parentVarObj = this;
 
 		return true;
 	} else {
-		var->_subVars = subvar;
-		subvar->_parentVarObj = var;
+		_subVars = subvar;
+		subvar->_parentVarObj = this;
 
 		return true;
 	}


Commit: c78803db2d38afed1cd0a55aff5b599c7441172c
    https://github.com/scummvm/scummvm/commit/c78803db2d38afed1cd0a55aff5b599c7441172c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:09-07:00

Commit Message:
FULLPIPE: Unstubbed ExCommand::handleMessage()

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index e9d4be8..e7d1bc9 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -33,7 +33,7 @@ BehaviorManager::BehaviorManager() {
 }
 
 void BehaviorManager::initBehavior(Scene *scene, CGameVar *var) {
-	warning("STUB: initBehavior()");
+	warning("STUB: BehaviorManager::initBehavior()");
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index ee9210f..e7b3171 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -79,8 +79,23 @@ bool ExCommand::load(MfcArchive &file) {
 	return true;
 }
 
-void ExCommand::handleMessage() {
-	warning("STUB: ExCommand::handleMessage()");
+bool ExCommand::handleMessage() {
+	int cnt = 0;
+	for (MessageHandler *m = g_fullpipe->_messageHandlers; m; m = m->nextItem)
+		cnt += m->callback(this);
+
+	if (_messageKind == 17 || (_excFlags & 1)) {
+		if (_parId) {
+			MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_parId);
+			if (m)
+				m->update();
+		}
+	}
+
+	if (_excFlags & 2)
+		delete this;
+
+	return (cnt > 0);
 }
 
 Message::Message() {
@@ -213,6 +228,25 @@ bool MessageQueue::chain(StaticANIObject *ani) {
 	return true;
 }
 
+void MessageQueue::update() {
+	if (_counter > 0)
+		_counter--;
+
+	if (_exCommands.size()) {
+		sendNextCommand();
+	} else if (_counter == 0 ) {
+		_isFinished = 1;
+		finish();
+	}
+}
+
+void MessageQueue::sendNextCommand() {
+	warning("STUB: MessageQueue::sendNextCommand()");
+}
+
+void MessageQueue::finish() {
+	warning("STUB: MessageQueue::finish()");
+}
 
 MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
 	for (CPtrList::iterator s = begin(); s != end(); ++s) {
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 0ae11ff..9a2f013 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -70,7 +70,7 @@ class ExCommand : public Message {
 
 	virtual bool load(MfcArchive &file);
 
-	void handleMessage();
+	bool handleMessage();
 };
 
 class CObjstateCommand : public CObject {
@@ -111,6 +111,9 @@ class MessageQueue : public CObject {
 	void setFlags(int flags) { _flags = flags; }
 
 	bool chain(StaticANIObject *ani);
+	void update();
+	void sendNextCommand();
+	void finish();
 };
 
 class GlobalMessageQueueList : public CPtrList {


Commit: da7ef001730b3fdefbf5bdae9a229484c332d4a9
    https://github.com/scummvm/scummvm/commit/da7ef001730b3fdefbf5bdae9a229484c332d4a9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:10-07:00

Commit Message:
FULLPIPE: Implement MessageQueue::sendNextCommand()

Changed paths:
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h



diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index e7b3171..9260da6 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -98,6 +98,12 @@ bool ExCommand::handleMessage() {
 	return (cnt > 0);
 }
 
+void ExCommand::sendMessage() {
+	g_fullpipe->_exCommandList.push_back(this);
+
+	processMessages();
+}
+
 Message::Message() {
 	_messageKind = 0;
 	_parentId = 0;
@@ -240,8 +246,29 @@ void MessageQueue::update() {
 	}
 }
 
+void MessageQueue::messageQueueCallback1(int par) {
+	warning("STUB: MessageQueue::messageQueueCallback1()");
+}
+
 void MessageQueue::sendNextCommand() {
-	warning("STUB: MessageQueue::sendNextCommand()");
+	if (_exCommands.size()) {
+		if (!(_flags & 4) && (_flags & 1)) {
+			messageQueueCallback1(16);
+		}
+		ExCommand *ex = (ExCommand *)_exCommands.front();
+		_exCommands.remove_at(0);
+
+		ex->handleMessage();
+		_counter++;
+		ex->_parId = _id;
+		ex->_excFlags |= (ex->_field_24 == 0 ? 1 : 0) | (ex->_field_3C != 0 ? 2 : 0);
+
+		_flags |= 4;
+		ex->sendMessage();
+	} else if (_counter <= 0) {
+		_isFinished = 1;
+		finish();
+	}
 }
 
 void MessageQueue::finish() {
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 9a2f013..da91fd2 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -71,6 +71,7 @@ class ExCommand : public Message {
 	virtual bool load(MfcArchive &file);
 
 	bool handleMessage();
+	void sendMessage();
 };
 
 class CObjstateCommand : public CObject {
@@ -114,6 +115,8 @@ class MessageQueue : public CObject {
 	void update();
 	void sendNextCommand();
 	void finish();
+
+	void messageQueueCallback1(int par);
 };
 
 class GlobalMessageQueueList : public CPtrList {


Commit: ce0af03a4a0bf7e52c9f2b8e53f107e66b6a8c6d
    https://github.com/scummvm/scummvm/commit/ce0af03a4a0bf7e52c9f2b8e53f107e66b6a8c6d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:10-07:00

Commit Message:
FULLPIPE: Implement Movement::initStatics()

Changed paths:
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 5d0ba0d..5b889d7 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -562,7 +562,31 @@ Common::Point *Movement::getDimensionsOfPhase(Common::Point *p, int phaseIndex)
 }
 
 void Movement::initStatics(StaticANIObject *ani) {
-	warning("STUB: Movement::initStatics");
+	if (!_currMovement)
+		return;
+
+	_staticsObj2 = ani->addReverseStatics(_currMovement->_staticsObj2);
+	_staticsObj1 = ani->addReverseStatics(_currMovement->_staticsObj1);
+	
+	_mx = _currMovement->_mx;
+	_my = _currMovement->_my;
+
+	_currMovement->setDynamicPhaseIndex(_currMovement->_updateFlag1 != 0 ? 1 : 0);
+
+	Common::Point point;
+
+	int x1 = _currMovement->_staticsObj1->getDimensions(&point)->x - _mx;
+
+	_mx = x1 - _currMovement->_currDynamicPhase->getDimensions(&point)->x;
+
+	_currMovement->setDynamicPhaseIndex(_currMovement->_currDynamicPhaseIndex);
+
+	_m2x = _currMovement->_m2x;
+	_m2y = _currMovement->_m2y;
+	_currMovement->gotoLastFrame();
+
+	x1 = _currMovement->_staticsObj2->getDimensions(&point)->x;
+	_m2x = _currMovement->_currDynamicPhase->getDimensions(&point)->x - _m2x - x1;
 }
 
 void Movement::updateCurrDynamicPhase() {
@@ -574,6 +598,10 @@ void Movement::updateCurrDynamicPhase() {
 	}
 }
 
+void Movement::setDynamicPhaseIndex(int index) {
+	warning("STUB: Movement::setDynamicPhaseIndex(%d)", index);
+}
+
 void Movement::loadPixelData() {
 	Movement *mov = this;
 	for (Movement *i = _currMovement; i; i = i->_currMovement)
@@ -612,6 +640,10 @@ void Movement::gotoNextFrame(int callback1, int callback2) {
 	warning("STUB: Movement::gotoNextFrame()");
 }
 
+void Movement::gotoLastFrame() {
+	warning("STUB: Movement::gotoLastFrame()");
+}
+
 Common::Point *Movement::getCenter(Common::Point *p) {
 	Common::Rect rect;
 
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index ccac7de..e3711e6 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -143,8 +143,11 @@ class Movement : public GameObject {
 	void initStatics(StaticANIObject *ani);
 	void updateCurrDynamicPhase();
 
+	void setDynamicPhaseIndex(int index);
+
 	void removeFirstPhase();
 	void gotoNextFrame(int callback1, int callback2);
+	void gotoLastFrame();
 
 	void loadPixelData();
 


Commit: 766c5552fe7162246afc46070c1bb27aa2ef2963
    https://github.com/scummvm/scummvm/commit/766c5552fe7162246afc46070c1bb27aa2ef2963
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:10-07:00

Commit Message:
FULLPIPE: Implement Movement::gotoLastFrame() and Movement::setDynamicPhaseIndex()

Changed paths:
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 5b889d7..20ce75f 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -599,7 +599,11 @@ void Movement::updateCurrDynamicPhase() {
 }
 
 void Movement::setDynamicPhaseIndex(int index) {
-	warning("STUB: Movement::setDynamicPhaseIndex(%d)", index);
+	while (_currDynamicPhaseIndex < index)
+		gotoNextFrame(0, 0);
+
+	while (_currDynamicPhaseIndex > index)
+		gotoPrevFrame(0, 0);
 }
 
 void Movement::loadPixelData() {
@@ -640,8 +644,18 @@ void Movement::gotoNextFrame(int callback1, int callback2) {
 	warning("STUB: Movement::gotoNextFrame()");
 }
 
+void Movement::gotoPrevFrame(int callback1, int callback2) {
+	warning("STUB: Movement::gotoPrevFrame()");
+}
+
 void Movement::gotoLastFrame() {
-	warning("STUB: Movement::gotoLastFrame()");
+	if (_currMovement) {
+		while ((uint)_currDynamicPhaseIndex != _currMovement->_dynamicPhases.size())
+			gotoNextFrame(0, 0);
+	} else {
+		while ((uint)_currDynamicPhaseIndex != _dynamicPhases.size())
+			gotoNextFrame(0, 0);
+	}
 }
 
 Common::Point *Movement::getCenter(Common::Point *p) {
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index e3711e6..5366f71 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -147,6 +147,7 @@ class Movement : public GameObject {
 
 	void removeFirstPhase();
 	void gotoNextFrame(int callback1, int callback2);
+	void gotoPrevFrame(int callback1, int callback2);
 	void gotoLastFrame();
 
 	void loadPixelData();


Commit: 35fbf39448f2450db4d03760a0a1e227a68c9cb0
    https://github.com/scummvm/scummvm/commit/35fbf39448f2450db4d03760a0a1e227a68c9cb0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:10-07:00

Commit Message:
FULLPIPE: Implement Movement::gotoNextFrame()

Changed paths:
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 20ce75f..0bb61fb 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -641,7 +641,108 @@ void Movement::removeFirstPhase() {
 }
 
 void Movement::gotoNextFrame(int callback1, int callback2) {
-	warning("STUB: Movement::gotoNextFrame()");
+	if (!callback2) {
+		if (_currMovement) {
+			if ((uint)_currDynamicPhaseIndex == _currMovement->_dynamicPhases.size() - 1
+				&& !(((DynamicPhase *)(_currMovement->_dynamicPhases.back()))->_countdown))
+				return;
+		} else if ((uint)_currDynamicPhaseIndex == _dynamicPhases.size() - 1
+					&& !(((DynamicPhase *)(_dynamicPhases.back()))->_countdown))
+			return;
+	}
+
+	if (_currDynamicPhase->_countdown) {
+		_currDynamicPhase->_countdown--;
+		return;
+	}
+
+	Common::Point point;
+
+	getCurrDynamicPhaseXY(point);
+	_ox -= point.x;
+	_oy -= point.y;
+
+	int deltax = 0;
+
+	if (_currMovement)
+		deltax = _currMovement->getDimensionsOfPhase(&point, _currDynamicPhaseIndex)->x;
+
+	int oldDynIndex = _currDynamicPhaseIndex;
+
+	if (callback2)
+		; //callback2(&_currDynamicPhaseIndex);
+	else
+		_currDynamicPhaseIndex++;
+
+	if (_currMovement) {
+		if (_currMovement->_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex)
+			_currDynamicPhaseIndex = _currMovement->_dynamicPhases.size() - 1;
+		if (_currDynamicPhaseIndex < 0)
+			_currDynamicPhaseIndex = 0;
+		if (_currMovement->_framePosOffsets) {
+			if (callback1) {
+				point = *_currMovement->_framePosOffsets[_currDynamicPhaseIndex];
+				//callback1(_currDynamicPhaseIndex, &point, _ox, _oy);
+
+				_ox += deltax - point.x;
+				_oy += point.y;
+
+				_ox -= _currMovement->getDimensionsOfPhase(&point, _currDynamicPhaseIndex)->x;
+			} else if (oldDynIndex >= _currDynamicPhaseIndex) {
+				while (oldDynIndex > _currDynamicPhaseIndex) {
+					_ox += deltax;
+					deltax = _currMovement->getDimensionsOfPhase(&point, oldDynIndex)->x;
+
+					_ox += _currMovement->_framePosOffsets[oldDynIndex]->x;
+					_oy -= _currMovement->_framePosOffsets[oldDynIndex]->y;
+					oldDynIndex--;
+
+					_ox -= _currMovement->getDimensionsOfPhase(&point, oldDynIndex)->x;
+				}
+			} else {
+				for (int i = oldDynIndex + 1; i <= _currDynamicPhaseIndex; i++) {
+					_ox += deltax;
+					deltax = _currMovement->getDimensionsOfPhase(&point, i)->x;
+					_ox -= _currMovement->_framePosOffsets[i]->x;
+					_oy += _currMovement->_framePosOffsets[i]->y;
+					_ox -= _currMovement->getDimensionsOfPhase(&point, i)->x;
+				}
+			}
+		}
+	} else {
+		if (_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex)
+			_currDynamicPhaseIndex = _dynamicPhases.size() - 1;
+		if (_currDynamicPhaseIndex < 0)
+			_currDynamicPhaseIndex = 0;
+
+		if (_framePosOffsets) {
+			if (callback1) {
+				point.x = _framePosOffsets[_currDynamicPhaseIndex]->x;
+				point.y = _framePosOffsets[_currDynamicPhaseIndex]->y;
+
+				//callback1(_currDynamicPhaseIndex, &point, _ox, _oy);
+				_ox += point.x;
+				_oy += point.y;
+			} else if (oldDynIndex >= _currDynamicPhaseIndex) {
+				for (int i = oldDynIndex; i > _currDynamicPhaseIndex; i--) {
+					_ox -= _framePosOffsets[i]->x;
+					_oy -= _framePosOffsets[i]->y;
+				}
+			} else {
+				for (int i = oldDynIndex + 1; i <= _currDynamicPhaseIndex; i++) {
+					_ox += _framePosOffsets[i]->x;
+					_oy += _framePosOffsets[i]->y;
+				}
+			}
+		}
+	}
+
+	updateCurrDynamicPhase();
+	getCurrDynamicPhaseXY(point);
+	_ox += point.x;
+	_oy += point.y;
+
+	_currDynamicPhase->_countdown = _currDynamicPhase->_initialCountdown;
 }
 
 void Movement::gotoPrevFrame(int callback1, int callback2) {
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 5366f71..c80956c 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -46,6 +46,7 @@ class CStepArray : public CObject {
 
 class StaticPhase : public Picture {
 	friend class DynamicPhase;
+	friend class Movement;
 
 	int16 _initialCountdown;
 	int16 _countdown;


Commit: ab190d2f0b4c102d277b16adf66269d9a6380b81
    https://github.com/scummvm/scummvm/commit/ab190d2f0b4c102d277b16adf66269d9a6380b81
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:10-07:00

Commit Message:
FULLPIPE: Fix Movement::gotoLastFrame()

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 0bb61fb..d54b1d1 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -641,14 +641,18 @@ void Movement::removeFirstPhase() {
 }
 
 void Movement::gotoNextFrame(int callback1, int callback2) {
+	debug(0, "Movement::gotoNextFrame(%d, %d)", callback1, callback2);
+
 	if (!callback2) {
 		if (_currMovement) {
 			if ((uint)_currDynamicPhaseIndex == _currMovement->_dynamicPhases.size() - 1
-				&& !(((DynamicPhase *)(_currMovement->_dynamicPhases.back()))->_countdown))
+				&& !(((DynamicPhase *)(_currMovement->_dynamicPhases.back()))->_countdown)) {
 				return;
+			}
 		} else if ((uint)_currDynamicPhaseIndex == _dynamicPhases.size() - 1
-					&& !(((DynamicPhase *)(_dynamicPhases.back()))->_countdown))
+				   && !(((DynamicPhase *)(_dynamicPhases.back()))->_countdown)) {
 			return;
+		}
 	}
 
 	if (_currDynamicPhase->_countdown) {
@@ -751,10 +755,10 @@ void Movement::gotoPrevFrame(int callback1, int callback2) {
 
 void Movement::gotoLastFrame() {
 	if (_currMovement) {
-		while ((uint)_currDynamicPhaseIndex != _currMovement->_dynamicPhases.size())
+		while ((uint)_currDynamicPhaseIndex != _currMovement->_dynamicPhases.size() - 1)
 			gotoNextFrame(0, 0);
 	} else {
-		while ((uint)_currDynamicPhaseIndex != _dynamicPhases.size())
+		while ((uint)_currDynamicPhaseIndex != _dynamicPhases.size() - 1)
 			gotoNextFrame(0, 0);
 	}
 }


Commit: 7257d8804b8b05d8078055b9e705ea0cbe7e465f
    https://github.com/scummvm/scummvm/commit/7257d8804b8b05d8078055b9e705ea0cbe7e465f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Implement CGameLoader::applyPicAniInfos()

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 7ae5919..46cd557 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -251,7 +251,52 @@ int CGameLoader::getSceneTagBySceneId(int sceneId, SceneTag **st) {
 }
 
 void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount) {
-	warning("STUB: CGameLoader::applyPicAniInfo()");
+	if (picAniInfoCount <= 0)
+		return;
+
+	PictureObject *pict;
+	StaticANIObject *ani;
+
+	for (int i = 0; i < picAniInfoCount; i++) {
+		if (picAniInfo[i]->type & 2) {
+			pict = sc->getPictureObjectById(picAniInfo[i]->objectId, picAniInfo[i]->field_8);
+			if (pict) {
+				pict->setPicAniInfo(picAniInfo[i]);
+				continue;
+			}
+			pict = sc->getPictureObjectById(picAniInfo[i]->objectId, 0);
+			if (pict) {
+				PictureObject *pictNew = new PictureObject(pict);
+
+				sc->_picObjList.push_back(pictNew);
+				pictNew->setPicAniInfo(picAniInfo[i]);
+				continue;
+			}
+		} else {
+			if (!(picAniInfo[i]->type & 1))
+				continue;
+
+			Scene *scNew = g_fullpipe->accessScene(picAniInfo[i]->sceneId);
+			if (!scNew)
+				continue;
+
+			ani = sc->getStaticANIObject1ById(picAniInfo[i]->objectId, picAniInfo[i]->field_8);
+			if (ani) {
+				ani->setPicAniInfo(picAniInfo[i]);
+				continue;
+			}
+
+			ani = scNew->getStaticANIObject1ById(picAniInfo[i]->objectId, 0);
+			if (ani) {
+				StaticANIObject *aniNew = new StaticANIObject(ani);
+
+				sc->addStaticANIObject(aniNew, 1);
+
+				aniNew->setPicAniInfo(picAniInfo[i]);
+				continue;
+			}
+		}
+	}
 }
 
 void CGameLoader::updateSystems(int counterdiff) {
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 997c0b6..c677d0e 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -119,6 +119,13 @@ PictureObject::PictureObject() {
 	_picture = 0;
 }
 
+PictureObject::PictureObject(PictureObject *src) : GameObject(src) {
+	_picture = src->_picture;
+	_ox2 = _ox;
+	_oy2 = _oy;
+	_pictureObject2List = src->_pictureObject2List;
+}
+
 bool PictureObject::load(MfcArchive &file, bool bigPicture) {
 	debug(5, "PictureObject::load()");
 	GameObject::load(file);
@@ -164,6 +171,26 @@ void PictureObject::draw() {
 		_picture->draw(_ox, _oy, 0, 0);
 }
 
+bool PictureObject::setPicAniInfo(PicAniInfo *picAniInfo) {
+	if (!(picAniInfo->type & 2) || (picAniInfo->type & 1)) {
+		error("Picture::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
+
+		return false;
+	}
+
+	if (picAniInfo->type & 2) {
+		setOXY(picAniInfo->ox, picAniInfo->oy);
+		_priority = picAniInfo->priority;
+		_field_4 = picAniInfo->field_8;
+		setFlags(picAniInfo->flags);
+		_field_8 = picAniInfo->field_24;
+
+		return true;
+	}
+
+	return false;
+}
+
 GameObject::GameObject() {
 	_field_4 = 0;
 	_flags = 0;
@@ -175,6 +202,21 @@ GameObject::GameObject() {
 	_field_8 = 0;
 }
 
+GameObject::GameObject(GameObject *src) {
+	_field_4 = 1;
+	_flags = 0;
+	_id = src->_id;
+
+	_objectName = (char *)calloc(strlen(src->_objectName) + 1, 1);
+	strncpy(_objectName, src->_objectName, strlen(src->_objectName));
+
+	_ox = src->_ox;
+	_oy = src->_oy;
+	_priority = src->_priority;
+	_field_20 = 1;
+	_field_8 = src->_field_8;
+}
+
 bool GameObject::load(MfcArchive &file) {
 	debug(5, "GameObject::load()");
 	_field_4 = 0;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 1dbdd28..2ee34e1 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -29,6 +29,7 @@ namespace Fullpipe {
 
 class DynamicPhase;
 class Movement;
+struct PicAniInfo;
 
 struct Bitmap {
 	int _x;
@@ -121,6 +122,8 @@ class GameObject : public CObject {
 
   public:
 	GameObject();
+	GameObject(GameObject *src);
+
 	virtual bool load(MfcArchive &file);
 	void setOXY(int x, int y);
 	void renumPictures(CPtrList *lst);
@@ -138,9 +141,13 @@ class PictureObject : public GameObject {
 
   public:
 	PictureObject();
+	PictureObject(PictureObject *src);
+
 	bool load(MfcArchive &file, bool bigPicture);
 	Common::Point *getDimensions(Common::Point *p);
 	void draw();
+
+	bool setPicAniInfo(PicAniInfo *picAniInfo);
 };
 
 class Background : public CObject {
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index ba65181..133320f 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -86,7 +86,7 @@ struct PicAniInfo {
 	int16 objectId;
 	int16 field_6;
 	int32 field_8;
-	int16 field_C;
+	int16 sceneId;
 	int16 field_E;
 	int32 ox;
 	int32 oy;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index c49dafc..cd931b1 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -420,7 +420,7 @@ bool PicAniInfo::load(MfcArchive &file) {
 	objectId = file.readUint16LE();
 	field_6 = file.readUint16LE();
 	field_8 = file.readUint32LE();
-	field_C = file.readUint16LE();
+	sceneId = file.readUint16LE();
 	field_E = file.readUint16LE();
 	ox = file.readUint32LE();
 	oy = file.readUint32LE();
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index d54b1d1..72a1080 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -79,6 +79,10 @@ StaticANIObject::StaticANIObject() {
 	_someDynamicPhaseIndex = -1;
 }
 
+StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
+	warning("STUB: StaticANIObject(src)");
+}
+
 bool StaticANIObject::load(MfcArchive &file) {
 	debug(5, "StaticANIObject::load()");
 
@@ -269,7 +273,7 @@ void StaticANIObject::draw() {
 			angle = _field_30 ^ 0x4000;
 	}
 
-	if (!_movement || _flags & 0x20) {
+	if (!_movement || (_flags & 0x20)) {
 		_statics->getSomeXY(point);
 		_statics->_x = _ox - point.x;
 		_statics->_y = _oy - point.y;
@@ -356,6 +360,43 @@ void StaticANIObject::update(int counterdiff) {
 	warning("STUB: StaticANIObject::update(%d)", counterdiff);
 }
 
+bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
+	if (!(picAniInfo->type & 3)) {
+		warning("StaticANIObject::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
+
+		return false;
+	}
+
+	if (picAniInfo->type & 3) {
+		setOXY(picAniInfo->ox, picAniInfo->oy);
+		_priority = picAniInfo->priority;
+		_field_4 = picAniInfo->field_8;
+		setFlags(picAniInfo->flags);
+		_field_8 = picAniInfo->field_24;
+	}
+
+	if (picAniInfo->type & 1) {
+		_messageQueueId = picAniInfo->type >> 16;
+
+		if (picAniInfo->staticsId)
+			_statics = getStaticsById(picAniInfo->staticsId);
+		else
+			_statics = 0;
+
+		if (picAniInfo->movementId) {
+			_movement = getMovementById(picAniInfo->movementId);
+			if (_movement)
+				_movement->setDynamicPhaseIndex(picAniInfo->dynamicPhaseIndex);
+		} else {
+			_movement = 0;
+		}
+
+		setSomeDynamicPhaseIndex(picAniInfo->someDynamicPhaseIndex);
+	}
+
+	return true;
+}
+
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index c80956c..e21f066 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -184,6 +184,8 @@ class StaticANIObject : public GameObject {
 
   public:
 	StaticANIObject();
+	StaticANIObject(StaticANIObject *src);
+
 	virtual bool load(MfcArchive &file);
 
 	void setOXY(int x, int y);
@@ -200,6 +202,10 @@ class StaticANIObject : public GameObject {
 	void initMovements();
 	void loadMovementsPixelData();
 
+	bool setPicAniInfo(PicAniInfo *picAniInfo);
+
+	void setSomeDynamicPhaseIndex(int val) { _someDynamicPhaseIndex = val; }
+
 	void update(int counterdiff);
 
 	Statics *addReverseStatics(Statics *ani);


Commit: 6d92638e7f1eba7d348488cee693ad4c0ab4ce0a
    https://github.com/scummvm/scummvm/commit/6d92638e7f1eba7d348488cee693ad4c0ab4ce0a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Fixed scene object sorting

Changed paths:
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 146cd6e..80130f9 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -370,7 +370,7 @@ void Scene::initObjectCursors(const char *name) {
 }
 
 bool Scene::compareObjPriority(const void *p1, const void *p2) {
-	if (((StaticANIObject *)p1)->_priority < ((StaticANIObject *)p2)->_priority)
+	if (((StaticANIObject *)p1)->_priority > ((StaticANIObject *)p2)->_priority)
 		return true;
 
 	return false;


Commit: 8a84a1133fcc21a4115826755bfa1a534b735815
    https://github.com/scummvm/scummvm/commit/8a84a1133fcc21a4115826755bfa1a534b735815
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Implement copy constructor for StaticANIObject

Changed paths:
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 72a1080..6939005 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -80,7 +80,36 @@ StaticANIObject::StaticANIObject() {
 }
 
 StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
-	warning("STUB: StaticANIObject(src)");
+	_shadowsOn = src->_shadowsOn;
+	_field_30 = src->_field_30;
+	_field_34 = 1;
+	_initialCounter = 0;
+
+	_messageQueueId = 0;
+	_animExFlag = 0;
+	_counter = 0;
+	_someDynamicPhaseIndex = -1;
+	_sceneId = src->_sceneId;
+	_callback1 = src->_callback1;
+	_callback2 = src->_callback2;
+
+	for (uint i = 0; i < src->_staticsList.size(); i++)
+		_staticsList.push_back(new Statics((Statics *)src->_staticsList[i], 0));
+
+	_movement = 0;
+	_statics = 0;
+
+	for (uint i = 0; i < src->_movements.size(); i++) {
+		Movement *mov;
+		if (((Movement *)src->_movements[i])->_currMovement) {
+			mov = new Movement(getMovementById(src->getMovementIdById(((Movement *)src->_movements[i])->_id)), this);
+			mov->_id = ((Movement *)src->_movements[i])->_id;
+		} else {
+			mov = new Movement(((Movement *)src->_movements[i]), 0, -1, this);
+		}
+
+		_movements.push_back(mov);
+	}
 }
 
 bool StaticANIObject::load(MfcArchive &file) {
@@ -192,6 +221,20 @@ Movement *StaticANIObject::getMovementById(int itemId) {
 	return 0;
 }
 
+int StaticANIObject::getMovementIdById(int itemId) {
+	for (uint i = 0; i < _movements.size(); i++) {
+		Movement *mov = (Movement *)_movements[i];
+		if (mov->_currMovement) {
+			if (mov->_id == itemId)
+				return mov->_id;
+			if (mov->_currMovement->_id == itemId)
+				return mov->_id;
+		}
+	}
+
+	return 0;
+}
+
 Movement *StaticANIObject::getMovementByName(char *name) {
 	for (uint i = 0; i < _movements.size(); i++)
 		if (!strcmp(((Movement *)_movements[i])->_objectName, name))
@@ -487,6 +530,42 @@ Movement::Movement() {
 	_counterMax = 83;
 }
 
+Movement::Movement(Movement *src, StaticANIObject *ani) {
+	_lastFrameSpecialFlag = 0;
+	_flipFlag = src->_flipFlag;
+	_updateFlag1 = src->_updateFlag1;
+	_staticsObj1 = 0;
+	_staticsObj2 = 0;
+	_mx = 0;
+	_my = 0;
+	_m2x = 0;
+	_m2y = 0;
+
+	_field_78 = 0;
+	_framePosOffsets = 0;
+	_field_84 = 0;
+	_currDynamicPhase = 0;
+	_field_8C = 0;
+	_currDynamicPhaseIndex = src->_currDynamicPhaseIndex;
+	_field_94 = 0;
+
+	_currMovement = src;
+	_ox = src->_ox;
+	_oy = src->_oy;
+
+	initStatics(ani);
+
+	_counterMax = src->_counterMax;
+	_counter = src->_counter;
+	_field_50 = src->_field_50;
+
+	updateCurrDynamicPhase();
+}
+
+Movement::Movement(Movement *src, int *flag1, int flag2, StaticANIObject *ani) {
+	warning("STUB: Movement(src, %p, %d, ani)", (void *)flag1, flag2);
+}
+
 bool Movement::load(MfcArchive &file) {
 	warning("STUB: Movement::load");
 	return true;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index e21f066..9e800c2 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -134,6 +134,9 @@ class Movement : public GameObject {
 
   public:
 	Movement();
+	Movement(Movement *src, StaticANIObject *ani);
+	Movement(Movement *src, int *flag1, int flag2, StaticANIObject *ani);
+
 	virtual bool load(MfcArchive &file);
 	bool load(MfcArchive &file, StaticANIObject *ani);
 
@@ -191,6 +194,7 @@ class StaticANIObject : public GameObject {
 	void setOXY(int x, int y);
 	Statics *getStaticsById(int id);
 	Movement *getMovementById(int id);
+	int getMovementIdById(int itemId);
 	Movement *getMovementByName(char *name);
 	Common::Point *getCurrDimensions(Common::Point &p);
 


Commit: 133a77887f51ba2a01c3a6839606f121326637f9
    https://github.com/scummvm/scummvm/commit/133a77887f51ba2a01c3a6839606f121326637f9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Started work on intro

Changed paths:
  A engines/fullpipe/scenes.h
    engines/fullpipe/constants.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/modal.h
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index b609d7b..f578d0c 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -56,6 +56,7 @@ namespace Fullpipe {
 #define PIC_CSR_ITN_RED 5329
 #define PIC_CSR_LIFT 5176
 #define PIC_CSR_MAP 5339
+#define PIC_IN1_PIPETITLE 5167
 #define PIC_INV_MENU 991
 #define PIC_MAP_A13 5275
 #define PIC_MAP_S01 5223
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index e762331..9585f07 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -33,10 +33,12 @@
 #include "fullpipe/behavior.h"
 #include "fullpipe/modal.h"
 #include "fullpipe/input.h"
+#include "fullpipe/scenes.h"
 
 namespace Fullpipe {
 
 FullpipeEngine *g_fullpipe = 0;
+Vars *g_vars = 0;
 
 FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
 	// Setup mixer
@@ -61,6 +63,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_soundEnabled = true;
 	_flgSoundList = true;
 
+	_sfxVolume = 0;
+
 	_inputController = 0;
 	_inputDisabled = false;
 
@@ -99,6 +103,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_cursorId = 0;
 
 	g_fullpipe = this;
+	g_vars = new Vars;
 }
 
 FullpipeEngine::~FullpipeEngine() {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 15bb28f..c76236e 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -60,6 +60,7 @@ class NGIArchive;
 class Scene;
 class SoundList;
 class StaticANIObject;
+class Vars;
 
 int global_messageHandler1(ExCommand *cmd);
 int global_messageHandler2(ExCommand *cmd);
@@ -126,6 +127,8 @@ public:
 	bool _soundEnabled;
 	bool _flgSoundList;
 
+	int _sfxVolume;
+
 	GlobalMessageQueueList *_globalMessageQueueList;
 	MessageHandler *_messageHandlers;
 
@@ -201,6 +204,7 @@ public:
 };
 
 extern FullpipeEngine *g_fullpipe;
+extern Vars *g_vars;
 
 } // End of namespace Fullpipe
 
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 9260da6..0b1fec9 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -62,7 +62,7 @@ bool ExCommand::load(MfcArchive &file) {
 	_sceneClickY = file.readUint32LE();
 	_field_20 = file.readUint32LE();
 	_field_24 = file.readUint32LE();
-	_param28 = file.readUint32LE();
+	_keyCode = file.readUint32LE();
 	_field_2C = file.readUint32LE();
 	_field_30 = file.readUint32LE();
 	_field_34 = file.readUint32LE();
@@ -114,7 +114,7 @@ Message::Message() {
 	_sceneClickY = 0;
 	_field_20 = 0;
 	_field_24 = 0;
-	_param28 = 0;
+	_keyCode = 0;
 	_field_2C = 0;
 	_field_30 = 0;
 	_field_34 = 0;
@@ -130,7 +130,7 @@ Message::Message(Message *src) {
 	_sceneClickY = src->_sceneClickY;
 	_field_20 = src->_field_20;
 	_field_24 = src->_field_24;
-	_param28 = src->_param28;
+	_keyCode = src->_keyCode;
 	_field_2C = src->_field_2C;
 	_field_30 = src->_field_30;
 	_field_34 = src->_field_34;
@@ -146,7 +146,7 @@ Message::Message(int16 parentId, int messageKind, int x, int y, int a6, int a7,
 	_sceneClickY = sceneClickY;
 	_field_24 = a7;
 	_field_20 = a10;
-	_param28 = 0;
+	_keyCode = 0;
 	_field_2C = 0;
 	_field_30 = 0;
 	_field_34 = 0;
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index da91fd2..b59b594 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -42,7 +42,7 @@ class Message : public CObject {
 	int _sceneClickY;
 	int _field_20;
 	int _field_24;
-	int _param28;
+	int _keyCode;
 	int _field_2C;
 	int _field_30;
 	int _field_34;
@@ -54,15 +54,13 @@ class Message : public CObject {
 };
 
 class ExCommand : public Message {
-	friend class CGameLoader;
-	friend class MessageQueue;
+ public:
 
 	int _messageNum;
 	int _field_3C;
 	int _excFlags;
 	int _parId;
 
- public:
 	ExCommand();
 	ExCommand(ExCommand *src);
 	ExCommand(int16 parentId, int messageKind, int messageNum, int x, int y, int a7, int a8, int sceneClickX, int sceneClickY, int a11);
diff --git a/engines/fullpipe/modal.h b/engines/fullpipe/modal.h
index fb22798..73236e8 100644
--- a/engines/fullpipe/modal.h
+++ b/engines/fullpipe/modal.h
@@ -41,6 +41,19 @@ class CBaseModalObject {
 	void saveload();
 };
 
+class CModalIntro : public CBaseModalObject {
+	int _field_8;
+	int _introFlags;
+	int _countDown;
+	int _needRedraw;
+	int _sfxVolume;
+
+ public:
+	CModalIntro();
+
+	virtual bool handleMessage(ExCommand *message);
+};
+
 } // End of namespace Fullpipe
 
 #endif /* FULLPIPE_MODAL_H */
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 2a6fafd..defa385 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -27,6 +27,8 @@
 
 namespace Fullpipe {
 
+class MessageQueue;
+
 class Scene : public Background {
 	friend class FullpipeEngine;
 	friend class SceneTag;
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 68be347..5af9d98 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -35,6 +35,8 @@
 #include "fullpipe/behavior.h"
 
 #include "fullpipe/constants.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/modal.h"
 
 namespace Fullpipe {
 
@@ -42,6 +44,15 @@ int sceneIntro_updateCursor();
 void sceneIntro_initScene(Scene *sc);
 int sceneHandlerIntro(ExCommand *cmd);
 
+Vars::Vars() {
+	sceneIntro_aniin1man = 0;
+	sceneIntro_needSleep = true;
+	sceneIntro_needGetup = false;
+	sceneIntro_skipIntro = true;
+	sceneIntro_playing = false;
+	sceneIntro_needBlackout = false;
+}
+
 bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	CGameVar *sceneVar;
 	Common::Point sceneDim;
@@ -657,20 +668,18 @@ int sceneIntro_updateCursor() {
 void sceneIntro_initScene(Scene *sc) {
 	g_fullpipe->_gameLoader->loadScene(SC_INTRO2);
 
-	warning("STUB: sceneIntro_initScene()");
+	g_vars->sceneIntro_aniin1man = sc->getStaticANIObject1ById(ANI_IN1MAN, -1);
+	g_vars->sceneIntro_needSleep = true;
+	g_vars->sceneIntro_needGetup = false;
+	g_vars->sceneIntro_playing = true;
+	g_vars->sceneIntro_needBlackout = false;
 
 #if 0
-	sceneIntro_aniin1man = sc->_getStaticANIObject1ById(ANI_IN1MAN, -1);
-	sceneIntro_needSleep = 1;
-	sceneIntro_needGetup = 0;
-	sceneIntro_dword_477938 = 1;
-	sceneIntro_dword_477934 = 0;
-
 	if (g_fullpipe->_recordEvents || g_fullpipe->_inputArFlag)
-		sceneIntro_skipIntro = 0;
+		g_vars->sceneIntro_skipIntro = false;
+#endif
 
 	g_fullpipe->_modalObject = new CModalIntro;
-#endif
 }
 
 int sceneHandlerIntro(ExCommand *cmd) {
diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h
new file mode 100644
index 0000000..9466e14
--- /dev/null
+++ b/engines/fullpipe/scenes.h
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_SCENES_H
+#define FULLPIPE_SCENES_H
+
+namespace Fullpipe {
+
+class StaticANIObject;
+
+class Vars {
+ public:
+	Vars();
+
+	StaticANIObject *sceneIntro_aniin1man;
+	bool sceneIntro_needSleep;
+	bool sceneIntro_needGetup;
+	bool sceneIntro_skipIntro;
+	bool sceneIntro_playing;
+	bool sceneIntro_needBlackout;
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_SCENES_H */


Commit: ea91b8f7998cc4a06f4f5d8732a1b9b0309d95d2
    https://github.com/scummvm/scummvm/commit/ea91b8f7998cc4a06f4f5d8732a1b9b0309d95d2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Initial code for SC_1

Changed paths:
    engines/fullpipe/constants.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/init.cpp
    engines/fullpipe/objectnames.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/scenes.h
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index f578d0c..53a0831 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -25,6 +25,7 @@
 
 namespace Fullpipe {
 
+#define ANI_BOOT_1 4231
 #define ANI_IN1MAN 5110
 #define ANI_INV_MAP 5321
 #define ANI_MAN 322
@@ -60,6 +61,9 @@ namespace Fullpipe {
 #define PIC_INV_MENU 991
 #define PIC_MAP_A13 5275
 #define PIC_MAP_S01 5223
+#define PIC_SC1_KUCHKA 1321
+#define PIC_SC1_OSK 1018
+#define PIC_SC1_OSK2 2932
 #define SC_1 301
 #define SC_10 653
 #define SC_11 654
@@ -112,6 +116,7 @@ namespace Fullpipe {
 #define SC_MAP 5222
 #define SC_TEST 903
 #define SC_TITLES 5166
+#define ST_LBN_2N 2756
 #define ST_MAN_EMPTY 476
 #define TrubaDown 697
 #define TrubaLeft 474
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 9585f07..2a5ceb1 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -55,6 +55,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_pictureScale = 8;
 	_scrollSpeed = 0;
 	_currSoundListCount = 0;
+	_globalPalette = 0;
 
 	_updateTicks = 0;
 
@@ -72,7 +73,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 
 	_gameContinue = true;
 	_needRestart = false;
-	_flgPlayIntro = true;
+	_flgPlayIntro = false;
 	_flgSavegameMenuRequested = false;
 
 	_isProcessingMessages = false;
@@ -275,6 +276,15 @@ int FullpipeEngine::getObjectEnumState(const char *name, const char *state) {
 	return 0;
 }
 
+int FullpipeEngine::getObjectState(const char *objname) {
+	CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
+
+	if (var)
+		return var->getSubVarAsInt(objname);
+
+  return 0;
+}
+
 void FullpipeEngine::setObjectState(const char *name, int state) {
 	CGameVar *var = _gameLoader->_gameVar->getSubVarByName("OBJSTATES");
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index c76236e..85538e7 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -118,6 +118,7 @@ public:
 	Scene *_scene2;
 	StaticANIObject *_aniMan;
 	StaticANIObject *_aniMan2;
+	byte *_globalPalette;
 
 	CInputController *_inputController;
 	bool _inputDisabled;
@@ -185,6 +186,7 @@ public:
 
 	int _cursorId;
 
+	int getObjectState(const char *objname);
 	void setObjectState(const char *name, int state);
 	int getObjectEnumState(const char *name, const char *state);
 
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index c677d0e..8996337 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -427,6 +427,15 @@ void Picture::draw(int x, int y, int style, int angle) {
 		warning("Picture:draw: alpha = %0x", _alpha);
 	}
 
+	byte *pal = _paletteData;
+
+	if (!pal) {
+		pal = g_fullpipe->_globalPalette;
+
+		if (!pal)
+			error("Picture::draw(): Both global and local palettes are empty");
+	}
+
 	switch (style) {
 	case 1:
 		//flip
@@ -439,7 +448,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 		if (angle)
 			drawRotated(x1, y1, angle);
 		else
-			_bitmap->putDib(x1, y1, (int32 *)_paletteData);
+			_bitmap->putDib(x1, y1, (int32 *)pal);
 	}
 }
 
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index 4e35209..f4a62aa 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -35,7 +35,7 @@ void FullpipeEngine::initObjectStates() {
 	setLevelStates();
 
 	setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg));
-	setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_NotCrackedEggs));
+	setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_DidNotCrackEgg));
 	setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken));
 	setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First));
 	setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No));
diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
index 39c4e5d..3eaaf70 100644
--- a/engines/fullpipe/objectnames.h
+++ b/engines/fullpipe/objectnames.h
@@ -128,7 +128,7 @@
 #define sO_NotTaken "\xcd\xe5 \xe2\xe7\xff\xf2"	// "Не взят"
 #define sO_NotHanging "\xcd\xe5 \xe2\xe8\xf1\xe8\xf2"	// "Не висит"
 #define sO_NotGrown "\xcd\xe5 \xe2\xfb\xf0\xee\xf1"	// "Не вырос"
-#define sO_NotCrackedEggs "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee"	// "Не колол яйцо"
+#define sO_DidNotCrackEgg "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee"	// "Не колол яйцо"
 #define sO_NotFallen "\xcd\xe5 \xef\xe0\xe4\xe0\xeb"	// "Не падал"
 #define sO_NotAvailable "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0"	// "Недоступна"
 #define sO_CannotTake "\xcd\xe5\xeb\xfc\xe7\xff \xe2\xe7\xff\xf2\xfc"	// "Нельзя взять"
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 80130f9..13a25b7 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -416,7 +416,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		return;
 
 	if (_palette) {
-		warning("Scene palette is ignored");
+		g_fullpipe->_globalPalette = _palette->_data;
 	}
 
 	debug(0, "Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 5af9d98..d2a75c1 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -35,15 +35,23 @@
 #include "fullpipe/behavior.h"
 
 #include "fullpipe/constants.h"
+#include "fullpipe/objectnames.h"
 #include "fullpipe/scenes.h"
 #include "fullpipe/modal.h"
 
 namespace Fullpipe {
 
+int defaultUpdateCursor();
+void setElevatorButton(const char *name, int state);
+
 int sceneIntro_updateCursor();
 void sceneIntro_initScene(Scene *sc);
 int sceneHandlerIntro(ExCommand *cmd);
 
+void scene01_fixEntrance();
+void scene01_initScene(Scene *sc, int entrance);
+int sceneHandler01(ExCommand *cmd);
+
 Vars::Vars() {
 	sceneIntro_aniin1man = 0;
 	sceneIntro_needSleep = true;
@@ -153,19 +161,19 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		_updateCursorCallback = sceneIntro_updateCursor;
 		break;
 
-#if 0
 	case SC_1:
-		scene01_sub_40E160();
+		scene01_fixEntrance();
 		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_1");
 		scene->preloadMovements(sceneVar);
-		scene01_initScene(scene, entrance->field_4);
+		scene01_initScene(scene, entrance->_field_4);
 		_behaviorManager->initBehavior(scene, sceneVar);
 		scene->initObjectCursors("SC_1");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler01, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
+#if 0
 	case SC_2:
 		sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_2");
 		scene->preloadMovements(sceneVar);
@@ -174,7 +182,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_2");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler02, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_3:
@@ -208,7 +216,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_5");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler05, 2, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_6:
@@ -231,7 +239,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_7");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler07, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_8:
@@ -288,7 +296,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_12");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler12, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_13:
@@ -299,7 +307,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_13");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler13, 2, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_14:
@@ -397,7 +405,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_20");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler20, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_21:
@@ -444,7 +452,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler24, 2);
 		scene24_sub_423DD0();
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_25:
@@ -523,7 +531,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_31");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler31, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_32:
@@ -570,7 +578,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_35");
 		setSceneMusicParameters(sceneVar);
 		insertMessageHandler(sceneHandler35, 2, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_36:
@@ -603,7 +611,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 		scene->initObjectCursors("SC_38");
 		setSceneMusicParameters(sceneVar);
 		addMessageHandler(sceneHandler38, 2);
-		_updateCursorCallback = defaultUpdateCursorCallback;
+		_updateCursorCallback = defaultUpdateCursor;
 		break;
 
 	case SC_FINAL1:
@@ -635,6 +643,13 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	return true;
 }
 
+void setElevatorButton(const char *name, int state) {
+	CGameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+
+	if (var)
+		var->setSubVarAsInt(name, state);
+}
+
 int global_messageHandler1(ExCommand *cmd) {
 	warning("STUB: global_messageHandler1()");
 
@@ -659,6 +674,12 @@ int global_messageHandler4(ExCommand *cmd) {
 	return 0;
 }
 
+int defaultUpdateCursor() {
+	warning("STUB: defaultUpdateCursor");
+
+	return g_fullpipe->_cursorId;
+}
+
 int sceneIntro_updateCursor() {
 	g_fullpipe->_cursorId = 0;
 
@@ -688,4 +709,40 @@ int sceneHandlerIntro(ExCommand *cmd) {
 	return 0;
 }
 
+void scene01_fixEntrance() {
+	CGameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME");
+	if (var->getSubVarAsInt("Entrance") == TrubaLeft)
+		var->setSubVarAsInt("Entrance", TrubaRight);
+}
+
+void scene01_initScene(Scene *sc, int entrance) {
+	g_vars->scene01_unused = 0;
+
+	g_vars->scene01_picSc01Osk = sc->getPictureObjectById(PIC_SC1_OSK, 0);
+	g_vars->scene01_picSc01Osk->_flags &= 0xFFFB;
+
+	g_vars->scene01_picSc01Osk2 = sc->getPictureObjectById(PIC_SC1_OSK2, 0);
+	g_vars->scene01_picSc01Osk2->_flags &= 0xFFFB;
+
+	if (g_fullpipe->getObjectState(sO_EggCracker) == g_fullpipe->getObjectEnumState(sO_EggCracker, sO_DidNotCrackEgg)) {
+		PictureObject *pic = sc->getPictureObjectById(PIC_SC1_KUCHKA, 0);
+		if (pic)
+			pic->_flags &= 0xFFFB;
+	}
+
+	if (entrance != TrubaLeft ) {
+		StaticANIObject *bootAnim = sc->getStaticANIObject1ById(ANI_BOOT_1, -1);
+		if (bootAnim)
+			bootAnim->_flags &= 0xFFFB;
+	}
+
+	setElevatorButton(sO_Level2, ST_LBN_2N);
+}
+
+int sceneHandler01(ExCommand *cmd) {
+	warning("STUB: sceneHandler01()");
+
+	return 0;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h
index 9466e14..da3ac51 100644
--- a/engines/fullpipe/scenes.h
+++ b/engines/fullpipe/scenes.h
@@ -37,6 +37,10 @@ class Vars {
 	bool sceneIntro_skipIntro;
 	bool sceneIntro_playing;
 	bool sceneIntro_needBlackout;
+
+	int scene01_unused;
+	PictureObject *scene01_picSc01Osk;
+	PictureObject *scene01_picSc01Osk2;
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 70a057c..00ae76e 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -79,6 +79,7 @@ class CObList : public Common::List<CObject>, public CObject {
 
 class MemoryObject : CObject {
 	friend class Picture;
+	friend class Scene;
 
  protected:
 	char *_memfilename;


Commit: 1d55aa0c6ecade00b1b31932a86dd2f97b377882
    https://github.com/scummvm/scummvm/commit/1d55aa0c6ecade00b1b31932a86dd2f97b377882
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Attempt to fix crash on SC_1 startup. Domino is missing

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 2a5ceb1..b71021b 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -133,24 +133,17 @@ Common::Error FullpipeEngine::run() {
 
 	_isSaveAllowed = false;
 
-	if (!loadGam("fullpipe.gam"))
-		return Common::kNoGameDataFoundError;
-
-	EntranceInfo ent;
-
+	int scene = 0;
 	if (ConfMan.hasKey("boot_param"))
-		ent._sceneId = ConfMan.getInt("boot_param");
-	else 
-		ent._sceneId = 3896;
+		scene = ConfMan.getInt("boot_param");
 
-	sceneSwitcher(&ent);
+	if (!loadGam("fullpipe.gam", scene))
+		return Common::kNoGameDataFoundError;
 
 #if 0
 	loadAllScenes();
 #endif
 
-	_currentScene->draw();
-
 	_gameContinue = true;
 
 	while (_gameContinue) {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 85538e7..257a458 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -98,7 +98,7 @@ public:
 
 	CGameLoader *_gameLoader;
 	GameProject *_gameProject;
-	bool loadGam(const char *fname);
+	bool loadGam(const char *fname, int scene = 0);
 
 	CGameVar *getGameLoaderGameVar();
 	CInputController *getGameLoaderInputController();
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 46cd557..7d1d938 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -254,10 +254,13 @@ void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAn
 	if (picAniInfoCount <= 0)
 		return;
 
+	debug(0, "CGameLoader::applyPicAniInfos(sc, ptr, %d)", picAniInfoCount);
+
 	PictureObject *pict;
 	StaticANIObject *ani;
 
 	for (int i = 0; i < picAniInfoCount; i++) {
+		debug(0, "PicAniInfo: id: %d type: %d", picAniInfo[i]->objectId, picAniInfo[i]->type);
 		if (picAniInfo[i]->type & 2) {
 			pict = sc->getPictureObjectById(picAniInfo[i]->objectId, picAniInfo[i]->field_8);
 			if (pict) {
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 8996337..003d619 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -381,7 +381,7 @@ Common::Point *Picture::getDimensions(Common::Point *p) {
 void Picture::getDibInfo() {
 	int off = _dataSize & ~0xf;
 
-	debug(0, "Picture::getDibInfo: _dataSize: %d", _dataSize);
+	debug(9, "Picture::getDibInfo: _dataSize: %d", _dataSize);
 
 	if (!_dataSize) {
 		warning("Picture::getDibInfo(): Empty data size");
@@ -409,7 +409,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 	int x1 = x;
 	int y1 = y;
 
-	debug(0, "Picture::draw(%d, %d, %d, %d)", x, y, style, angle);
+	debug(0, "Picture::draw(%d, %d, %d, %d) (%s)", x, y, style, angle, _memfilename);
 
 	if (x != -1)
 		x1 = x;
@@ -430,10 +430,8 @@ void Picture::draw(int x, int y, int style, int angle) {
 	byte *pal = _paletteData;
 
 	if (!pal) {
+		warning("Picture:draw: using global palette");
 		pal = g_fullpipe->_globalPalette;
-
-		if (!pal)
-			error("Picture::draw(): Both global and local palettes are empty");
 	}
 
 	switch (style) {
@@ -447,8 +445,9 @@ void Picture::draw(int x, int y, int style, int angle) {
 	default:
 		if (angle)
 			drawRotated(x1, y1, angle);
-		else
+		else {
 			_bitmap->putDib(x1, y1, (int32 *)pal);
+		}
 	}
 }
 
@@ -531,7 +530,10 @@ void Bitmap::putDibRB(int32 *palette) {
 	uint16 *srcPtr2;
 	uint16 *srcPtr;
 
-	debug(0, "Bitmap::putDibRB()");
+	if (!palette)
+		error("Bitmap::putDibRB(): Both global and local palettes are empty");
+
+	debug(8, "Bitmap::putDibRB()");
 
 	endx = _width + _x - 1;
 	endy = _height + _y - 1;
@@ -642,7 +644,7 @@ void Bitmap::putDibCB(int32 *palette) {
 	endx = _width + _x - 1;
 	endy = _height + _y - 1;
 
-	debug(0, "Bitmap::putDibCB(): %d, %d, %d, %d [%d, %d]", _x, _y, endx, endy, _width, _height);
+	debug(8, "Bitmap::putDibCB(): %d, %d, %d, %d [%d, %d]", _x, _y, endx, endy, _width, _height);
 
 	if (_x > 799 || endx < 0 || _y > 599 || endy < 0)
 		return;
@@ -655,6 +657,9 @@ void Bitmap::putDibCB(int32 *palette) {
 
 	cb05_format = (_type == MKTAG('C', 'B', '\05', 'e'));
 
+	if (!palette && !cb05_format)
+		error("Bitmap::putDibCB(): Both global and local palettes are empty");
+
 	bpp = cb05_format ? 2 : 1;
 	pitch = (bpp * _width + 3) & 0xFFFFFFFC;
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 13a25b7..f72e3ba 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -419,7 +419,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		g_fullpipe->_globalPalette = _palette->_data;
 	}
 
-	debug(0, "Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
+	debug(8, "Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
 
 	if (_picObjList.size() > 2) { // We need to z-sort them
 		objectList_sortByPriority(_picObjList);
@@ -431,11 +431,11 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	if (maxPri == -1)
 		maxPri = 60000;
 
-	debug(0, "-> Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
+	debug(8, "-> Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
 
 	Common::Point point;
 
-	debug(0, "_bigPict: %d objlist: %d", _bigPictureArray1Count, _picObjList.size());
+	debug(8, "_bigPict: %d objlist: %d", _bigPictureArray1Count, _picObjList.size());
 	if (drawBg && _bigPictureArray1Count && _picObjList.size()) {
 
 		_bigPictureArray[0][0]->getDimensions(&point);
@@ -443,11 +443,11 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		int width = point.x;
 		int height = point.y;
 
-		debug(0, "w: %d h:%d", width, height);
+		debug(8, "w: %d h:%d", width, height);
 
 		((PictureObject *)_picObjList[0])->getDimensions(&point);
 
-		debug(0, "w2: %d h2:%d", point.x, point.y);
+		debug(8, "w2: %d h2:%d", point.x, point.y);
 
 		int bgStX = g_fullpipe->_sceneRect.left % point.x;
 
@@ -505,14 +505,14 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 	for (uint i = 1; i < _picObjList.size(); i++) {
 		PictureObject *obj = (PictureObject *)_picObjList[i];
 
-		debug(0, "pri: %d", obj->_priority);
+		debug(8, "pri: %d", obj->_priority);
 		if (obj->_priority < minPri || obj->_priority >= maxPri)
 			continue;
 
 		int objX = obj->_ox;
 		int objY = obj->_oy;
 
-		debug(0, "obj: %d %d", objX, objY);
+		debug(8, "obj: %d %d", objX, objY);
 
 		obj->getDimensions(&point);
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index cd931b1..bdfeb92 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -35,7 +35,7 @@
 
 namespace Fullpipe {
 
-bool FullpipeEngine::loadGam(const char *fname) {
+bool FullpipeEngine::loadGam(const char *fname, int scene) {
 	_gameLoader = new CGameLoader();
 
 	if (!_gameLoader->loadFile(fname))
@@ -43,7 +43,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 
 	_currSoundListCount = 0;
 	initObjectStates();
-	// set_g_messageQueueCallback1(messageQueueCallback1);
+	// set_g_messageQueueCallback1(messageQueueCallback1); // substituted with direct call
 
 	addMessageHandlerByIndex(global_messageHandler1, 0, 4);
 
@@ -57,7 +57,7 @@ bool FullpipeEngine::loadGam(const char *fname) {
 		((MemoryObject *)((PictureObject *)*p)->_picture)->load();
 	}
 
-	// _sceneSwitcher = sceneSwitcher;
+	// _sceneSwitcher = sceneSwitcher; // substituted with direct call
 	// _preloadCallback = gameLoaderPreloadCallback
 	// _readSavegameCallback = gameLoaderReadSavegameCallback;
 
@@ -80,12 +80,17 @@ bool FullpipeEngine::loadGam(const char *fname) {
 
 	setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED"));
 
-	if (_flgPlayIntro) {
-		_gameLoader->loadScene(SC_INTRO1);
-		_gameLoader->gotoScene(SC_INTRO1, TrubaUp);
+	if (scene) {
+		_gameLoader->loadScene(scene);
+		_gameLoader->gotoScene(scene, TrubaLeft);
 	} else {
-		_gameLoader->loadScene(SC_1);
-		_gameLoader->gotoScene(SC_1, TrubaLeft);
+		if (_flgPlayIntro) {
+			_gameLoader->loadScene(SC_INTRO1);
+			_gameLoader->gotoScene(SC_INTRO1, TrubaUp);
+		} else {
+			_gameLoader->loadScene(SC_1);
+			_gameLoader->gotoScene(SC_1, TrubaLeft);
+		}
 	}
 
 	if (!_currentScene)
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 6939005..e64c3d2 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -272,18 +272,23 @@ void StaticANIObject::draw() {
 	Common::Point point;
 	Common::Rect rect;
 
-	debug(0, "StaticANIObject::draw()");
+	debug(0, "StaticANIObject::draw() (%s) [%d]", transCyrillic((byte *)_objectName), _id);
 
 	if (_shadowsOn && g_fullpipe->_currentScene && g_fullpipe->_currentScene->_shadows
 		&& (getCurrDimensions(point)->x != 1 || getCurrDimensions(point)->y != 1)) {
 
 		DynamicPhase *dyn;
 
-		if (!_movement || _flags & 0x20 )
+		if (!_movement || _flags & 0x20)
 			dyn = _statics;
 		else
 			dyn = _movement->_currDynamicPhase;
 
+		if (!dyn) {
+			warning("HACK: StaticANIObject::draw(): dyn is missing");
+			return;
+		}
+
 		if (dyn->getDynFlags() & 4) {
 			rect = *dyn->_rect;
 
@@ -410,6 +415,8 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 		return false;
 	}
 
+	debug(0, "StaticANIObject::setPicAniInfo() (%s [%d])", transCyrillic((byte *)_objectName), _id);
+
 	if (picAniInfo->type & 3) {
 		setOXY(picAniInfo->ox, picAniInfo->oy);
 		_priority = picAniInfo->priority;
@@ -421,10 +428,11 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	if (picAniInfo->type & 1) {
 		_messageQueueId = picAniInfo->type >> 16;
 
-		if (picAniInfo->staticsId)
+		if (picAniInfo->staticsId) {
 			_statics = getStaticsById(picAniInfo->staticsId);
-		else
+		} else {
 			_statics = 0;
+		}
 
 		if (picAniInfo->movementId) {
 			_movement = getMovementById(picAniInfo->movementId);


Commit: 3b86b149ed0f920659b2473feef86aad8c4b5853
    https://github.com/scummvm/scummvm/commit/3b86b149ed0f920659b2473feef86aad8c4b5853
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:11-07:00

Commit Message:
FULLPIPE: Added missing file

Changed paths:
  A engines/fullpipe/modal.cpp



diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp
new file mode 100644
index 0000000..4728fb2
--- /dev/null
+++ b/engines/fullpipe/modal.cpp
@@ -0,0 +1,94 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+#include "fullpipe/modal.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/scenes.h"
+
+namespace Fullpipe {
+
+bool CBaseModalObject::handleMessage(ExCommand *message) {
+	warning("STUB: CBaseModalObject::handleMessage()");
+
+	return true;
+}
+
+bool CBaseModalObject::init(int counterdiff) {
+	warning("STUB: CBaseModalObject::init(%d)", counterdiff);
+
+	return true;
+}
+
+bool CBaseModalObject::update() {
+	warning("STUB: CBaseModalObject::update()");
+
+	return true;
+}
+
+void CBaseModalObject::saveload() {
+	warning("STUB: CBaseModalObject::saveload()");
+}
+
+
+CModalIntro::CModalIntro() {
+	_field_8 = 0;
+	_countDown = 0;
+	_needRedraw = 0;
+	if (g_vars->sceneIntro_skipIntro) {
+		_introFlags = 4;
+	} else {
+		_introFlags = 33;
+		_countDown = 150;
+
+		PictureObject *pict = g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0);
+		pict->setFlags(pict->_flags & 0xFFFB);
+	}
+	g_vars->sceneIntro_skipIntro = false;
+	_sfxVolume = g_fullpipe->_sfxVolume;
+}
+
+bool CModalIntro::handleMessage(ExCommand *message) {
+	if (message->_messageKind != 17)
+		return false;
+
+	if (message->_messageNum != 36)
+		return false;
+
+	if (message->_keyCode != 13 && message->_keyCode != 27 && message->_keyCode != 32 )
+		return false;
+
+	if (_needRedraw) {
+		if (!(_introFlags & 0x10)) {
+			_countDown = 0;
+			g_vars->sceneIntro_needBlackout = true;
+			return true;
+		}
+		g_vars->sceneIntro_playing = false;
+		g_vars->sceneIntro_needBlackout = true;
+	}
+
+	return true;
+}
+
+} // End of namespace Fullpipe


Commit: a80f93464031b9d48c05dc167ec220574b887ce0
    https://github.com/scummvm/scummvm/commit/a80f93464031b9d48c05dc167ec220574b887ce0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:12-07:00

Commit Message:
FULLPIPE: Implemented main event handler

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/inventory.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index b71021b..57691de 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -58,6 +58,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_globalPalette = 0;
 
 	_updateTicks = 0;
+	_lastInputTicks = 0;
+	_lastButtonUpTicks = 0;
 
 	_currArchive = 0;
 
@@ -74,6 +76,10 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_gameContinue = true;
 	_needRestart = false;
 	_flgPlayIntro = false;
+	_gamePaused = false;
+	_inputArFlag = false;
+	_recordEvents = false;
+
 	_flgSavegameMenuRequested = false;
 
 	_isProcessingMessages = false;
@@ -180,26 +186,117 @@ Common::Error FullpipeEngine::run() {
 void FullpipeEngine::updateEvents() {
 	Common::Event event;
 	Common::EventManager *eventMan = _system->getEventManager();
+	ExCommand *ex;
 
 	while (eventMan->pollEvent(event)) {
 		switch (event.type) {
 		case Common::EVENT_KEYDOWN:
 			_keyState = event.kbd.keycode;
-			break;
+
+			switch (event.kbd.keycode) {
+			case Common::KEYCODE_SPACE:
+				if (_gamePaused) {
+					if (_modalObject) {
+						if (_modalObject->init(42)) {
+							_modalObject->update();
+						} else {
+							_modalObject->saveload();
+							CBaseModalObject *obj = _modalObject->_parentObj;
+							if (obj)
+								delete _modalObject;
+							_modalObject = obj;
+						}
+					} else {
+						_gameLoader->updateSystems(42);
+					}
+					return;
+				}
+
+				ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0);
+				ex->_keyCode = 32;
+				ex->_excFlags |= 3;
+				ex->handle();
+				break;
+			case Common::KEYCODE_s:
+				if (_gamePaused) {
+					_gamePaused = 0;
+					_flgSavegameMenuRequested = true;
+					return;
+				}
+
+				ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0);
+				ex->_keyCode = 83;
+				ex->_excFlags |= 3;
+				ex->handle();
+				break;
+			case Common::KEYCODE_q:
+				return;
+				break;
+			default:
+				ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0);
+				ex->_keyCode = event.kbd.keycode;
+				ex->_excFlags |= 3;
+				ex->handle();
+				break;
+			}
 		case Common::EVENT_KEYUP:
+			if (!_inputArFlag) {
+				ex = new ExCommand(0, 17, 37, 0, 0, 0, 1, 0, 0, 0);
+				ex->_excFlags |= 3;
+				ex->handle();
+			}
 			_keyState = Common::KEYCODE_INVALID;
 			break;
 		case Common::EVENT_MOUSEMOVE:
-			_mouseX = event.mouse.x;
-			_mouseY = event.mouse.y;
+			if (_recordEvents) {
+				ex = new ExCommand(0, 17, 31, event.mouse.x, event.mouse.x, 0, 1, 0, 0, 0);
+				ex->_excFlags |= 3;
+				ex->handle();
+			}
 			break;
 		case Common::EVENT_QUIT:
 			_gameContinue = false;
 			break;
+			case Common::EVENT_RBUTTONDOWN:
+			if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) {
+				ex = new ExCommand(0, 17, 107, event.mouse.x, event.mouse.x, 0, 1, 0, 0, 0);
+				ex->_excFlags |= 3;
+				_lastInputTicks = _updateTicks;
+				ex->handle();
+			}
+			break;
+		case Common::EVENT_LBUTTONDOWN:
+			if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) {
+				ex = new ExCommand(0, 17, 29, event.mouse.x, event.mouse.x, 0, 1, 0, 0, 0);
+
+				ex->_sceneClickX = _sceneRect.left + ex->_x;
+				ex->_sceneClickY = _sceneRect.top + ex->_y;
+				ex->_keyCode = getGameLoaderInventory()->getSelectedItemId();
+				ex->_excFlags |= 3;
+				_lastInputTicks = _updateTicks;
+				ex->handle();
+			}
+			break;
+		case Common::EVENT_LBUTTONUP:
+			if (!_inputArFlag && (_updateTicks - _lastButtonUpTicks) >= 2) {
+				ex = new ExCommand(0, 17, 30, 0, 0, 0, 1, 0, 0, 0);
+				ex->_excFlags |= 3;
+				_lastButtonUpTicks = _updateTicks;
+				ex->handle();
+			}
+			break;
 		default:
 			break;
 		}
 	}
+
+		
+#if 0
+	warning("STUB: FullpipeEngine::updateEvents() <mainWindowProc>");
+	if (Msg == MSG_SC11_SHOWSWING && _modalObject) {
+		_modalObject->method14();
+	}
+#endif
 }
 
 void FullpipeEngine::freeGameLoader() {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 257a458..4123f62 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -109,7 +109,10 @@ public:
 	bool _savesEnabled;
 	bool _updateFlag;
 	bool _flgCanOpenMap;
+	bool _gamePaused;
 	bool _flgSavegameMenuRequested;
+	bool _inputArFlag;
+	bool _recordEvents;
 
 	Common::Rect _sceneRect;
 	int _sceneWidth;
@@ -178,6 +181,8 @@ public:
 	CInventory2 *_inventory;
 
 	int32 _updateTicks;
+	int32 _lastInputTicks;
+	int32 _lastButtonUpTicks;
 
 	CBaseModalObject *_modalObject;
 
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index a61df38..c449dfc 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -100,6 +100,7 @@ class CInventory2 : public CInventory {
 	void rebuildItemRects();
 
 	Scene *getScene() { return _scene; }
+	int getSelectedItemId() { return _selectedId < 0 ? 0 : _selectedId; }
 
 	void draw();
 };
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 0b1fec9..c8befd5 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -24,6 +24,7 @@
 
 #include "fullpipe/objects.h"
 #include "fullpipe/messages.h"
+#include "fullpipe/modal.h"
 
 namespace Fullpipe {
 
@@ -104,9 +105,20 @@ void ExCommand::sendMessage() {
 	processMessages();
 }
 
+void ExCommand::handle() {
+	if (g_fullpipe->_modalObject) {
+		g_fullpipe->_modalObject->handleMessage(this);
+
+		delete this;
+	} else {
+		postMessage(this);
+	}
+}
+
 Message::Message() {
 	_messageKind = 0;
-	_parentId = 0;
+	_parentId = 0;		
+
 	_x = 0;
 	_y = 0;
 	_field_14 = 0;
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index b59b594..25cdfc1 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -70,6 +70,7 @@ class ExCommand : public Message {
 
 	bool handleMessage();
 	void sendMessage();
+	void handle();
 };
 
 class CObjstateCommand : public CObject {


Commit: d866e2aabf5e69481b0feb797a075b469eaa1bb9
    https://github.com/scummvm/scummvm/commit/d866e2aabf5e69481b0feb797a075b469eaa1bb9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:12-07:00

Commit Message:
FULLPIPE: First phase of StaticANIObject::update() implementation

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 57691de..e68d940 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -329,6 +329,7 @@ void FullpipeEngine::updateScreen() {
 			}
 		}
 	} else if (_currentScene) {
+		_currentScene->update(42);  // HACK. FIXME
 		_currentScene->draw();
 
 		if (_inventoryScene)
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index c8befd5..3a3ee4bc 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -510,4 +510,11 @@ void processMessages() {
 	}
 }
 
+void updateGlobalMessageQueue(int id, int objid) {
+	MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(id);  
+	if (m) {
+		m->update();
+	}
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 25cdfc1..e2e27b5 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -147,6 +147,7 @@ bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
 void clearMessageHandlers();
 void postMessage(ExCommand *ex);
 void processMessages();
+void updateGlobalMessageQueue(int id, int objid);
 
 } // End of namespace Fullpipe
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index f72e3ba..fd50671 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -407,6 +407,8 @@ void Scene::updateScrolling() {
 }
 
 void Scene::update(int counterdiff) {
+	debug(0, "Scene::update(%d)", counterdiff);
+
 	for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s)
 		((StaticANIObject *)*s)->update(counterdiff);
 }
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index e64c3d2..edbb5f7 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -62,6 +62,26 @@ void CStepArray::clear() {
 	}
 }
 
+Common::Point *CStepArray::getCurrPoint(Common::Point *point) {
+	if (_isEos || _points == 0) {
+		point->x = 0;
+		point->y = 0;
+	} else {
+		point = _points[_currPointIndex];
+	}
+	return point;
+}
+
+bool CStepArray::gotoNextPoint() {
+	if (_currPointIndex < _maxPointIndex) {
+		_currPointIndex++;
+		return true;
+	} else {
+		_isEos = 1;
+		return false;
+	}
+}
+
 StaticANIObject::StaticANIObject() {
 	_shadowsOn = 1;
 	_field_30 = 0;
@@ -405,7 +425,116 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
 }
 
 void StaticANIObject::update(int counterdiff) {
-	warning("STUB: StaticANIObject::update(%d)", counterdiff);
+	int mqid;
+
+	debug(0, "StaticANIObject::update()");
+
+	if (_flags & 2) {
+		_messageNum--;
+		if (_messageNum)
+			return;
+
+		mqid = _messageQueueId;
+		_messageQueueId = 0;
+		_flags ^= 2;
+
+		updateGlobalMessageQueue(mqid, _id);
+		return;
+	}
+
+	Common::Point point;
+	ExCommand *ex, *newex, *newex1, *newex2;
+
+	if (_movement) {
+		_movement->_counter += counterdiff;
+		if (_movement->_counter >= _movement->_counterMax) {
+			_movement->_counter = 0;
+
+			if (_flags & 1) {
+				if (_counter) {
+					_counter--;
+				} else {
+					DynamicPhase *dyn = _movement->_currDynamicPhase;
+					if (dyn->_initialCountdown != dyn->_countdown)
+						goto LABEL_40;
+					ex = dyn->getExCommand();
+					if (!ex || ex->_messageKind == 35)
+						goto LABEL_40;
+					newex = new ExCommand(ex);
+					newex->_excFlags |= 2;
+					if (newex->_messageKind == 17) {
+						newex->_parentId = _id;
+						newex->_keyCode = _field_4;
+					}
+					ex->sendMessage();
+					if (_movement) {
+					LABEL_40:
+						if (dyn->_initialCountdown != dyn->_countdown
+							 || dyn->_field_68 == 0
+							 || (newex1 = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0)),
+								 newex1->_excFlags = 2,
+								 newex1->_keyCode = _field_4,
+								 newex1->sendMessage(),
+								 (_movement != 0)) {
+							if (_movement->gotoNextFrame(_callback1, _callback2)) {
+								setOXY(_movement->_ox, _movement->_oy);
+								_counter = _initialCounter;
+								if (dyn->_initialCountdown == dyn->_countdown) {
+									ex = dyn->getExCommand();
+									if (ex) {
+										if (ex->_messageKind == 35) {
+											newex2 = new ExCommand(ex);
+											ex->_excFlags |= 2;
+											ex->sendMessage();
+										}
+									}
+								}
+							} else {
+								stopAnim_maybe();
+							}
+							if (_movement) {
+								_stepArray.getCurrPoint(&point);
+								setOXY(point.x + _ox, point.y + _oy);
+								_stepArray.gotoNextPoint();
+								if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
+									adjustSomeXY();
+							}
+						}
+					}
+				}
+			} else if (_flags & 0x20) {
+				_flags ^= 0x20;
+				_flags |= 1;
+				_movement->gotoFirstFrame();
+				_movement->getCurrDynamicPhaseXY(point);
+
+				Common::Point pointS;
+				_statics->getSomeXY(pointS);
+				setOXY(_ox + point.x + _movement->_mx - pointS.x,
+					   _oy + point.y + _movement->_my - pointS.y);
+			}
+		}
+	} else {
+		if (_statics) {
+			if (_messageQueueId) {
+				if (_statics->_countdown) {
+					_statics->_countdown--;
+					return;
+				}
+				mqid = _messageQueueId;
+				_messageQueueId = 0;
+				updateGlobalMessageQueue(mqid, _id);
+			}
+		}
+	}
+}
+
+void StaticANIObject::stopAnim_maybe() {
+	warning("STUB: StaticANIObject::stopAnim_maybe()");
+}
+
+void StaticANIObject::adjustSomeXY() {
+	warning("STUB: StaticANIObject::adjustSomeXY()");
 }
 
 bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
@@ -731,7 +860,7 @@ void Movement::setDynamicPhaseIndex(int index) {
 		gotoNextFrame(0, 0);
 
 	while (_currDynamicPhaseIndex > index)
-		gotoPrevFrame(0, 0);
+		gotoPrevFrame();
 }
 
 void Movement::loadPixelData() {
@@ -768,24 +897,24 @@ void Movement::removeFirstPhase() {
 	_updateFlag1 = 0;
 }
 
-void Movement::gotoNextFrame(int callback1, int callback2) {
+bool Movement::gotoNextFrame(int callback1, int callback2) {
 	debug(0, "Movement::gotoNextFrame(%d, %d)", callback1, callback2);
 
 	if (!callback2) {
 		if (_currMovement) {
 			if ((uint)_currDynamicPhaseIndex == _currMovement->_dynamicPhases.size() - 1
 				&& !(((DynamicPhase *)(_currMovement->_dynamicPhases.back()))->_countdown)) {
-				return;
+				return false;
 			}
 		} else if ((uint)_currDynamicPhaseIndex == _dynamicPhases.size() - 1
 				   && !(((DynamicPhase *)(_dynamicPhases.back()))->_countdown)) {
-			return;
+			return false;
 		}
 	}
 
 	if (_currDynamicPhase->_countdown) {
 		_currDynamicPhase->_countdown--;
-		return;
+		return true;
 	}
 
 	Common::Point point;
@@ -806,11 +935,17 @@ void Movement::gotoNextFrame(int callback1, int callback2) {
 	else
 		_currDynamicPhaseIndex++;
 
+	bool result = true;
+
 	if (_currMovement) {
-		if (_currMovement->_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex)
+		if (_currMovement->_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex) {
 			_currDynamicPhaseIndex = _currMovement->_dynamicPhases.size() - 1;
-		if (_currDynamicPhaseIndex < 0)
+			result = (callback2 == 0);
+		}
+		if (_currDynamicPhaseIndex < 0) {
 			_currDynamicPhaseIndex = 0;
+			result = false;
+		}
 		if (_currMovement->_framePosOffsets) {
 			if (callback1) {
 				point = *_currMovement->_framePosOffsets[_currDynamicPhaseIndex];
@@ -842,10 +977,14 @@ void Movement::gotoNextFrame(int callback1, int callback2) {
 			}
 		}
 	} else {
-		if (_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex)
+		if (_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex) {
 			_currDynamicPhaseIndex = _dynamicPhases.size() - 1;
-		if (_currDynamicPhaseIndex < 0)
+			result = (callback2 == 0);
+		}
+		if (_currDynamicPhaseIndex < 0) {
 			_currDynamicPhaseIndex = 0;
+			result = false;
+		}
 
 		if (_framePosOffsets) {
 			if (callback1) {
@@ -875,10 +1014,19 @@ void Movement::gotoNextFrame(int callback1, int callback2) {
 	_oy += point.y;
 
 	_currDynamicPhase->_countdown = _currDynamicPhase->_initialCountdown;
+
+	return result;
 }
 
-void Movement::gotoPrevFrame(int callback1, int callback2) {
+bool Movement::gotoPrevFrame() {
 	warning("STUB: Movement::gotoPrevFrame()");
+
+	return true;
+}
+
+void Movement::gotoFirstFrame() {
+	while (_currDynamicPhaseIndex)
+			gotoPrevFrame();
 }
 
 void Movement::gotoLastFrame() {
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 9e800c2..ecee6e3 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -42,12 +42,12 @@ class CStepArray : public CObject {
 	void clear();
 
 	int getCurrPointIndex() { return _currPointIndex; }
+	Common::Point *getCurrPoint(Common::Point *point);
+	bool gotoNextPoint();
 };
 
 class StaticPhase : public Picture {
-	friend class DynamicPhase;
-	friend class Movement;
-
+ public:
 	int16 _initialCountdown;
 	int16 _countdown;
 	int16 _field_68;
@@ -63,10 +63,7 @@ class StaticPhase : public Picture {
 };
 
 class DynamicPhase : public StaticPhase {
-	friend class Movement;
-	friend class Statics;
-	friend class StaticANIObject;
-
+ public:
 	int _someX;
 	int _someY;
 	Common::Rect *_rect;
@@ -150,8 +147,9 @@ class Movement : public GameObject {
 	void setDynamicPhaseIndex(int index);
 
 	void removeFirstPhase();
-	void gotoNextFrame(int callback1, int callback2);
-	void gotoPrevFrame(int callback1, int callback2);
+	bool gotoNextFrame(int callback1, int callback2);
+	bool gotoPrevFrame();
+	void gotoFirstFrame();
 	void gotoLastFrame();
 
 	void loadPixelData();
@@ -218,6 +216,9 @@ class StaticANIObject : public GameObject {
 
 	MovTable *countMovements();
 	void setSpeed(int speed);
+
+	void stopAnim_maybe();
+	void adjustSomeXY();
 };
 
 struct MovTable {


Commit: 1ca1a5dfa041179d980676c6aa8fa135f7b69a0e
    https://github.com/scummvm/scummvm/commit/1ca1a5dfa041179d980676c6aa8fa135f7b69a0e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:12-07:00

Commit Message:
FULLPIPE: Implement MessageQueue::chain()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index e68d940..e73a81a 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -253,6 +253,9 @@ void FullpipeEngine::updateEvents() {
 				ex->_excFlags |= 3;
 				ex->handle();
 			}
+
+			_mouseX = event.mouse.x;
+			_mouseY = event.mouse.y;
 			break;
 		case Common::EVENT_QUIT:
 			_gameContinue = false;
@@ -329,7 +332,7 @@ void FullpipeEngine::updateScreen() {
 			}
 		}
 	} else if (_currentScene) {
-		_currentScene->update(42);  // HACK. FIXME
+		//_currentScene->update(42);  // HACK. FIXME
 		_currentScene->draw();
 
 		if (_inventoryScene)
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 3a3ee4bc..43584f4 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -25,6 +25,7 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/messages.h"
 #include "fullpipe/modal.h"
+#include "fullpipe/statics.h"
 
 namespace Fullpipe {
 
@@ -193,8 +194,8 @@ MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {
 	_counter = 0;
 	_field_38 = (field_38 == 0);
 
-	for (uint i = 0; i < src->_exCommands.size(); i++) {
-		ExCommand *ex = new ExCommand((ExCommand *)src->_exCommands[i]);
+	for (Common::List<ExCommand *>::iterator it = src->_exCommands.begin(); it != src->_exCommands.end(); ++it) {
+		ExCommand *ex = new ExCommand(*it);
 		ex->_excFlags |= 2;
 
 		_exCommands.push_back(ex);
@@ -215,6 +216,28 @@ MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {
 	_isFinished = 0;
 }
 
+MessageQueue::~MessageQueue() {
+	for (Common::List<ExCommand *>::iterator it = _exCommands.begin(); it != _exCommands.end(); ++it) {
+		ExCommand *ex = (ExCommand *)*it;
+
+		if (ex && ex->_excFlags & 2)
+			delete ex;
+	}
+
+	_exCommands.clear();
+
+	if (_field_14)
+		delete _field_14;
+
+	if (_flags & 2) {
+		g_fullpipe->_globalMessageQueueList->removeQueueById(_id);
+	}
+
+	finish();
+
+	free(_queueName);
+}
+
 bool MessageQueue::load(MfcArchive &file) {
 	debug(5, "MessageQueue::load()");
 
@@ -227,7 +250,7 @@ bool MessageQueue::load(MfcArchive &file) {
 	_queueName = file.readPascalString();
 
 	for (int i = 0; i < count; i++) {
-		CObject *tmp = file.readClass();
+		ExCommand *tmp = (ExCommand *)file.readClass();
 
 		_exCommands.push_back(tmp);
 	}
@@ -241,9 +264,23 @@ bool MessageQueue::load(MfcArchive &file) {
 }
 
 bool MessageQueue::chain(StaticANIObject *ani) {
-	warning("STUB: MessageQueue::chain()");
+	if (ani)
+		ani->isIdle();
 
-	return true;
+	if (checkGlobalExCommandList1() && checkGlobalExCommandList2()) {
+		if (!(getFlags() & 2)) {
+			g_fullpipe->_globalMessageQueueList->addMessageQueue(this);
+			_flags |= 2;
+		}
+		if (ani) {
+			ani->queueMessageQueue(this);
+			return true;
+		} else {
+			sendNextCommand();
+			return true;
+		}
+	}
+	return false;
 }
 
 void MessageQueue::update() {
@@ -262,15 +299,29 @@ void MessageQueue::messageQueueCallback1(int par) {
 	warning("STUB: MessageQueue::messageQueueCallback1()");
 }
 
+ExCommand *MessageQueue::getExCommandByIndex(uint idx) {
+	if (idx > _exCommands.size())
+		return 0;
+
+	Common::List<ExCommand *>::iterator it = _exCommands.begin();
+
+	while (idx) {
+		++it;
+		idx--;
+	}
+
+	return *it;
+}
+
 void MessageQueue::sendNextCommand() {
 	if (_exCommands.size()) {
 		if (!(_flags & 4) && (_flags & 1)) {
 			messageQueueCallback1(16);
 		}
-		ExCommand *ex = (ExCommand *)_exCommands.front();
-		_exCommands.remove_at(0);
+		ExCommand *ex = _exCommands.front();
+
+		_exCommands.pop_front();
 
-		ex->handleMessage();
 		_counter++;
 		ex->_parId = _id;
 		ex->_excFlags |= (ex->_field_24 == 0 ? 1 : 0) | (ex->_field_3C != 0 ? 2 : 0);
@@ -283,6 +334,76 @@ void MessageQueue::sendNextCommand() {
 	}
 }
 
+bool MessageQueue::checkGlobalExCommandList1() {
+	ExCommand *ex, *ex1;
+
+	for (uint i = 0; i < getCount(); i++) {
+		ex = getExCommandByIndex(i);
+
+		if (ex->_messageKind != 1 && ex->_messageKind != 20 && ex->_messageKind != 5 && ex->_messageKind != 27)
+			continue;
+
+		for (Common::List<ExCommand *>::iterator it = g_fullpipe->_exCommandList.begin(); it != g_fullpipe->_exCommandList.end(); it++) {
+			ex1 = *it;
+
+			if (ex1->_messageKind != 1 && ex1->_messageKind != 20 && ex1->_messageKind != 5 && ex1->_messageKind != 27)
+				continue;
+
+			if (ex1->_keyCode != ex->_keyCode && ex1->_keyCode != -1 && ex->_keyCode != -1)
+				continue;
+
+			MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex1->_parId);
+
+			if (mq) {
+				if (mq->getFlags() & 1)
+					return false;
+			}
+		}
+	}
+	return true;
+}
+
+bool MessageQueue::checkGlobalExCommandList2() {
+	ExCommand *ex, *ex1;
+
+	for (uint i = 0; i < getCount(); i++) {
+		ex = getExCommandByIndex(i);
+
+		if (ex->_messageKind != 1 && ex->_messageKind != 20 && ex->_messageKind != 5 && ex->_messageKind != 27)
+			continue;
+
+		for (Common::List<ExCommand *>::iterator it = g_fullpipe->_exCommandList.begin(); it != g_fullpipe->_exCommandList.end();) {
+			ex1 = *it;
+
+			if (ex1->_messageKind != 1 && ex1->_messageKind != 20 && ex1->_messageKind != 5 && ex1->_messageKind != 27) {
+				it++;
+				continue;
+			}
+
+			if (ex1->_keyCode != ex->_keyCode && ex1->_keyCode != -1 && ex->_keyCode != -1) {
+				it++;
+				continue;
+			}
+
+			MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex1->_parId);
+
+			if (mq) {
+				if (mq->getFlags() & 1)
+					return false;
+
+				delete mq;
+			}
+
+			it = g_fullpipe->_exCommandList.erase(it);
+
+			if (ex1->_excFlags & 2) {
+				delete ex1;
+			}
+		}
+	}
+	return true;
+}
+
 void MessageQueue::finish() {
 	warning("STUB: MessageQueue::finish()");
 }
@@ -299,7 +420,18 @@ MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
 void GlobalMessageQueueList::deleteQueueById(int id) {
 	for (uint i = 0; i < size(); i++)
 		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
-			delete (MessageQueue *)remove_at(i);
+			remove_at(i);
+
+			disableQueueById(id);
+			return;
+		}
+}
+
+void GlobalMessageQueueList::removeQueueById(int id) {
+	for (uint i = 0; i < size(); i++)
+		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
+			((MessageQueue *)((*this).operator[](i)))->_flags &= 0xFD; // It is quite pointless
+			remove_at(i);
 
 			disableQueueById(id);
 			return;
@@ -503,8 +635,8 @@ void processMessages() {
 
 		while (g_fullpipe->_exCommandList.size()) {
 			ExCommand *ex = g_fullpipe->_exCommandList.front();
-			ex->handleMessage();
 			g_fullpipe->_exCommandList.pop_front();
+			ex->handleMessage();
 		}
 		g_fullpipe->_isProcessingMessages = false;
 	}
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index e2e27b5..746765f 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -50,6 +50,8 @@ class Message : public CObject {
  public:
 	Message();
 	Message(Message *src);
+	virtual ~Message() {}
+
 	Message(int16 parentId, int messageKind, int x, int y, int a6, int a7, int sceneClickX, int sceneClickY, int a10);
 };
 
@@ -84,18 +86,14 @@ class CObjstateCommand : public CObject {
 };
 
 class MessageQueue : public CObject {
-	friend class GlobalMessageQueueList;
-	friend class CGameLoader;
-	friend class Scene;
-
-  protected:
+  public:
 	int _id;
 	int _flags;
 	char *_queueName;
 	int16 _dataId;
 	int16 _field_12;
-	int _field_14;
-	CPtrList _exCommands;
+	CObject *_field_14;
+	Common::List<ExCommand *> _exCommands;
 	int _counter;
 	int _field_38;
 	int _isFinished;
@@ -105,23 +103,33 @@ class MessageQueue : public CObject {
  public:
 	MessageQueue();
 	MessageQueue(MessageQueue *src, int parId, int field_38);
+	virtual ~MessageQueue();
+
 	virtual bool load(MfcArchive &file);
 
 	int getFlags() { return _flags; }
 	void setFlags(int flags) { _flags = flags; }
 
+	uint getCount() { return _exCommands.size(); }
+
+	ExCommand *getExCommandByIndex(uint idx);
+
 	bool chain(StaticANIObject *ani);
 	void update();
 	void sendNextCommand();
 	void finish();
 
 	void messageQueueCallback1(int par);
+
+	bool checkGlobalExCommandList1();
+	bool checkGlobalExCommandList2();
 };
 
 class GlobalMessageQueueList : public CPtrList {
   public:
 	MessageQueue *getMessageQueueById(int id);
 	void deleteQueueById(int id);
+	void removeQueueById(int id);
 	void disableQueueById(int id);
 	void addMessageQueue(MessageQueue *msg);
 
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index edbb5f7..4854bb1 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -214,6 +214,26 @@ void StaticANIObject::deleteFromGlobalMessageQueue() {
 	}
 }
 
+void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
+	if (isIdle() && !(_flags & 0x80)) {
+		deleteFromGlobalMessageQueue();
+		_messageQueueId = 0;
+		_messageNum = 0;
+		if (_flags & 2) {
+			_flags ^= 2;
+		}
+		if (mq) {
+			_animExFlag = 0;
+			if (_movement)
+				_messageQueueId = mq->_id;
+			else
+				mq->sendNextCommand();
+		} else {
+			_messageQueueId = 0;
+		}
+	}
+}
+
 bool StaticANIObject::isIdle() {
 	if (_messageQueueId) {
 		MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
@@ -427,7 +447,7 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
 void StaticANIObject::update(int counterdiff) {
 	int mqid;
 
-	debug(0, "StaticANIObject::update()");
+	debug(0, "StaticANIObject::update() (%x)", _flags);
 
 	if (_flags & 2) {
 		_messageNum--;
@@ -443,76 +463,86 @@ void StaticANIObject::update(int counterdiff) {
 	}
 
 	Common::Point point;
-	ExCommand *ex, *newex, *newex1, *newex2;
+	ExCommand *ex, *newex;
 
 	if (_movement) {
 		_movement->_counter += counterdiff;
-		if (_movement->_counter >= _movement->_counterMax) {
-			_movement->_counter = 0;
 
-			if (_flags & 1) {
-				if (_counter) {
-					_counter--;
-				} else {
-					DynamicPhase *dyn = _movement->_currDynamicPhase;
-					if (dyn->_initialCountdown != dyn->_countdown)
-						goto LABEL_40;
-					ex = dyn->getExCommand();
-					if (!ex || ex->_messageKind == 35)
-						goto LABEL_40;
+		if (_movement->_counter < _movement->_counterMax)
+			return;
+
+		_movement->_counter = 0;
+
+		if (_flags & 1) {
+			if (_counter) {
+				_counter--;
+
+				return;
+			}
+
+			DynamicPhase *dyn = _movement->_currDynamicPhase;
+			if (dyn->_initialCountdown == dyn->_countdown) {
+
+				ex = dyn->getExCommand();
+				if (ex && ex->_messageKind == 35) {
 					newex = new ExCommand(ex);
 					newex->_excFlags |= 2;
 					if (newex->_messageKind == 17) {
 						newex->_parentId = _id;
 						newex->_keyCode = _field_4;
 					}
-					ex->sendMessage();
-					if (_movement) {
-					LABEL_40:
-						if (dyn->_initialCountdown != dyn->_countdown
-							 || dyn->_field_68 == 0
-							 || (newex1 = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0)),
-								 newex1->_excFlags = 2,
-								 newex1->_keyCode = _field_4,
-								 newex1->sendMessage(),
-								 (_movement != 0)) {
-							if (_movement->gotoNextFrame(_callback1, _callback2)) {
-								setOXY(_movement->_ox, _movement->_oy);
-								_counter = _initialCounter;
-								if (dyn->_initialCountdown == dyn->_countdown) {
-									ex = dyn->getExCommand();
-									if (ex) {
-										if (ex->_messageKind == 35) {
-											newex2 = new ExCommand(ex);
-											ex->_excFlags |= 2;
-											ex->sendMessage();
-										}
-									}
-								}
-							} else {
-								stopAnim_maybe();
-							}
-							if (_movement) {
-								_stepArray.getCurrPoint(&point);
-								setOXY(point.x + _ox, point.y + _oy);
-								_stepArray.gotoNextPoint();
-								if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
-									adjustSomeXY();
+					newex->sendMessage();
+
+					if (!_movement)
+						return;
+				}
+
+				if (dyn->_initialCountdown == dyn->_countdown && dyn->_field_68 == 0) {
+					newex = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0);
+					newex->_excFlags = 2;
+					newex->_keyCode = _field_4;
+					newex->sendMessage();
+
+					if (!_movement)
+						return;
+				}
+
+				if (!_movement->gotoNextFrame(_callback1, _callback2)) {
+						stopAnim_maybe();
+				} else {
+					setOXY(_movement->_ox, _movement->_oy);
+					_counter = _initialCounter;
+
+					if (dyn->_initialCountdown == dyn->_countdown) {
+						ex = dyn->getExCommand();
+						if (ex) {
+							if (ex->_messageKind == 35) {
+								newex = new ExCommand(ex);
+								newex->_excFlags |= 2;
+								newex->sendMessage();
 							}
 						}
 					}
+					if (!_movement)
+						return;
+
+					_stepArray.getCurrPoint(&point);
+					setOXY(point.x + _ox, point.y + _oy);
+					_stepArray.gotoNextPoint();
+					if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
+						adjustSomeXY();
 				}
-			} else if (_flags & 0x20) {
-				_flags ^= 0x20;
-				_flags |= 1;
-				_movement->gotoFirstFrame();
-				_movement->getCurrDynamicPhaseXY(point);
-
-				Common::Point pointS;
-				_statics->getSomeXY(pointS);
-				setOXY(_ox + point.x + _movement->_mx - pointS.x,
-					   _oy + point.y + _movement->_my - pointS.y);
 			}
+		} else if (_flags & 0x20) {
+			_flags ^= 0x20;
+			_flags |= 1;
+			_movement->gotoFirstFrame();
+			_movement->getCurrDynamicPhaseXY(point);
+
+			Common::Point pointS;
+			_statics->getSomeXY(pointS);
+			setOXY(_ox + point.x + _movement->_mx - pointS.x,
+				   _oy + point.y + _movement->_my - pointS.y);
 		}
 	} else {
 		if (_statics) {
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index ecee6e3..e81a83d 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -200,6 +200,7 @@ class StaticANIObject : public GameObject {
 	bool isIdle();
 
 	void deleteFromGlobalMessageQueue();
+	void queueMessageQueue(MessageQueue *msg);
 
 	void initMovements();
 	void loadMovementsPixelData();


Commit: 60ca9f74ac8dfbfcee4bdae3ffbce039fce42854
    https://github.com/scummvm/scummvm/commit/60ca9f74ac8dfbfcee4bdae3ffbce039fce42854
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:12-07:00

Commit Message:
FULLPIPE: Fix bug with lost picture palettes

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 7d1d938..205a84e 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -260,7 +260,7 @@ void CGameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAn
 	StaticANIObject *ani;
 
 	for (int i = 0; i < picAniInfoCount; i++) {
-		debug(0, "PicAniInfo: id: %d type: %d", picAniInfo[i]->objectId, picAniInfo[i]->type);
+		debug(7, "PicAniInfo: id: %d type: %d", picAniInfo[i]->objectId, picAniInfo[i]->type);
 		if (picAniInfo[i]->type & 2) {
 			pict = sc->getPictureObjectById(picAniInfo[i]->objectId, picAniInfo[i]->field_8);
 			if (pict) {
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 003d619..2c47018 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -333,7 +333,7 @@ bool Picture::load(MfcArchive &file) {
 
 	assert (g_fullpipe->_gameProjectVersion >= 12);
 
-	_alpha = file.readUint32LE();
+	_alpha = file.readUint32LE() & 0xff;
 
 	int havePal = file.readUint32LE();
 
@@ -423,7 +423,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 	if (!_bitmap)
 		return;
 
-	if (_alpha < 0xff) {
+	if ((_alpha & 0xff) < 0xff) {
 		warning("Picture:draw: alpha = %0x", _alpha);
 	}
 
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 43584f4..40cd355 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -88,9 +88,9 @@ bool ExCommand::handleMessage() {
 
 	if (_messageKind == 17 || (_excFlags & 1)) {
 		if (_parId) {
-			MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_parId);
-			if (m)
-				m->update();
+			MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_parId);
+			if (mq)
+				mq->update();
 		}
 	}
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index fd50671..a895010 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -381,6 +381,7 @@ void Scene::objectList_sortByPriority(CPtrList &list) {
 }
 
 void Scene::draw() {
+	debug(0, ">>>>> Scene::draw()");
 	updateScrolling();
 
 	drawContent(60000, 0, true);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 4854bb1..3a82f7d 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -574,7 +574,7 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 		return false;
 	}
 
-	debug(0, "StaticANIObject::setPicAniInfo() (%s [%d])", transCyrillic((byte *)_objectName), _id);
+	debug(0, "StaticANIObject::setPicAniInfo() (%s [%d]) type: %d, statid: %d, movid: %d", transCyrillic((byte *)_objectName), _id, picAniInfo->type, picAniInfo->staticsId, picAniInfo->movementId);
 
 	if (picAniInfo->type & 3) {
 		setOXY(picAniInfo->ox, picAniInfo->oy);
@@ -585,7 +585,7 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	}
 
 	if (picAniInfo->type & 1) {
-		_messageQueueId = picAniInfo->type >> 16;
+		_messageQueueId = (picAniInfo->type >> 16) & 0xffff;
 
 		if (picAniInfo->staticsId) {
 			_statics = getStaticsById(picAniInfo->staticsId);
@@ -928,7 +928,7 @@ void Movement::removeFirstPhase() {
 }
 
 bool Movement::gotoNextFrame(int callback1, int callback2) {
-	debug(0, "Movement::gotoNextFrame(%d, %d)", callback1, callback2);
+	debug(8, "Movement::gotoNextFrame(%d, %d)", callback1, callback2);
 
 	if (!callback2) {
 		if (_currMovement) {
@@ -1151,7 +1151,7 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
 	_field_6A = src->_field_6A;
 	_dynFlags = src->_dynFlags;
 
-	setPaletteData(getPaletteData());
+	setPaletteData(src->getPaletteData());
 
 	copyMemoryObject2(src);
 }
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 900ca84..3684d3c 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -155,7 +155,7 @@ void MemoryObject::loadFile(char *filename) {
 
 			_dataSize = s->size();
 
-			debug(0, "Loading %s (%d bytes)", filename, _dataSize);
+			debug(5, "Loading %s (%d bytes)", filename, _dataSize);
 			_data = (byte *)calloc(_dataSize, 1);
 			s->read(_data, _dataSize);
 


Commit: cee12678dca97e52f57c926f646530cb3e23b176
    https://github.com/scummvm/scummvm/commit/cee12678dca97e52f57c926f646530cb3e23b176
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:12-07:00

Commit Message:
FULLPIPE: Implement sceneHandler01()

Changed paths:
  A engines/fullpipe/interaction.cpp
  A engines/fullpipe/interaction.h
    engines/fullpipe/behavior.cpp
    engines/fullpipe/behavior.h
    engines/fullpipe/constants.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/gfx.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/module.mk
    engines/fullpipe/objects.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/sound.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/utils.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index e7d1bc9..4f9e50d 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -36,4 +36,8 @@ void BehaviorManager::initBehavior(Scene *scene, CGameVar *var) {
 	warning("STUB: BehaviorManager::initBehavior()");
 }
 
+void BehaviorManager::updateBehaviors() {
+	warning("STUB: BehaviorManager::updateBehaviors()");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index 5e3b090..ea618fd 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -34,6 +34,7 @@ class BehaviorManager : public CObject {
 	BehaviorManager();
 
 	void initBehavior(Scene *scene, CGameVar *var);
+	void updateBehaviors();
 };
 
 struct BehaviorEntryInfo {
diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index 53a0831..b1a7565 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -29,6 +29,9 @@ namespace Fullpipe {
 #define ANI_IN1MAN 5110
 #define ANI_INV_MAP 5321
 #define ANI_MAN 322
+#define MSG_SC1_SHOWOSK 1019
+#define MSG_SC1_SHOWOSK2 468
+#define MSG_SC1_UTRUBACLICK 1100
 #define MV_MAN_TURN_LU 486
 #define PIC_CMN_EVAL 3468
 #define PIC_CSR_ARCADE1 4901
@@ -62,6 +65,7 @@ namespace Fullpipe {
 #define PIC_MAP_A13 5275
 #define PIC_MAP_S01 5223
 #define PIC_SC1_KUCHKA 1321
+#define PIC_SC1_LADDER 1091
 #define PIC_SC1_OSK 1018
 #define PIC_SC1_OSK2 2932
 #define SC_1 301
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 205a84e..0b43197 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -26,6 +26,7 @@
 #include "fullpipe/scene.h"
 #include "fullpipe/input.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/interaction.h"
 
 namespace Fullpipe {
 
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index e1a0bac..cc41855 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -32,6 +32,7 @@ namespace Fullpipe {
 class SceneTag;
 class CMctlCompound;
 class CInputController;
+ class CInteractionController;
 
 class CGameLoader : public CObject {
  public:
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 2ee34e1..98dfa20 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -151,12 +151,9 @@ class PictureObject : public GameObject {
 };
 
 class Background : public CObject {
-	friend class FullpipeEngine;
-
   public:
 	CPtrList _picObjList;
 
-  protected:
 	char *_bgname;
 	int _x;
 	int _y;
diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
new file mode 100644
index 0000000..8942d5d
--- /dev/null
+++ b/engines/fullpipe/interaction.cpp
@@ -0,0 +1,99 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/gameloader.h"
+
+namespace Fullpipe {
+
+int handleObjectInteraction(GameObject *subject, GameObject *object, int invId) {
+	return getGameLoaderInteractionController()->handleInteraction(subject, object, invId);
+}
+
+bool CInteractionController::load(MfcArchive &file) {
+	debug(5, "CInteractionController::load()");
+
+	return _interactions.load(file);
+}
+
+void CInteractionController::sortInteractions(int sceneId) {
+	warning("STUB: CInteractionController::sortInteractions(%d)", sceneId);
+}
+
+int CInteractionController::handleInteraction(GameObject *subject, GameObject *object, int invId) {
+	warning("STUB: CInteractionController::handleInteraction()");
+
+	return 0;
+}
+
+CInteraction::CInteraction() {
+	_objectId1 = 0;
+	_objectId2 = 0;
+	_staticsId1 = 0;
+	_objectId3 = 0;
+	_objectState2 = 0;
+	_objectState1 = 0;
+	_messageQueue = 0;
+	_flags = 0;
+	_yOffs = 0;
+	_xOffs = 0;
+	_staticsId2 = 0;
+	_field_28 = 0;
+	_sceneId = -1;
+}
+
+bool CInteraction::load(MfcArchive &file) {
+	debug(5, "CInteraction::load()");
+
+	_objectId1 = file.readUint16LE();
+	_objectId2 = file.readUint16LE();
+	_staticsId1 = file.readUint16LE();
+	_staticsId2 = file.readUint16LE();
+	_objectId3 = file.readUint16LE();
+	_objectState2 = file.readUint32LE();
+	_objectState1 = file.readUint32LE();
+	_xOffs = file.readUint32LE();
+	_yOffs = file.readUint32LE();
+	_sceneId = file.readUint32LE();
+	_flags = file.readUint32LE();
+	_actionName = file.readPascalString();
+
+	_messageQueue = (MessageQueue *)file.readClass();
+
+	return true;
+}
+
+bool EntranceInfo::load(MfcArchive &file) {
+	debug(5, "EntranceInfo::load()");
+
+	_sceneId = file.readUint32LE();
+	_field_4 = file.readUint32LE();
+	_messageQueueId = file.readUint32LE();
+	file.read(_gap_C, 292); // FIXME, Ugh
+	_field_130 = file.readUint32LE();
+
+	return true;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
new file mode 100644
index 0000000..5931f1a
--- /dev/null
+++ b/engines/fullpipe/interaction.h
@@ -0,0 +1,88 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef FULLPIPE_INTERACTION_H
+#define FULLPIPE_INTERACTION_H
+
+#include "fullpipe/utils.h"
+
+namespace Fullpipe {
+
+class GameObject;
+class MessageQueue;
+class StaticANIObject;
+
+int handleObjectInteraction(GameObject *subject, GameObject *object, int invId);
+
+class CInteraction : public CObject {
+	int16 _objectId1;
+	int16 _objectId2;
+	int16 _objectId3;
+	int16 _staticsId1;
+	int16 _staticsId2;
+	int16 _field_E;
+	int _objectState1;
+	int _objectState2;
+	int _xOffs;
+	int _yOffs;
+	MessageQueue *_messageQueue;
+	int _sceneId;
+	int _field_28;
+	int _flags;
+	char *_actionName;
+
+ public:
+	CInteraction();
+	virtual bool load(MfcArchive &file);
+};
+
+class CInteractionController : public CObject {
+	CObList _interactions;
+	int16 _field_20;
+	bool _flag24;
+
+ public:
+	CInteractionController() : _field_20(0), _flag24(true) {}
+
+	virtual bool load(MfcArchive &file);
+
+	void enableFlag24() { _flag24 = true; }
+	void disableFlag24() { _flag24 = false; }
+
+	void sortInteractions(int sceneId);
+
+	int handleInteraction(GameObject *subject, GameObject *object, int invId);
+};
+
+struct EntranceInfo {
+	int32 _sceneId;
+	int32 _field_4;
+	int32 _messageQueueId;
+	byte _gap_C[292]; // FIXME
+	int32 _field_130;
+
+	bool load(MfcArchive &file);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_INTERACTION_H */
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 40cd355..fe9ca51 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -507,8 +507,7 @@ void addMessageHandler(int (*callback)(ExCommand *), int16 id) {
 	allocMessageHandler(curItem, id, callback, index);
 
 	if (curItem)
-      updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
-
+		updateMessageHandlerIndex(curItem->nextItem->nextItem, 1);
 }
 
 MessageHandler *getMessageHandlerById(int16 id) {
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 602478c..81cb0f9 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -8,6 +8,7 @@ MODULE_OBJS = \
 	gfx.o \
 	init.o \
 	input.o \
+	interaction.o \
 	inventory.o \
 	messages.o \
 	modal.o \
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 133320f..33406bb 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -43,44 +43,6 @@ class GameProject : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class CInteraction : public CObject {
-	int16 _objectId1;
-	int16 _objectId2;
-	int16 _objectId3;
-	int16 _staticsId1;
-	int16 _staticsId2;
-	int16 _field_E;
-	int _objectState1;
-	int _objectState2;
-	int _xOffs;
-	int _yOffs;
-	MessageQueue *_messageQueue;
-	int _sceneId;
-	int _field_28;
-	int _flags;
-	char *_actionName;
-
- public:
-	CInteraction();
-	virtual bool load(MfcArchive &file);
-};
-
-class CInteractionController : public CObject {
-	CObList _interactions;
-	int16 _field_20;
-	bool _flag24;
-
- public:
-	CInteractionController() : _field_20(0), _flag24(true) {}
-
-	virtual bool load(MfcArchive &file);
-
-	void enableFlag24() { _flag24 = true; }
-	void disableFlag24() { _flag24 = false; }
-
-	void sortInteractions(int sceneId);
-};
-
 struct PicAniInfo {
 	int32 type;
 	int16 objectId;
@@ -101,16 +63,6 @@ struct PicAniInfo {
 	bool load(MfcArchive &file);
 };
 
-struct EntranceInfo {
-	int32 _sceneId;
-	int32 _field_4;
-	int32 _messageQueueId;
-	byte _gap_C[292]; // FIXME
-	int32 _field_130;
-
-	bool load(MfcArchive &file);
-};
-
 class CMotionController;
 
 class Sc2 : public CObject {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index d2a75c1..5663fc2 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -38,6 +38,7 @@
 #include "fullpipe/objectnames.h"
 #include "fullpipe/scenes.h"
 #include "fullpipe/modal.h"
+#include "fullpipe/interaction.h"
 
 namespace Fullpipe {
 
@@ -695,10 +696,8 @@ void sceneIntro_initScene(Scene *sc) {
 	g_vars->sceneIntro_playing = true;
 	g_vars->sceneIntro_needBlackout = false;
 
-#if 0
 	if (g_fullpipe->_recordEvents || g_fullpipe->_inputArFlag)
 		g_vars->sceneIntro_skipIntro = false;
-#endif
 
 	g_fullpipe->_modalObject = new CModalIntro;
 }
@@ -740,9 +739,54 @@ void scene01_initScene(Scene *sc, int entrance) {
 }
 
 int sceneHandler01(ExCommand *cmd) {
-	warning("STUB: sceneHandler01()");
+	int res = 0;
 
-	return 0;
+	if (cmd->_messageKind != 17)
+		return 0;
+
+	if (cmd->_messageNum > MSG_SC1_SHOWOSK) {
+		if (cmd->_messageNum == MSG_SC1_UTRUBACLICK)
+			handleObjectInteraction(g_fullpipe->_aniMan, g_fullpipe->_currentScene->getPictureObjectById(PIC_SC1_LADDER, 0), 0);
+
+		return 0;
+	}
+
+	if (cmd->_messageNum == MSG_SC1_SHOWOSK) {
+		g_vars->scene01_picSc01Osk->_flags |= 4;
+
+		g_vars->scene01_picSc01Osk->_priority = 20;
+		g_vars->scene01_picSc01Osk2->_priority = 21;
+
+		return 0;
+	}
+
+	if (cmd->_messageNum != 0x21) {
+		if (cmd->_messageNum == MSG_SC1_SHOWOSK2) {
+			g_vars->scene01_picSc01Osk2->_flags |= 4;
+			g_vars->scene01_picSc01Osk2->_priority = 20;
+			g_vars->scene01_picSc01Osk->_priority = 21;
+
+			return 0;
+		}
+
+		return 0;
+	}
+
+	if (g_fullpipe->_aniMan2) {
+		if (g_fullpipe->_aniMan2->_ox < g_fullpipe->_sceneRect.left + 200) {
+			g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan2->_ox - g_fullpipe->_sceneRect.left - 300;
+		}
+
+		if (g_fullpipe->_aniMan2->_ox > g_fullpipe->_sceneRect.right - 200)
+			g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan2->_ox - g_fullpipe->_sceneRect.right + 300;
+
+		res = 1;
+	}
+	g_fullpipe->_behaviorManager->updateBehaviors();
+
+	startSceneTrack();
+
+	return res;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index ced3bf1..996bf5b 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -110,4 +110,8 @@ void FullpipeEngine::setSceneMusicParameters(CGameVar *var) {
 	warning("STUB: FullpipeEngine::setSceneMusicParameters()");
 }
 
+void startSceneTrack() {
+	warning("STUB: startSceneTrack()");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.h b/engines/fullpipe/sound.h
index 93e994a..7750867 100644
--- a/engines/fullpipe/sound.h
+++ b/engines/fullpipe/sound.h
@@ -25,6 +25,8 @@
 
 namespace Fullpipe {
 
+void startSceneTrack();
+
 class Sound : public MemoryObject {
 	int _id;
 	char *_description;
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index bdfeb92..3cc4d00 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -30,6 +30,7 @@
 #include "fullpipe/gameloader.h"
 #include "fullpipe/scene.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/interaction.h"
 
 #include "fullpipe/constants.h"
 
@@ -142,53 +143,6 @@ GameProject::~GameProject() {
 	free(_headerFilename);
 }
 
-bool CInteractionController::load(MfcArchive &file) {
-	debug(5, "CInteractionController::load()");
-
-	return _interactions.load(file);
-}
-
-void CInteractionController::sortInteractions(int sceneId) {
-	warning("STUB: CInteractionController::sortInteractions(%d)", sceneId);
-}
-
-CInteraction::CInteraction() {
-	_objectId1 = 0;
-	_objectId2 = 0;
-	_staticsId1 = 0;
-	_objectId3 = 0;
-	_objectState2 = 0;
-	_objectState1 = 0;
-	_messageQueue = 0;
-	_flags = 0;
-	_yOffs = 0;
-	_xOffs = 0;
-	_staticsId2 = 0;
-	_field_28 = 0;
-	_sceneId = -1;
-}
-
-bool CInteraction::load(MfcArchive &file) {
-	debug(5, "CInteraction::load()");
-
-	_objectId1 = file.readUint16LE();
-	_objectId2 = file.readUint16LE();
-	_staticsId1 = file.readUint16LE();
-	_staticsId2 = file.readUint16LE();
-	_objectId3 = file.readUint16LE();
-	_objectState2 = file.readUint32LE();
-	_objectState1 = file.readUint32LE();
-	_xOffs = file.readUint32LE();
-	_yOffs = file.readUint32LE();
-	_sceneId = file.readUint32LE();
-	_flags = file.readUint32LE();
-	_actionName = file.readPascalString();
-
-	_messageQueue = (MessageQueue *)file.readClass();
-
-	return true;
-}
-
 bool PreloadItems::load(MfcArchive &file) {
 	debug(5, "PreloadItems::load()");
 
@@ -440,16 +394,4 @@ bool PicAniInfo::load(MfcArchive &file) {
 	return true;
 }
 
-bool EntranceInfo::load(MfcArchive &file) {
-	debug(5, "EntranceInfo::load()");
-
-	_sceneId = file.readUint32LE();
-	_field_4 = file.readUint32LE();
-	_messageQueueId = file.readUint32LE();
-	file.read(_gap_C, 292); // FIXME, Ugh
-	_field_130 = file.readUint32LE();
-
-	return true;
-}
-
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 3684d3c..042afd2 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -29,6 +29,7 @@
 #include "fullpipe/motion.h"
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/messages.h"
+#include "fullpipe/interaction.h"
 
 namespace Fullpipe {
 


Commit: c12ea8bd2b495c2d433ffc740bb44d0f32dbc47a
    https://github.com/scummvm/scummvm/commit/c12ea8bd2b495c2d433ffc740bb44d0f32dbc47a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:13-07:00

Commit Message:
FULLPIPE: Implement global_messageHandler1()

Changed paths:
    engines/fullpipe/constants.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/input.cpp
    engines/fullpipe/input.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/modal.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/sound.h
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index b1a7565..43f90ed 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -29,9 +29,24 @@ namespace Fullpipe {
 #define ANI_IN1MAN 5110
 #define ANI_INV_MAP 5321
 #define ANI_MAN 322
+#define MSG_DISABLESAVES 5201
+#define MSG_ENABLESAVES 5202
+#define MSG_HMRKICK_METAL 4764
+#define MSG_HMRKICK_STUCCO 4765
+#define MSG_MANSHADOWSOFF 5196
+#define MSG_MANSHADOWSON 5197
 #define MSG_SC1_SHOWOSK 1019
 #define MSG_SC1_SHOWOSK2 468
 #define MSG_SC1_UTRUBACLICK 1100
+#define MV_MAN_GOLADDER 451
+#define MV_MAN_GOLADDER2 2844
+#define MV_MAN_LOOKUP 4773
+#define MV_MAN_STARTLADDER 452
+#define MV_MAN_STARTLADDER2 2842
+#define MV_MAN_STOPLADDER 454
+#define MV_MAN_STOPLADDER2 2845
+#define MV_MAN_TOLADDER 448
+#define MV_MAN_TOLADDER2 2841
 #define MV_MAN_TURN_LU 486
 #define PIC_CMN_EVAL 3468
 #define PIC_CSR_ARCADE1 4901
@@ -120,12 +135,16 @@ namespace Fullpipe {
 #define SC_MAP 5222
 #define SC_TEST 903
 #define SC_TITLES 5166
+#define SND_CMN_031 3516
+#define SND_CMN_070 5199
 #define ST_LBN_2N 2756
 #define ST_MAN_EMPTY 476
+#define ST_MAN_RIGHT 325
 #define TrubaDown 697
 #define TrubaLeft 474
 #define TrubaRight 696
 #define TrubaUp 680
+#define rMV_MAN_LOOKUP 4775
 
 } // End of namespace Fullpipe
 
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index e73a81a..bca0257 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -105,6 +105,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_mouseVirtX = 0;
 	_mouseVirtY = 0;
 
+	_currSelectedInventoryItemId = 0;
+
 	_behaviorManager = 0;
 
 	_cursorId = 0;
@@ -254,8 +256,7 @@ void FullpipeEngine::updateEvents() {
 				ex->handle();
 			}
 
-			_mouseX = event.mouse.x;
-			_mouseY = event.mouse.y;
+			_mouseScreenPos = event.mouse;
 			break;
 		case Common::EVENT_QUIT:
 			_gameContinue = false;
@@ -311,8 +312,8 @@ void FullpipeEngine::cleanup() {
 }
 
 void FullpipeEngine::updateScreen() {
-	_mouseVirtX = _mouseX + _sceneRect.left;
-	_mouseVirtY = _mouseY + _sceneRect.top;
+	_mouseVirtX = _mouseScreenPos.x + _sceneRect.left;
+	_mouseVirtY = _mouseScreenPos.y + _sceneRect.top;
 
 	//if (inputArFlag)
 	//	updateGame_inputArFlag();
@@ -348,7 +349,7 @@ void FullpipeEngine::updateScreen() {
 	} else {
 		//vrtRectangle(*(_DWORD *)g_vrtHandle, 0, 0, 0, 800, 600);
 	}
-	_inputController->drawCursor(_mouseX, _mouseY);
+	_inputController->drawCursor(_mouseScreenPos.x, _mouseScreenPos.y);
 
 	++_updateTicks;
 }
@@ -404,4 +405,9 @@ void FullpipeEngine::updateMapPiece(int mapId, int update) {
 	}
 }
 
+void FullpipeEngine::disableSaves(ExCommand *ex) {
+	warning("STUB: FullpipeEngine::disableSaves()");
+}
+
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 4123f62..7598ff4 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -88,7 +88,6 @@ public:
 
 	Common::RandomSource *_rnd;
 
-	int _mouseX, _mouseY;
 	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
@@ -106,7 +105,6 @@ public:
 	int _gameProjectVersion;
 	int _pictureScale;
 	int _scrollSpeed;
-	bool _savesEnabled;
 	bool _updateFlag;
 	bool _flgCanOpenMap;
 	bool _gamePaused;
@@ -126,11 +124,18 @@ public:
 	CInputController *_inputController;
 	bool _inputDisabled;
 
+	void defHandleKeyDown(int key);
+
 	SoundList *_currSoundList1[11];
 	int _currSoundListCount;
 	bool _soundEnabled;
 	bool _flgSoundList;
 
+	void stopAllSounds();
+	void toggleMute();
+	void playSound(int id, int flag);
+	void startSceneTrack();
+
 	int _sfxVolume;
 
 	GlobalMessageQueueList *_globalMessageQueueList;
@@ -146,6 +151,7 @@ public:
 
 	int _mouseVirtX;
 	int _mouseVirtY;
+	Common::Point _mouseScreenPos;
 
 	BehaviorManager *_behaviorManager;
 
@@ -163,6 +169,9 @@ public:
 	bool _flgPlayIntro;
 	int _musicAllowed;
 
+	void enableSaves() { _isSaveAllowed = true; }
+	void disableSaves(ExCommand *ex);
+
 	void initObjectStates();
 	void setLevelStates();
 	void setSwallowedEggsState();
@@ -179,6 +188,7 @@ public:
 
 	Scene *_inventoryScene;
 	CInventory2 *_inventory;
+	int _currSelectedInventoryItemId;
 
 	int32 _updateTicks;
 	int32 _lastInputTicks;
@@ -190,6 +200,7 @@ public:
 	int (*_updateCursorCallback)();
 
 	int _cursorId;
+	void setCursor(int id);
 
 	int getObjectState(const char *objname);
 	void setObjectState(const char *name, int state);
@@ -201,6 +212,10 @@ public:
 
 	NGIArchive *_currArchive;
 
+	void openMap();
+	void openHelp();
+	void openMainMenu();
+
 public:
 
 	bool _isSaveAllowed;
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 0b43197..adb8109 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -311,7 +311,7 @@ void CGameLoader::updateSystems(int counterdiff) {
 		_updateCounter++;
 		_exCommand._messageNum = 33;
 		_exCommand._excFlags = 0;
-		postMessage(&_exCommand);
+		_exCommand.postMessage();
 	}
 
 	processMessages();
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 78c6e50..b649c01 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -82,6 +82,10 @@ void CInputController::drawCursor(int x, int y) {
 	warning("STUB: CInputController::drawCursor(%d, %d)", x, y);
 }
 
+void CInputController::setCursor(int id) {
+	warning("STUB: CInputController::setCursor(%d)", id);
+}
+
 CursorInfo::CursorInfo() {
 	pictureId = 0;
 	picture = 0;
@@ -104,4 +108,13 @@ CursorInfo::CursorInfo(CursorInfo *src) {
 	height = src->height;
 }
 
+void FullpipeEngine::setCursor(int id) {
+	if (_inputController)
+		_inputController->setCursor(id);
+}
+
+void FullpipeEngine::defHandleKeyDown(int key) {
+	warning("STUB: FullpipeEngine::defHandleKeyDown(%d)", key);
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
index 06013ab..e527770 100644
--- a/engines/fullpipe/input.h
+++ b/engines/fullpipe/input.h
@@ -65,6 +65,7 @@ class CInputController {
 	void setCursorMode(bool mode);
 
 	void drawCursor(int x, int y);
+	void setCursor(int id);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index c88d6f9..c45c66d 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -110,4 +110,34 @@ void CInventory2::draw() {
 	warning("STUB: CInventory2::draw()");
 }
 
+void CInventory2::slideOut() {
+	_isInventoryOut = true;
+
+	ExCommand *ex = new ExCommand(0, 17, 65, 0, 0, 0, 1, 0, 0, 0);
+
+	ex->_field_2C = 10;
+	ex->_field_14 = _isInventoryOut;
+	ex->_field_20 = !_isInventoryOut;
+	ex->_excFlags |= 3;
+	ex->postMessage();
+}
+
+int CInventory2::handleLeftClick(ExCommand *cmd) {
+	warning("STUB: CInventory2::handleLeftClick()");
+
+	return 0;
+}
+
+int CInventory2::unselectItem(bool flag) {
+	warning("STUB: CInventory2::unselectItem()");
+
+	return 0;
+}
+
+int CInventory2::getHoveredItem(Common::Point *point) {
+	warning("STUB: CInventory2::getHoveredItem()");
+
+	return 0;
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index c449dfc..accfb08 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -87,8 +87,8 @@ class CInventory2 : public CInventory {
 	InventoryIcons _inventoryIcons;
 	int _selectedId;
 	int _field_48;
-	int _isInventoryOut;
-	int _isLocked;
+	bool _isInventoryOut;
+	bool _isLocked;
 	int _topOffset;
 	Scene *_scene;
 	BigPicture *_picture;
@@ -100,7 +100,16 @@ class CInventory2 : public CInventory {
 	void rebuildItemRects();
 
 	Scene *getScene() { return _scene; }
+	bool getIsLocked() { return _isLocked; }
+	void setIsLocked(bool val) { _isLocked = val; }
+	bool getIsInventoryOut() { return _isInventoryOut; }
+
 	int getSelectedItemId() { return _selectedId < 0 ? 0 : _selectedId; }
+	int getHoveredItem(Common::Point *point);
+	void slideOut();
+
+	int handleLeftClick(ExCommand *cmd);
+	int unselectItem(bool flag);
 
 	void draw();
 };
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index fe9ca51..c93cd42 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -106,13 +106,17 @@ void ExCommand::sendMessage() {
 	processMessages();
 }
 
+void ExCommand::postMessage() {
+	g_fullpipe->_exCommandList.push_back(this);
+}
+
 void ExCommand::handle() {
 	if (g_fullpipe->_modalObject) {
 		g_fullpipe->_modalObject->handleMessage(this);
 
 		delete this;
 	} else {
-		postMessage(this);
+		postMessage();
 	}
 }
 
@@ -624,10 +628,6 @@ void clearMessageHandlers() {
 	}
 }
 
-void postMessage(ExCommand *ex) {
-	g_fullpipe->_exCommandList.push_back(ex);
-}
-
 void processMessages() {
 	if (!g_fullpipe->_isProcessingMessages) {
 		g_fullpipe->_isProcessingMessages = true;
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 746765f..650a237 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -72,6 +72,7 @@ class ExCommand : public Message {
 
 	bool handleMessage();
 	void sendMessage();
+	void postMessage();
 	void handle();
 };
 
@@ -153,7 +154,6 @@ int getMessageHandlersCount();
 bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id);
 bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
 void clearMessageHandlers();
-void postMessage(ExCommand *ex);
 void processMessages();
 void updateGlobalMessageQueue(int id, int objid);
 
diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp
index 4728fb2..f7bc633 100644
--- a/engines/fullpipe/modal.cpp
+++ b/engines/fullpipe/modal.cpp
@@ -91,4 +91,16 @@ bool CModalIntro::handleMessage(ExCommand *message) {
 	return true;
 }
 
+void FullpipeEngine::openMap() {
+	warning("STUB: FullpipeEngine::openMap()");
+}
+
+void FullpipeEngine::openHelp() {
+	warning("STUB: FullpipeEngine::openHelp()");
+}
+
+void FullpipeEngine::openMainMenu() {
+	warning("STUB: FullpipeEngine::openMainMenu()");
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 5663fc2..0f1202a 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -91,7 +91,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 
 	_scrollSpeed = 8;
 
-	_savesEnabled = true;
+	_isSaveAllowed = true;
 	_updateFlag = true;
 	_flgCanOpenMap = true;
 
@@ -651,8 +651,173 @@ void setElevatorButton(const char *name, int state) {
 		var->setSubVarAsInt(name, state);
 }
 
+void global_messageHandler_KickStucco() {
+	warning("STUB: global_messageHandler_KickStucco()");
+}
+
+void global_messageHandler_KickMetal() {
+	warning("STUB: global_messageHandler_KickMetal()");
+}
+
 int global_messageHandler1(ExCommand *cmd) {
-	warning("STUB: global_messageHandler1()");
+	if (cmd->_excFlags & 0x10000) {
+		if (cmd->_messageNum == MV_MAN_TOLADDER)
+			cmd->_messageNum = MV_MAN_TOLADDER2;
+		if (cmd->_messageNum == MV_MAN_STARTLADDER)
+			cmd->_messageNum = MV_MAN_STARTLADDER2;
+		if (cmd->_messageNum == MV_MAN_GOLADDER)
+			cmd->_messageNum = MV_MAN_GOLADDER2;
+		if (cmd->_messageNum == MV_MAN_STOPLADDER)
+			cmd->_messageNum = MV_MAN_STOPLADDER2;
+	}
+
+	if (g_fullpipe->_inputDisabled) {
+		if (cmd->_messageKind == 17) {
+			switch (cmd->_messageNum) {
+			case 29:
+			case 30:
+			case 36:
+			case 106:
+				cmd->_messageKind = 0;
+				break;
+			default:
+				break;
+			}
+		}
+	} else if (cmd->_messageKind == 17) {
+		switch (cmd->_messageNum) {
+		case MSG_MANSHADOWSON:
+			g_fullpipe->_aniMan->_shadowsOn = 1;
+			break;
+		case MSG_HMRKICK_STUCCO:
+			global_messageHandler_KickStucco();
+			break;
+		case MSG_MANSHADOWSOFF:
+			g_fullpipe->_aniMan->_shadowsOn = 0;
+			break;
+		case MSG_DISABLESAVES:
+			g_fullpipe->disableSaves(cmd);
+			break;
+		case MSG_ENABLESAVES:
+			g_fullpipe->enableSaves();
+			break;
+		case MSG_HMRKICK_METAL:
+			global_messageHandler_KickMetal();
+			break;
+		case 29: // left mouse
+			if (g_fullpipe->_inventoryScene) {
+				if (getGameLoaderInventory()->handleLeftClick(cmd))
+					cmd->_messageKind = 0;
+			}
+			break;
+		case 107: // right mouse
+			if (getGameLoaderInventory()->getSelectedItemId()) {
+				getGameLoaderInventory()->unselectItem(0);
+				cmd->_messageKind = 0;
+			}
+			break;
+		case 36: // keydown
+			switch (cmd->_keyCode) {
+			case '\x1B': // ESC
+				if (g_fullpipe->_currentScene) {
+					getGameLoaderInventory()->unselectItem(0);
+					g_fullpipe->openMainMenu();
+					cmd->_messageKind = 0;
+				}
+				break;
+			case 't':
+				g_fullpipe->stopAllSounds();
+				cmd->_messageKind = 0;
+				break;
+			case 'u':
+				g_fullpipe->toggleMute();
+				cmd->_messageKind = 0;
+				break;
+			case ' ':
+				if (getGameLoaderInventory()->getIsLocked()) {
+					if (getGameLoaderInventory()->getIsInventoryOut()) {
+						getGameLoaderInventory()->setIsLocked(0);
+					}
+				} else {
+					getGameLoaderInventory()->slideOut();
+					getGameLoaderInventory()->setIsLocked(1);
+				}
+				break;
+			case '\t':
+				if (g_fullpipe->_flgCanOpenMap)
+					g_fullpipe->openMap();
+				cmd->_messageKind = 0;
+				break;
+			case 'p':
+				if (g_fullpipe->_flgCanOpenMap)
+					g_fullpipe->openHelp();
+				cmd->_messageKind = 0;
+				break;
+			default:
+				g_fullpipe->defHandleKeyDown(cmd->_keyCode);
+				break;
+			}
+			break;
+		case 33:
+			if (!g_fullpipe->_inventoryScene)
+				break;
+
+			int invItem;
+
+			if (g_fullpipe->_updateFlag && (invItem = g_fullpipe->_inventory->getHoveredItem(&g_fullpipe->_mouseScreenPos))) {
+				g_fullpipe->_cursorId = PIC_CSR_ITN;
+				if (!g_fullpipe->_currSelectedInventoryItemId && !g_fullpipe->_aniMan->_movement && 
+					!(g_fullpipe->_aniMan->_flags & 0x100) && g_fullpipe->_aniMan->isIdle()) {
+					int st = g_fullpipe->_aniMan->_statics->_staticsId;
+					ExCommand *newex;
+
+					if (st == ST_MAN_RIGHT) {
+						newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, rMV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
+					} else if (st == (0x4000 | ST_MAN_RIGHT)) {
+						newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, MV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
+					}
+					newex->_keyCode = g_fullpipe->_aniMan->_field_4;
+					newex->_excFlags |= 3;
+					newex->postMessage();
+				}
+
+				if (g_fullpipe->_currSelectedInventoryItemId != invItem)
+					g_fullpipe->playSound(SND_CMN_070, 0);
+
+				g_fullpipe->_currSelectedInventoryItemId = invItem;
+				g_fullpipe->setCursor(g_fullpipe->_cursorId);
+				break;
+			}
+			if (g_fullpipe->_updateCursorCallback)
+				g_fullpipe->_updateCursorCallback();
+
+			g_fullpipe->_currSelectedInventoryItemId = 0;
+			g_fullpipe->setCursor(g_fullpipe->_cursorId);
+			break;
+		case 65: // open map
+			if (cmd->_field_2C == 11 && cmd->_field_14 == ANI_INV_MAP && g_fullpipe->_flgCanOpenMap)
+				g_fullpipe->openMap();
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (cmd->_messageKind == 56) {
+		getGameLoaderInventory()->rebuildItemRects();
+
+		ExCommand *newex = new ExCommand(0, 35, SND_CMN_031, 0, 0, 0, 1, 0, 0, 0);
+
+		newex->_field_14 = 1;
+		newex->_excFlags |= 3;
+		newex->postMessage();
+
+		return 1;
+	} else if (cmd->_messageKind == 57) {
+		getGameLoaderInventory()->rebuildItemRects();
+
+		return 1;
+	}
 
 	return 0;
 }
@@ -784,7 +949,7 @@ int sceneHandler01(ExCommand *cmd) {
 	}
 	g_fullpipe->_behaviorManager->updateBehaviors();
 
-	startSceneTrack();
+	g_fullpipe->startSceneTrack();
 
 	return res;
 }
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 996bf5b..7c64dd0 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -110,8 +110,22 @@ void FullpipeEngine::setSceneMusicParameters(CGameVar *var) {
 	warning("STUB: FullpipeEngine::setSceneMusicParameters()");
 }
 
-void startSceneTrack() {
-	warning("STUB: startSceneTrack()");
+void FullpipeEngine::startSceneTrack() {
+	warning("STUB: FullpipeEngine::startSceneTrack()");
 }
 
+void FullpipeEngine::stopAllSounds() {
+	warning("STUB: FullpipeEngine::stopAllSounds()");
+}
+
+void FullpipeEngine::toggleMute() {
+	warning("STUB: FullpipeEngine::toggleMute()");
+}
+
+void FullpipeEngine::playSound(int id, int flag) {
+	warning("STUB: FullpipeEngine::playSounds(%d, %d)", id, flag);
+}
+
+
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.h b/engines/fullpipe/sound.h
index 7750867..93e994a 100644
--- a/engines/fullpipe/sound.h
+++ b/engines/fullpipe/sound.h
@@ -25,8 +25,6 @@
 
 namespace Fullpipe {
 
-void startSceneTrack();
-
 class Sound : public MemoryObject {
 	int _id;
 	char *_description;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index e81a83d..ee99861 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -81,9 +81,7 @@ class DynamicPhase : public StaticPhase {
 };
 
 class Statics : public DynamicPhase {
-	friend class StaticANIObject;
-	friend class Movement;
-
+ public:
  	int16 _staticsId;
 	int16 _field_86;
 	char *_staticsName;
@@ -158,9 +156,7 @@ class Movement : public GameObject {
 };
 
 class StaticANIObject : public GameObject {
-	friend class FullpipeEngine;
-
- protected:
+ public:
 	Movement *_movement;
 	Statics *_statics;
 	int _shadowsOn;


Commit: f90371ebceb987455a21d4358d1421e8cffb4f42
    https://github.com/scummvm/scummvm/commit/f90371ebceb987455a21d4358d1421e8cffb4f42
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:13-07:00

Commit Message:
FULLPIPE: Implement global_messageHandler4() and startAnim()

Changed paths:
    engines/fullpipe/fullpipe.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 7598ff4..ac9cb85 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -66,6 +66,8 @@ int global_messageHandler1(ExCommand *cmd);
 int global_messageHandler2(ExCommand *cmd);
 int global_messageHandler3(ExCommand *cmd);
 int global_messageHandler4(ExCommand *cmd);
+void global_messageHandler_handleSound(ExCommand *cmd);
+
 
 class FullpipeEngine : public ::Engine {
 protected:
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index c93cd42..55a0b5f 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -629,6 +629,7 @@ void clearMessageHandlers() {
 }
 
 void processMessages() {
+	warning("###################### processing");
 	if (!g_fullpipe->_isProcessingMessages) {
 		g_fullpipe->_isProcessingMessages = true;
 
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 650a237..03d30f2 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -76,6 +76,12 @@ class ExCommand : public Message {
 	void handle();
 };
 
+class ExCommand2 : public ExCommand {
+ public:
+	Common::Point **_points;
+	int _pointsSize;
+};
+
 class CObjstateCommand : public CObject {
 	ExCommand _cmd;
 	char *_objCommandName;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index a895010..7ef4e73 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -407,6 +407,10 @@ void Scene::updateScrolling() {
 	warning("STUB Scene::updateScrolling()");
 }
 
+void Scene::updateScrolling2() {
+	warning("STUB Scene::updateScrolling2()");
+}
+
 void Scene::update(int counterdiff) {
 	debug(0, "Scene::update(%d)", counterdiff);
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index defa385..d8d4362 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -55,6 +55,7 @@ class Scene : public Background {
 	void draw();
 	void drawContent(int minPri, int maxPri, bool drawBG);
 	void updateScrolling();
+	void updateScrolling2();
 
 	void update(int counterdiff);
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 0f1202a..f7aa525 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -835,9 +835,230 @@ int global_messageHandler3(ExCommand *cmd) {
 }
 
 int global_messageHandler4(ExCommand *cmd) {
-	warning("STUB: global_messageHandler4()");
+	StaticANIObject *ani = 0;
 
-	return 0;
+	switch (cmd->_messageKind) {
+	case 18: {
+		MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(cmd->_messageNum), cmd->_parId, 0);
+
+		if (cmd->_excFlags & 1)
+			mq->_flag1 = 1;
+		else
+			mq->_flag1 = 0;
+
+		mq->sendNextCommand();
+		break;
+	}
+	case 2:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		ani->trySetMessageQueue(cmd->_messageNum, cmd->_parId);
+		break;
+
+	case 1: {
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		int flags = cmd->_field_14;
+		if (flags <= 0)
+			flags = -1;
+
+		if (cmd->_excFlags & 1)
+			ani->startAnim(cmd->_messageNum, 0, flags);
+		else
+			ani->startAnim(cmd->_messageNum, cmd->_parId, flags);
+
+		break;
+	}
+	case 8:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		ani->startAnimEx(cmd->_messageNum, cmd->_parId, -1, -1);
+		break;
+
+	case 20: {
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		int flags = cmd->_field_14;
+		if (flags <= 0)
+			flags = -1;
+
+		ExCommand2 *cmd2 = (ExCommand2 *)cmd;
+
+		if (cmd->_excFlags & 1) {
+			ani->startAnimSteps(cmd->_messageNum, 0, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize >> 3, flags);
+		} else {
+			ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize >> 3, flags);
+		}
+		break;
+	}
+	case 21:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		ani->queueMessageQueue(0);
+		ani->playIdle();
+		break;
+	case 9:
+		// Nop in original
+		break;
+	case 3:
+		g_fullpipe->_currentScene->_y = cmd->_messageNum - cmd->_messageNum % g_fullpipe->_scrollSpeed;
+		break;
+
+	case 4:
+		g_fullpipe->_currentScene->_x = cmd->_messageNum - cmd->_messageNum % g_fullpipe->_scrollSpeed;
+		break;
+
+	case 19: {
+		if (!g_fullpipe->_currentScene)
+			break;
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		MessageQueue *mq = ani->getMessageQueue();
+		MessageQueue *mq2 = ani->changeStatics1(cmd->_messageNum);
+
+		if (!mq2 || !mq2->getExCommandByIndex(0) || !mq)
+			break;
+
+		mq2->_parId = mq->_id;
+		mq2->_flag1 = (cmd->_field_24 == 0);
+		break;
+	}
+	case 22:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		ani->_flags |= 4;
+		ani->changeStatics2(cmd->_messageNum);
+		break;
+
+	case 6:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		ani->hide();
+		break;
+
+	case 27:
+		if (!g_fullpipe->_currentScene || g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode) == 0) {
+			ani = g_fullpipe->accessScene(cmd->_field_20)->getStaticANIObject1ById(cmd->_parentId, -1);
+			if (ani) {
+				ani = new StaticANIObject(ani);
+				g_fullpipe->_currentScene->addStaticANIObject(ani, 1);
+			}
+		}
+
+		// fall through
+	case 5:
+		if (g_fullpipe->_currentScene)
+			ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+
+		if (!ani)
+			break;
+
+		if (cmd->_field_14 >= 0)
+			ani->_priority = cmd->_field_14;
+
+		ani->show1(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId);
+		break;
+
+	case 10:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		if (cmd->_field_14 >= 0)
+			ani->_priority = cmd->_field_14;
+
+		ani->show2(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId);
+		break;
+
+	case 7: {
+		if (!g_fullpipe->_currentScene->_picObjList.size())
+			break;
+
+		int offX = g_fullpipe->_scrollSpeed * (cmd->_x / g_fullpipe->_scrollSpeed);
+		int offY = g_fullpipe->_scrollSpeed * (cmd->_y / g_fullpipe->_scrollSpeed);
+
+		if (cmd->_messageNum) {
+			g_fullpipe->_currentScene->_x = offX - g_fullpipe->_sceneRect.left;
+			g_fullpipe->_currentScene->_y = offY - g_fullpipe->_sceneRect.top;
+
+			if (cmd->_field_24) {
+				g_fullpipe->_currentScene->_messageQueueId = cmd->_parId;
+			}
+		} else {
+			g_fullpipe->_sceneRect.moveTo(offX, offY);
+
+			g_fullpipe->_currentScene->_x = 0;
+			g_fullpipe->_currentScene->_y = 0;
+
+			g_fullpipe->_currentScene->updateScrolling2();
+		}
+		break;
+	}
+	case 34:
+		if (!g_fullpipe->_currentScene)
+			break;
+
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (!ani)
+			break;
+
+		ani->_flags = cmd->_messageNum | (ani->_flags & ~cmd->_field_14);
+
+		break;
+
+	case 35:
+		global_messageHandler_handleSound(cmd);
+		break;
+
+	case 11:
+	case 12:
+		break;
+	default:
+		return 0;
+		break;
+	}
+
+	return 1;
 }
 
 int defaultUpdateCursor() {
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 7c64dd0..d69ce35 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -126,6 +126,10 @@ void FullpipeEngine::playSound(int id, int flag) {
 	warning("STUB: FullpipeEngine::playSounds(%d, %d)", id, flag);
 }
 
+void global_messageHandler_handleSound(ExCommand *cmd) {
+	warning("STUB: global_messageHandler_handleSound()");
+}
+
 
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 3a82f7d..f03e19c 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -234,6 +234,26 @@ void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
 	}
 }
 
+MessageQueue *StaticANIObject::getMessageQueue() {
+	if (this->_messageQueueId <= 0 )
+		return 0;
+
+	return g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
+}
+
+bool StaticANIObject::trySetMessageQueue(int msgNum, int qId) {
+	if (_messageQueueId || !msgNum) {
+		updateGlobalMessageQueue(qId, _id);
+		return false;
+	}
+
+	_flags |= 2;
+	_messageNum = msgNum;
+	_messageQueueId = qId;
+
+	return true;
+}
+
 bool StaticANIObject::isIdle() {
 	if (_messageQueueId) {
 		MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
@@ -607,6 +627,154 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	return true;
 }
 
+MessageQueue *StaticANIObject::changeStatics1(int msgNum) {
+	warning("STUB: StaticANIObject::changeStatics1(%d)", msgNum);
+
+	return 0;
+}
+
+void StaticANIObject::changeStatics2(int objId) {
+	warning("STUB: StaticANIObject::changeStatics2(%d)", objId);
+}
+
+void StaticANIObject::hide() {
+	if (!_messageQueueId) {
+		if (_flags & 4)
+			_flags ^= 4;
+	}
+}
+
+void StaticANIObject::show1(int x, int y, int movementId, int mqId) {
+	warning("STUB: StaticANIObject::show1(%d, %d, %d, %d)", x, y, movementId, mqId);
+}
+
+void StaticANIObject::show2(int x, int y, int movementId, int mqId) {
+	warning("STUB: StaticANIObject::show2(%d, %d, %d, %d)", x, y, movementId, mqId);
+}
+
+void StaticANIObject::playIdle() {
+	if (isIdle())
+		adjustSomeXY();
+}
+
+void StaticANIObject::startAnimSteps(int movementId, int messageQueueId, int x, int y, Common::Point **points, int pointsCount, int someDynamicPhaseIndex) {
+	warning("STUB: StaticANIObject::startAnimSteps()");
+}
+
+bool StaticANIObject::startAnimEx(int movid, int parId, int flag1, int flag2) {
+	bool res = startAnim(movid, parId, -1);
+	if (res)
+		_animExFlag = 1;
+
+	_someDynamicPhaseIndex = -1;
+	return res;
+}
+
+bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhaseIdx) {
+	if (_flags & 0x80)
+		return false;
+
+	warning("STUB: StaticANIObject::startAnim(%d, %d, %d)", movementId, messageQueueId, dynPhaseIdx);
+
+	if (_messageQueueId) {
+		updateGlobalMessageQueue(messageQueueId, _id);
+		return false;
+	}
+
+	bool found = false;
+	Movement *mov;
+
+	for (uint i = 0; i < _movements.size(); i++) {
+		mov = (Movement *)_movements[i];
+
+		if (mov->_id != movementId) {
+			found = true;
+			break;
+		}
+	}
+
+	if (!found) {
+		updateGlobalMessageQueue(messageQueueId, _id);
+		return false;
+	}
+
+	if (mov == _movement) {
+		_flags |= 1;
+		_messageQueueId = messageQueueId;
+
+		return 1;
+	}
+
+	int newx = _ox;
+	int newy = _oy;
+	Common::Point point;
+
+	if (_movement) {
+		_movement->getCurrDynamicPhaseXY(point);
+	} else if (_statics) {
+		_statics->getSomeXY(point);
+
+		newx -= point.x;
+		newy -= point.y;
+	}
+
+	_movement = mov;
+
+	_stepArray.clear();
+
+	if (_flags & 0x40)
+		_movement->gotoLastFrame();
+	else
+		_movement->gotoFirstFrame();
+
+	if (!(_flags & 0x40)) {
+		if (!_movement->_currDynamicPhaseIndex) {
+			_stepArray.getCurrPoint(&point);
+			newx += point.x + _movement->_mx;
+			newy += point.y + _movement->_my;
+
+			_stepArray.gotoNextPoint();
+
+			ExCommand *ex = _movement->_currDynamicPhase->getExCommand();
+			if (ex) {
+				if (ex->_messageKind == 35) {
+					ExCommand *newex = new ExCommand(ex);
+					newex->_excFlags |= 2;
+					newex->sendMessage();
+				}
+			}
+		}
+	}
+
+	_movement->getCurrDynamicPhaseXY(point);
+	setOXY(point.x + newx, point.y + newy);
+
+	if (_movement->_staticsObj2->_staticsId & 0x4000)
+		_flags |= 8;
+	else
+		_flags &= 0xFFF7;
+
+	_flags |= 1;
+
+	_messageQueueId = messageQueueId;
+	_movement->_currDynamicPhase->_countdown = _movement->_currDynamicPhase->_initialCountdown;
+	_movement->_counter = 0;
+
+	_counter = _initialCounter;
+	_someDynamicPhaseIndex = dynPhaseIdx;
+
+	_stepArray.clear();
+
+	ExCommand *newex = new ExCommand(_id, 17, 23, 0, 0, movementId, 1, 0, 0, 0);
+
+	newex->_keyCode = _field_4;
+	newex->_excFlags = 2;
+
+	newex->postMessage();
+
+	return true;
+}
+
 Statics::Statics() {
 	_staticsId = 0;
 	_picture = 0;
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index ee99861..97a044f 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -197,6 +197,8 @@ class StaticANIObject : public GameObject {
 
 	void deleteFromGlobalMessageQueue();
 	void queueMessageQueue(MessageQueue *msg);
+	MessageQueue *getMessageQueue();
+	bool trySetMessageQueue(int msgNum, int qId);
 
 	void initMovements();
 	void loadMovementsPixelData();
@@ -204,7 +206,16 @@ class StaticANIObject : public GameObject {
 	bool setPicAniInfo(PicAniInfo *picAniInfo);
 
 	void setSomeDynamicPhaseIndex(int val) { _someDynamicPhaseIndex = val; }
+	void adjustSomeXY();
+
+	bool startAnim(int movementId, int messageQueueId, int dynPhaseIdx);
+	bool startAnimEx(int movid, int parId, int flag1, int flag2);
+	void startAnimSteps(int movementId, int messageQueueId, int x, int y, Common::Point **points, int pointsCount, int someDynamicPhaseIndex);
 
+	void hide();
+	void show1(int x, int y, int movementId, int mqId);
+	void show2(int x, int y, int movementId, int mqId);
+	void playIdle();
 	void update(int counterdiff);
 
 	Statics *addReverseStatics(Statics *ani);
@@ -215,7 +226,9 @@ class StaticANIObject : public GameObject {
 	void setSpeed(int speed);
 
 	void stopAnim_maybe();
-	void adjustSomeXY();
+
+	MessageQueue *changeStatics1(int msgNum);
+	void changeStatics2(int objId);
 };
 
 struct MovTable {


Commit: 687d0624e57177322c64bc660132c4c017a6e9f0
    https://github.com/scummvm/scummvm/commit/687d0624e57177322c64bc660132c4c017a6e9f0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:13-07:00

Commit Message:
FULLPIPE: Fix stupid bug with not processed messages

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index bca0257..740c2c2 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -80,7 +80,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_inputArFlag = false;
 	_recordEvents = false;
 
-	_flgSavegameMenuRequested = false;
+	_flgGameIsRunning = true;
 
 	_isProcessingMessages = false;
 
@@ -222,7 +222,7 @@ void FullpipeEngine::updateEvents() {
 			case Common::KEYCODE_s:
 				if (_gamePaused) {
 					_gamePaused = 0;
-					_flgSavegameMenuRequested = true;
+					_flgGameIsRunning = true;
 					return;
 				}
 
@@ -318,8 +318,8 @@ void FullpipeEngine::updateScreen() {
 	//if (inputArFlag)
 	//	updateGame_inputArFlag();
 
-	if (_modalObject || _flgSavegameMenuRequested && (_gameLoader->updateSystems(42), _modalObject != 0)) {
-		if (_flgSavegameMenuRequested) {
+	if (_modalObject || _flgGameIsRunning && (_gameLoader->updateSystems(42), _modalObject != 0)) {
+		if (_flgGameIsRunning) {
 			if (_modalObject->init(42)) {
 				_modalObject->update();
 			} else {
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index ac9cb85..404a70a 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -110,7 +110,7 @@ public:
 	bool _updateFlag;
 	bool _flgCanOpenMap;
 	bool _gamePaused;
-	bool _flgSavegameMenuRequested;
+	bool _flgGameIsRunning;
 	bool _inputArFlag;
 	bool _recordEvents;
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index f7aa525..d2160b7 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -837,6 +837,7 @@ int global_messageHandler3(ExCommand *cmd) {
 int global_messageHandler4(ExCommand *cmd) {
 	StaticANIObject *ani = 0;
 
+	debug(0, "global_messageHandler4: %d %d", cmd->_messageKind, cmd->_messageNum);
 	switch (cmd->_messageKind) {
 	case 18: {
 		MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(cmd->_messageNum), cmd->_parId, 0);


Commit: 13059906c5f68bebb6344cf5617dc62243d146cf
    https://github.com/scummvm/scummvm/commit/13059906c5f68bebb6344cf5617dc62243d146cf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:13-07:00

Commit Message:
FULLPIPE: Rename base class variables to avoid ambigiuity

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index adb8109..f4f59a7 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -199,7 +199,7 @@ bool CGameLoader::gotoScene(int sceneId, int entranceId) {
 
 		StaticANIObject *stobj = g_fullpipe->_currentScene->getStaticANIObject1ById(_field_FA, -1);
 		if (stobj) {
-			stobj->setFlags(stobj->_flags & 0x100);
+			stobj->_flags &= 0x100;
 
 			ExCommand *ex = new ExCommand(stobj->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
 
@@ -220,7 +220,7 @@ bool CGameLoader::gotoScene(int sceneId, int entranceId) {
 	} else {
 		StaticANIObject *stobj = g_fullpipe->_currentScene->getStaticANIObject1ById(_field_FA, -1);
 		if (stobj)
-			stobj->setFlags(stobj->_flags & 0xfeff);
+			stobj->_flags &= 0xfeff;
 	}
 
 	return true;
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 2c47018..d294267 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -96,7 +96,7 @@ bool Background::load(MfcArchive &file) {
 }
 
 void Background::addPictureObject(PictureObject *pct) {
-	if (pct->_field_4)
+	if (pct->_okeyCode)
 		pct->renumPictures(&_picObjList);
 
 	bool inserted = false;
@@ -181,7 +181,7 @@ bool PictureObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	if (picAniInfo->type & 2) {
 		setOXY(picAniInfo->ox, picAniInfo->oy);
 		_priority = picAniInfo->priority;
-		_field_4 = picAniInfo->field_8;
+		_okeyCode = picAniInfo->field_8;
 		setFlags(picAniInfo->flags);
 		_field_8 = picAniInfo->field_24;
 
@@ -192,7 +192,7 @@ bool PictureObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 }
 
 GameObject::GameObject() {
-	_field_4 = 0;
+	_okeyCode = 0;
 	_flags = 0;
 	_id = 0;
 	_ox = 0;
@@ -203,7 +203,7 @@ GameObject::GameObject() {
 }
 
 GameObject::GameObject(GameObject *src) {
-	_field_4 = 1;
+	_okeyCode = 1;
 	_flags = 0;
 	_id = src->_id;
 
@@ -219,7 +219,7 @@ GameObject::GameObject(GameObject *src) {
 
 bool GameObject::load(MfcArchive &file) {
 	debug(5, "GameObject::load()");
-	_field_4 = 0;
+	_okeyCode = 0;
 	_flags = 0;
 	_field_20 = 0;
 	
@@ -247,14 +247,14 @@ void GameObject::renumPictures(CPtrList *lst) {
 
 	for (uint i = 0; i < lst->size(); i++) {
 		if (_id == ((PictureObject *)((*lst)[i]))->_id)
-			buf[((PictureObject *)((*lst)[i]))->_field_4] = 1;
+			buf[((PictureObject *)((*lst)[i]))->_okeyCode] = 1;
 	}
 
-	if (buf[_field_4]) {
+	if (buf[_okeyCode]) {
 		uint count;
 		for (count = 1; buf[count] && count < lst->size() + 2; count++)
 			;
-		_field_4 = count;
+		_okeyCode = count;
 	}
 
 	free(buf);
@@ -322,7 +322,7 @@ bool Picture::load(MfcArchive &file) {
 	_width = file.readUint32LE();
 	_height = file.readUint32LE();
 
-	_flags |= 1;
+	_mflags |= 1;
 
 	_memoryObject2 = new MemoryObject2;
 	_memoryObject2->load(file);
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 98dfa20..a47596c 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -109,7 +109,7 @@ class BigPicture : public Picture {
 
 class GameObject : public CObject {
   public:
-	int16 _field_4;
+	int16 _okeyCode;
 	int16 _field_6;
 	int _field_8;
 	int16 _flags;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 7ef4e73..0bb44e4 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -272,7 +272,7 @@ StaticANIObject *Scene::getAniMan() {
 StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
 	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
 		StaticANIObject *o = (StaticANIObject *)*s;
-		if (o->_id == obj && (a3 == -1 || o->_field_4 == a3))
+		if (o->_id == obj && (a3 == -1 || o->_okeyCode == a3))
 			return o;
 	}
 
@@ -282,7 +282,7 @@ StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
 StaticANIObject *Scene::getStaticANIObject1ByName(char *name, int a3) {
 	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
 		StaticANIObject *o = (StaticANIObject *)*s;
-		if (!strcmp(o->_objectName, name) && (a3 == -1 || o->_field_4 == a3))
+		if (!strcmp(o->_objectName, name) && (a3 == -1 || o->_okeyCode == a3))
 			return o;
 	}
 
@@ -304,13 +304,13 @@ void Scene::deleteStaticANIObject(StaticANIObject *obj) {
 }
 
 void Scene::addStaticANIObject(StaticANIObject *obj, bool addList2) {
-	if (obj->_field_4)
+	if (obj->_okeyCode)
 		obj->renumPictures(&_staticANIObjectList1);
 
 	_staticANIObjectList1.push_back(obj);
 
 	if (addList2) {
-		if (!obj->_field_4)
+		if (!obj->_okeyCode)
 			obj->clearFlags();
 
 		_staticANIObjectList2.push_back(obj);
@@ -325,7 +325,7 @@ void Scene::setPictureObjectsFlag4() {
 
 PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 	for (uint i = 1; i < _picObjList.size(); i++) {
-		if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_field_4 == flags)
+		if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_okeyCode == flags)
 			return (PictureObject *)_picObjList[i];
 	}
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index d2160b7..f3991e2 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -776,7 +776,7 @@ int global_messageHandler1(ExCommand *cmd) {
 					} else if (st == (0x4000 | ST_MAN_RIGHT)) {
 						newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, MV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
 					}
-					newex->_keyCode = g_fullpipe->_aniMan->_field_4;
+					newex->_keyCode = g_fullpipe->_aniMan->_okeyCode;
 					newex->_excFlags |= 3;
 					newex->postMessage();
 				}
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index f03e19c..bef1829 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -509,7 +509,7 @@ void StaticANIObject::update(int counterdiff) {
 					newex->_excFlags |= 2;
 					if (newex->_messageKind == 17) {
 						newex->_parentId = _id;
-						newex->_keyCode = _field_4;
+						newex->_keyCode = _okeyCode;
 					}
 					newex->sendMessage();
 
@@ -520,7 +520,7 @@ void StaticANIObject::update(int counterdiff) {
 				if (dyn->_initialCountdown == dyn->_countdown && dyn->_field_68 == 0) {
 					newex = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0);
 					newex->_excFlags = 2;
-					newex->_keyCode = _field_4;
+					newex->_keyCode = _okeyCode;
 					newex->sendMessage();
 
 					if (!_movement)
@@ -599,7 +599,7 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	if (picAniInfo->type & 3) {
 		setOXY(picAniInfo->ox, picAniInfo->oy);
 		_priority = picAniInfo->priority;
-		_field_4 = picAniInfo->field_8;
+		_okeyCode = picAniInfo->field_8;
 		setFlags(picAniInfo->flags);
 		_field_8 = picAniInfo->field_24;
 	}
@@ -767,7 +767,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 
 	ExCommand *newex = new ExCommand(_id, 17, 23, 0, 0, movementId, 1, 0, 0, 0);
 
-	newex->_keyCode = _field_4;
+	newex->_keyCode = _okeyCode;
 	newex->_excFlags = 2;
 
 	newex->postMessage();
@@ -1277,23 +1277,23 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
 		_dataSize = src->_dataSize;
 
 		if (g_fullpipe->_currArchive) {
-			_field_14 = 0;
+			_mfield_14 = 0;
 			_libHandle = g_fullpipe->_currArchive;
 		}
 
-		_flags |= 1;
+		_mflags |= 1;
 
 		_someX = src->_someX;
 		_someY = src->_someY;
 	} else {
-		_field_14 = src->_field_14;
-		_field_8 = src->_field_8;
-		_flags = src->_flags;
+		_mfield_14 = src->_mfield_14;
+		_mfield_8 = src->_mfield_8;
+		_mflags = src->_mflags;
 
 		_memfilename = (char *)calloc(strlen(src->_memfilename) + 1, 1);
 		strncpy(_memfilename, src->_memfilename, strlen(src->_memfilename) + 1);
 		_dataSize = src->_dataSize;
-		_field_10 = src->_field_10;
+		_mfield_10 = src->_mfield_10;
 		_libHandle = src->_libHandle;
 
 		_bitmap = src->_bitmap;
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 042afd2..fb777cc 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -111,12 +111,12 @@ char *MfcArchive::readPascalString(bool twoByte) {
 
 MemoryObject::MemoryObject() {
 	_memfilename = 0;
-	_field_8 = 0;
-	_field_C = 0;
-	_field_10 = -1;
-	_field_14 = 1;
+	_mfield_8 = 0;
+	_mfield_C = 0;
+	_mfield_10 = -1;
+	_mfield_14 = 1;
 	_dataSize = 0;
-	_flags = 0;
+	_mflags = 0;
 	_libHandle = 0;
 	_data = 0;
 }
@@ -139,7 +139,7 @@ bool MemoryObject::load(MfcArchive &file) {
 	}
 
 	if (g_fullpipe->_currArchive) {
-		_field_14 = 0;
+		_mfield_14 = 0;
 		_libHandle = g_fullpipe->_currArchive;
 	}
 
@@ -168,7 +168,7 @@ void MemoryObject::loadFile(char *filename) {
 byte *MemoryObject::getData() {
 	load();
 
-	if (_field_14 || _flags & 1) {
+	if (_mfield_14 || _mflags & 1) {
 		return _data;
 	} else {
 		error("Unhandled packed data");
@@ -188,10 +188,10 @@ void MemoryObject::freeData() {
 }
 
 bool MemoryObject::testFlags() {
-	if (_field_8)
+	if (_mfield_8)
 		return false;
 
-	if (_flags & 1)
+	if (_mflags & 1)
 		return true;
 
 	return false;
@@ -210,7 +210,7 @@ bool MemoryObject2::load(MfcArchive &file) {
 	debug(5, "MemoryObject2::load()");
 	MemoryObject::load(file);
 
-	_flags |= 1;
+	_mflags |= 1;
 
 	debug(5, "MemoryObject2::load: <%s>", _memfilename);
 
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 00ae76e..cfe9d93 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -83,16 +83,16 @@ class MemoryObject : CObject {
 
  protected:
 	char *_memfilename;
-	int _field_8;
-	int _field_C;
-	int _field_10;
-	char _field_14;
-	char _field_15;
-	char _field_16;
-	char _field_17;
+	int _mfield_8;
+	int _mfield_C;
+	int _mfield_10;
+	char _mfield_14;
+	char _mfield_15;
+	char _mfield_16;
+	char _mfield_17;
 	byte *_data;
 	int _dataSize;
-	int _flags;
+	int _mflags;
 	NGIArchive *_libHandle;
 
  public:


Commit: 3cacf6486d09b2062f5cdb57d283977c7c71d2eb
    https://github.com/scummvm/scummvm/commit/3cacf6486d09b2062f5cdb57d283977c7c71d2eb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:14-07:00

Commit Message:
FULLPIPE: Implement BehaviorManager::updateBehaviors()

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/behavior.h



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 4f9e50d..cf1a436 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -24,6 +24,8 @@
 
 #include "fullpipe/objects.h"
 #include "fullpipe/behavior.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/messages.h"
 
 namespace Fullpipe {
 
@@ -37,7 +39,69 @@ void BehaviorManager::initBehavior(Scene *scene, CGameVar *var) {
 }
 
 void BehaviorManager::updateBehaviors() {
-	warning("STUB: BehaviorManager::updateBehaviors()");
+	if (!_isActive)
+		return;
+
+	for (uint i = 0; i < _behaviors.size(); i++) {
+		BehaviorInfo *beh = _behaviors[i];
+
+		if (!beh->_ani) {
+			beh->_counter++;
+			if (beh->_counter >= beh->_counterMax)
+				updateBehavior(beh, beh->_bheItems[0]);
+
+			continue;
+		}
+
+		if (beh->_ani->_movement || !(beh->_ani->_flags & 4) || (beh->_ani->_flags & 2)) {
+			beh->_staticsId = 0;
+			continue;
+		}
+
+		if (beh->_ani->_statics->_staticsId == beh->_staticsId) {
+			beh->_counter++;
+			if (beh->_counter >= beh->_counterMax) {
+				if (beh->_subIndex >= 0 && !(beh->_flags & 1) && beh->_ani->_messageQueueId <= 0)
+					updateStaticAniBehavior(beh->_ani, beh->_counter, beh->_bheItems[beh->_subIndex]);
+			}
+		} else {
+			beh->_staticsId = beh->_ani->_statics->_staticsId;
+			beh->_counter = 0;
+			beh->_subIndex = -1;
+
+			for (int j = 0; j < beh->_itemsCount; j++)
+				if (beh->_bheItems[j]->_staticsId == beh->_staticsId) {
+					beh->_subIndex = j;
+					break;
+				}
+
+		}
+	}
+}
+
+void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry) {
+	for (int i = 0; i < entry->_itemsCount; i++) {
+		BehaviorEntryInfo *bhi = entry->_items[i];
+		if (!(bhi->_flags & 1)) {
+			if (bhi->_flags & 2) {
+				MessageQueue *mq = new MessageQueue(entry->_items[i]->_messageQueue, 0, 1);
+
+				mq->sendNextCommand();
+
+				entry->_items[i]->_flags &= 0xFFFFFFFD;
+			} else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fullpipe->_rnd->getRandomNumber(32767) <= entry->_items[i]->_percent) {
+				MessageQueue *mq = new MessageQueue(entry->_items[i]->_messageQueue, 0, 1);
+
+				mq->sendNextCommand();
+
+				behaviorInfo->_counter = 0;
+			}
+		}
+	}
+}
+
+void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, unsigned int delay, BehaviorEntry *behaviorEntry) {
+	warning("STUB: BehaviorManager::updateStaticAniBehavior()");
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index ea618fd..5029b3e 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -25,22 +25,10 @@
 
 namespace Fullpipe {
 
-class BehaviorManager : public CObject {
-	CObArray _behaviors;
-	Scene *_scene;
-	bool _isActive;
-
-  public:
-	BehaviorManager();
-
-	void initBehavior(Scene *scene, CGameVar *var);
-	void updateBehaviors();
-};
-
 struct BehaviorEntryInfo {
-	int _messageQueue;
+	MessageQueue *_messageQueue;
 	int _delay;
-	int _percent;
+	uint _percent;
 	int _flags;
 };
 
@@ -48,7 +36,7 @@ struct BehaviorEntry {
 	int _staticsId;
 	int _itemsCount;
 	int _flags;
-	BehaviorEntryInfo *_items;
+	BehaviorEntryInfo **_items;
 };
 
 struct BehaviorInfo {
@@ -59,7 +47,21 @@ struct BehaviorInfo {
 	int _flags;
 	int _subIndex;
 	int _itemsCount;
-	BehaviorEntryInfo *_items;
+	Common::Array<BehaviorEntry *> _bheItems;
+};
+
+class BehaviorManager : public CObject {
+	Common::Array<BehaviorInfo *> _behaviors;
+	Scene *_scene;
+	bool _isActive;
+
+  public:
+	BehaviorManager();
+
+	void initBehavior(Scene *scene, CGameVar *var);
+	void updateBehaviors();
+	void updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry);
+	void updateStaticAniBehavior(StaticANIObject *ani, unsigned int delay, BehaviorEntry *behaviorEntry);
 };
 
 } // End of namespace Fullpipe


Commit: db290e9b0ce3c0a76d42365cd9ca494605f3bf05
    https://github.com/scummvm/scummvm/commit/db290e9b0ce3c0a76d42365cd9ca494605f3bf05
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:14-07:00

Commit Message:
FULLPIPE: Implement BehaviorManager::initBehavior()

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/behavior.h
    engines/fullpipe/scene.h



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index cf1a436..d104894 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -34,8 +34,49 @@ BehaviorManager::BehaviorManager() {
 	_isActive = 1;
 }
 
-void BehaviorManager::initBehavior(Scene *scene, CGameVar *var) {
-	warning("STUB: BehaviorManager::initBehavior()");
+BehaviorManager::~BehaviorManager() {
+	clear();
+}
+
+void BehaviorManager::clear() {
+	for (uint i = 0; i < _behaviors.size(); i++) {
+		for (int j = 0; j < _behaviors[i]->_itemsCount; j++)
+			delete _behaviors[i]->_bheItems[j];
+
+		delete _behaviors[i];
+	}
+	_behaviors.clear();
+}
+
+void BehaviorManager::initBehavior(Scene *sc, CGameVar *var) {
+	clear();
+	_scene = sc;
+
+	BehaviorInfo *behinfo;
+
+	CGameVar *behvar = var->getSubVarByName("BEHAVIOR");
+	if (!behvar)
+		return;
+
+	for (CGameVar *subvar = behvar->_subVars; subvar; subvar = subvar->_nextVarObj) {
+		if (!strcmp(subvar->_varName, "AMBIENT")) {
+			behinfo = new BehaviorInfo;
+			behinfo->initAmbientBehavior(subvar);
+
+			_behaviors.push_back(behinfo);
+		} else {
+			StaticANIObject *ani = sc->getStaticANIObject1ByName(subvar->_varName, -1);
+			if (ani)
+				for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++)
+					if (((StaticANIObject *)sc->_staticANIObjectList1[i])->_id == ani->_id) {
+						behinfo = new BehaviorInfo;
+						behinfo->initObjectBehavior(subvar, sc, ani);
+						behinfo->_ani = (StaticANIObject *)sc->_staticANIObjectList1[i];
+
+						_behaviors.push_back(behinfo);
+					}
+		}
+	}
 }
 
 void BehaviorManager::updateBehaviors() {
@@ -104,4 +145,12 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, unsigned int
 	warning("STUB: BehaviorManager::updateStaticAniBehavior()");
 }
 
+void BehaviorInfo::initAmbientBehavior(CGameVar *var) {
+	warning("STUB: BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
+}
+
+void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sceneObj, StaticANIObject *ani) {
+	warning("STUB: BehaviorInfo::initObjectBehavior(%s)", transCyrillic((byte *)var->_varName));
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index 5029b3e..7cddabc 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -48,6 +48,9 @@ struct BehaviorInfo {
 	int _subIndex;
 	int _itemsCount;
 	Common::Array<BehaviorEntry *> _bheItems;
+
+	void initAmbientBehavior(CGameVar *var);
+	void initObjectBehavior(CGameVar *var, Scene *sceneObj, StaticANIObject *ani);
 };
 
 class BehaviorManager : public CObject {
@@ -57,8 +60,12 @@ class BehaviorManager : public CObject {
 
   public:
 	BehaviorManager();
+	~BehaviorManager();
+
+	void clear();
 
 	void initBehavior(Scene *scene, CGameVar *var);
+
 	void updateBehaviors();
 	void updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry);
 	void updateStaticAniBehavior(StaticANIObject *ani, unsigned int delay, BehaviorEntry *behaviorEntry);
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index d8d4362..1b05234 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -30,10 +30,7 @@ namespace Fullpipe {
 class MessageQueue;
 
 class Scene : public Background {
-	friend class FullpipeEngine;
-	friend class SceneTag;
-	friend class StaticANIObject;
-
+ public:
 	CPtrList _staticANIObjectList1;
 	CPtrList _staticANIObjectList2;
 	CPtrList _messageQueueList;


Commit: 682eb87af6788cf576691ecc938da9dbc48802cf
    https://github.com/scummvm/scummvm/commit/682eb87af6788cf576691ecc938da9dbc48802cf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:14-07:00

Commit Message:
FULLPIPE: Implement BehaviorInfo::initObjectBehavior()

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/behavior.h
    engines/fullpipe/objects.h
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index d104894..f2d0d55 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -145,12 +145,57 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, unsigned int
 	warning("STUB: BehaviorManager::updateStaticAniBehavior()");
 }
 
+void BehaviorInfo::clear() {
+	_ani = 0;
+	_staticsId = 0;
+	_counter = 0;
+	_counterMax = 0;
+	_flags = 0;
+	_subIndex = 0;
+	_itemsCount = 0;
+
+	_bheItems.clear();
+}
+
 void BehaviorInfo::initAmbientBehavior(CGameVar *var) {
 	warning("STUB: BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
 }
 
-void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sceneObj, StaticANIObject *ani) {
-	warning("STUB: BehaviorInfo::initObjectBehavior(%s)", transCyrillic((byte *)var->_varName));
+void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject *ani) {
+	debug(0, "BehaviorInfo::initObjectBehavior(%s)", transCyrillic((byte *)var->_varName));
+
+	clear();
+
+	_itemsCount = var->getSubVarsCount();
+	_counterMax = -1;
+
+	while (var->_varType == 2) {
+		if (strcmp(var->_value.stringValue, "ROOT"))
+			break;
+
+		CGameVar *v1 = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("BEHAVIOR")->getSubVarByName(ani->getName());
+		if (v1 == var)
+			return;
+
+		sc = g_fullpipe->accessScene(ani->_sceneId);
+		clear();
+		var = v1;
+		_itemsCount = var->getSubVarsCount();
+		_counterMax = -1;
+	}
+
+	for (int i = 0; i < _itemsCount; i++) {
+		int maxDelay;
+
+		_bheItems.push_back(new BehaviorEntry(var->getSubVarByIndex(i), sc, ani, &maxDelay));
+
+		if (maxDelay < _counterMax )
+			_counterMax = maxDelay;
+	}
+}
+
+BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *maxDelay) {
+	warning("STUB: BehaviorEntry::BehaviorEntry()");
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index 7cddabc..ecb7d3a 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -37,6 +37,8 @@ struct BehaviorEntry {
 	int _itemsCount;
 	int _flags;
 	BehaviorEntryInfo **_items;
+
+	BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *maxDelay);
 };
 
 struct BehaviorInfo {
@@ -49,8 +51,11 @@ struct BehaviorInfo {
 	int _itemsCount;
 	Common::Array<BehaviorEntry *> _bheItems;
 
+	BehaviorInfo() { clear(); }
+
+	void clear();
 	void initAmbientBehavior(CGameVar *var);
-	void initObjectBehavior(CGameVar *var, Scene *sceneObj, StaticANIObject *ani);
+	void initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject *ani);
 };
 
 class BehaviorManager : public CObject {
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 33406bb..590e8eb 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -115,6 +115,7 @@ class CGameVar : public CObject {
 	CGameVar *addSubVarAsInt(const char *name, int value);
 	bool addSubVar(CGameVar *subvar);
 	int getSubVarsCount();
+	CGameVar *getSubVarByIndex(int idx);
 };
 
 struct PreloadItem {
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 3cc4d00..6d6185e 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -300,6 +300,19 @@ int CGameVar::getSubVarsCount() {
 	return res;
 }
 
+CGameVar *CGameVar::getSubVarByIndex(int idx) {
+	CGameVar *sub = _subVars;
+
+	while (idx--) {
+		sub = sub->_nextVarObj;
+
+		if (!sub)
+			return 0;
+	}
+
+	return sub;
+}
+
 Sc2::Sc2() {
 	_sceneId = 0;
 	_field_2 = 0;


Commit: fce8c0f5952533b592de21205274f5cf9347a3b1
    https://github.com/scummvm/scummvm/commit/fce8c0f5952533b592de21205274f5cf9347a3b1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:14-07:00

Commit Message:
FULLPIPE: Implement BehaviorEntry

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/behavior.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index f2d0d55..5f26efa 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -194,8 +194,57 @@ void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject
 	}
 }
 
-BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *maxDelay) {
-	warning("STUB: BehaviorEntry::BehaviorEntry()");
+BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay) {
+	_staticsId = 0;
+	_itemsCount = 0;
+
+	*minDelay = -1;
+
+	int totalPercent = 0;
+	_flags = 0;
+	_items = 0;
+
+	Statics *st = ani->getStaticsByName(var->_varName);
+	if (st)
+		_staticsId = st->_staticsId;
+
+	_itemsCount = var->getSubVarsCount();
+	if (_itemsCount) {
+		_items = (BehaviorEntryInfo**)calloc(_itemsCount, sizeof(BehaviorEntryInfo *));
+
+		for (int i = 0; i < _itemsCount; i++) {
+			CGameVar *subvar = var->getSubVarByIndex(i);
+
+			_items[i] = new BehaviorEntryInfo(subvar, sc);
+			totalPercent += _items[i]->_percent;
+
+			if (_items[i]->_delay < *minDelay)
+				*minDelay = _items[i]->_delay;
+		}
+
+		if (!*minDelay && totalPercent == 1000)
+			_flags |= 1;
+	}
+}
+
+BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc) {
+	_messageQueue = 0;
+	_delay = 0;
+	_percent = 0;
+	_flags = 0;
+	_messageQueue = sc->getMessageQueueByName(subvar->_varName);
+
+	CGameVar *vart = subvar->getSubVarByName("dwDelay");
+	if (vart)
+		_delay = vart->_value.intValue;
+
+	vart = subvar->getSubVarByName("dwPercent");
+	if (vart)
+		_percent = 0x7FFF * vart->_value.intValue / 1000;
+	
+	vart = subvar->getSubVarByName("dwFlags");
+	if (vart && vart->_varType == 2 && strstr(vart->_value.stringValue, "QDESC_AUTOSTART"))
+		_flags |= 2;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index ecb7d3a..210426e 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -30,6 +30,8 @@ struct BehaviorEntryInfo {
 	int _delay;
 	uint _percent;
 	int _flags;
+
+	BehaviorEntryInfo(CGameVar *subvar, Scene *sc);
 };
 
 struct BehaviorEntry {
@@ -38,7 +40,7 @@ struct BehaviorEntry {
 	int _flags;
 	BehaviorEntryInfo **_items;
 
-	BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *maxDelay);
+	BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay);
 };
 
 struct BehaviorInfo {
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index d294267..6367407 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -200,6 +200,7 @@ GameObject::GameObject() {
 	_priority = 0;
 	_field_20 = 0;
 	_field_8 = 0;
+	_objectName = 0;
 }
 
 GameObject::GameObject(GameObject *src) {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 0bb44e4..7f1aeaa 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -280,8 +280,8 @@ StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
 }
 
 StaticANIObject *Scene::getStaticANIObject1ByName(char *name, int a3) {
-	for (CPtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
-		StaticANIObject *o = (StaticANIObject *)*s;
+	for (uint n = 0; n < _staticANIObjectList1.size(); n++) {
+		StaticANIObject *o = (StaticANIObject *)_staticANIObjectList1[n];
 		if (!strcmp(o->_objectName, name) && (a3 == -1 || o->_okeyCode == a3))
 			return o;
 	}
@@ -340,6 +340,14 @@ MessageQueue *Scene::getMessageQueueById(int messageId) {
 	return 0;
 }
 
+MessageQueue *Scene::getMessageQueueByName(char *name) {
+	for (uint i = 0; i < _messageQueueList.size(); i++)
+		if (!strcmp(((MessageQueue *)_messageQueueList[i])->_queueName, name))
+			return (MessageQueue *)_messageQueueList[i];
+
+	return 0;
+}
+
 void Scene::preloadMovements(CGameVar *var) {
 	CGameVar *preload = var->getSubVarByName("PRELOAD");
 	if (!preload)
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 1b05234..1292bed 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -60,6 +60,7 @@ class Scene : public Background {
 	StaticANIObject *getStaticANIObject1ById(int obj, int a3);
 	StaticANIObject *getStaticANIObject1ByName(char *name, int a3);
 	MessageQueue *getMessageQueueById(int messageId);
+	MessageQueue *getMessageQueueByName(char *name);
 
 	void deleteStaticANIObject(StaticANIObject *obj);
 	void addStaticANIObject(StaticANIObject *obj, bool addList2);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index bef1829..de5d689 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -273,6 +273,14 @@ Statics *StaticANIObject::getStaticsById(int itemId) {
 	return 0;
 }
 
+Statics *StaticANIObject::getStaticsByName(char *name) {
+	for (uint i = 0; i < _staticsList.size(); i++)
+		if (!strcmp(((Statics *)_staticsList[i])->_staticsName, name))
+			return (Statics *)_staticsList[i];
+
+	return 0;
+}
+
 Movement *StaticANIObject::getMovementById(int itemId) {
 	for (uint i = 0; i < _movements.size(); i++)
 		if (((Movement *)_movements[i])->_id == itemId)
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 97a044f..40fc91d 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -187,6 +187,7 @@ class StaticANIObject : public GameObject {
 
 	void setOXY(int x, int y);
 	Statics *getStaticsById(int id);
+	Statics *getStaticsByName(char *name);
 	Movement *getMovementById(int id);
 	int getMovementIdById(int itemId);
 	Movement *getMovementByName(char *name);


Commit: 4db2d7e21b6729b04e1760af302a1acdd3bd4ae4
    https://github.com/scummvm/scummvm/commit/4db2d7e21b6729b04e1760af302a1acdd3bd4ae4
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:14-07:00

Commit Message:
FULLPIPE: Fix crash

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gameloader.h
    engines/fullpipe/interaction.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/motion.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/stateloader.cpp



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index f4f59a7..a91065f 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -51,7 +51,7 @@ CGameLoader::CGameLoader() {
 	_inputController = new CInputController();
 
 	_gameProject = 0;
-	//_gameName = "untitled";
+	_gameName = 0;
 
 	addMessageHandlerByIndex(global_messageHandler2, 0, 0);
 	insertMessageHandler(global_messageHandler3, 0, 128);
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index cc41855..a8d51cd 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -32,7 +32,7 @@ namespace Fullpipe {
 class SceneTag;
 class CMctlCompound;
 class CInputController;
- class CInteractionController;
+class CInteractionController;
 
 class CGameLoader : public CObject {
  public:
diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index 8942d5d..b25a209 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -61,6 +61,7 @@ CInteraction::CInteraction() {
 	_staticsId2 = 0;
 	_field_28 = 0;
 	_sceneId = -1;
+	_actionName = 0;
 }
 
 bool CInteraction::load(MfcArchive &file) {
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 55a0b5f..953b87c 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -171,6 +171,7 @@ Message::Message(int16 parentId, int messageKind, int x, int y, int a6, int a7,
 
 CObjstateCommand::CObjstateCommand() {
 	_value = 0;
+	_objCommandName = 0;
 }
 
 bool CObjstateCommand::load(MfcArchive &file) {
@@ -192,6 +193,7 @@ MessageQueue::MessageQueue() {
 	_id = 0;
 	_isFinished = 0;
 	_flags = 0;
+	_queueName = 0;
 }
 
 MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index fed3cb7..3259653 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -122,6 +122,7 @@ CMovGraphLink::CMovGraphLink() {
 	_field_3C = 0;
 	_field_38 = 0;
 	_movGraphReact = 0;
+	_name = 0;
 }
 
 bool CMovGraphLink::load(MfcArchive &file) {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 7f1aeaa..da89611 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -70,6 +70,7 @@ bool SceneTagList::load(MfcArchive &file) {
 SceneTag::SceneTag() {
 	_field_4 = 0;
 	_scene = 0;
+	_tag = 0;
 }
 
 bool SceneTag::load(MfcArchive &file) {
@@ -123,6 +124,7 @@ Scene::Scene() {
 	_shadows = 0;
 	_soundList = 0;
 	_libHandle = 0;
+	_sceneName = 0;
 }
 
 bool Scene::load(MfcArchive &file) {
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index f3991e2..b6c05af 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -140,7 +140,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 	scene->setPictureObjectsFlag4();
 
 	for (CPtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {
-		StaticANIObject *o = (StaticANIObject *)s;
+		StaticANIObject *o = (StaticANIObject *)*s;
 		o->setFlags(o->_field_6 & 0xFE7F);
 	}
 
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index d69ce35..7a6696e 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -73,7 +73,8 @@ Sound::Sound() {
 	_directSoundBuffer = 0;
 	_soundData = 0;
 	_objectId = 0;
-	 memset(_directSoundBuffers, 0, sizeof(_directSoundBuffers));
+	memset(_directSoundBuffers, 0, sizeof(_directSoundBuffers));
+	_description = 0;
 }
 
 
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 6d6185e..97306c1 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -171,6 +171,7 @@ CGameVar::CGameVar() {
 	_field_14 = 0;
 	_varType = 0;
 	_value.floatValue = 0;
+	_varName = 0;
 }
 
 bool CGameVar::load(MfcArchive &file) {


Commit: 9f52e9f65068e136680e5fbd4a55eb4ff69720c2
    https://github.com/scummvm/scummvm/commit/9f52e9f65068e136680e5fbd4a55eb4ff69720c2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:14-07:00

Commit Message:
FULLPIPE: More work on behaviors. Animations start to (buggy) work.

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/behavior.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/objects.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 5f26efa..2551133 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -61,7 +61,7 @@ void BehaviorManager::initBehavior(Scene *sc, CGameVar *var) {
 	for (CGameVar *subvar = behvar->_subVars; subvar; subvar = subvar->_nextVarObj) {
 		if (!strcmp(subvar->_varName, "AMBIENT")) {
 			behinfo = new BehaviorInfo;
-			behinfo->initAmbientBehavior(subvar);
+			behinfo->initAmbientBehavior(subvar, sc);
 
 			_behaviors.push_back(behinfo);
 		} else {
@@ -83,6 +83,7 @@ void BehaviorManager::updateBehaviors() {
 	if (!_isActive)
 		return;
 
+	debug(0, "BehaviorManager::updateBehaviors()");
 	for (uint i = 0; i < _behaviors.size(); i++) {
 		BehaviorInfo *beh = _behaviors[i];
 
@@ -121,17 +122,18 @@ void BehaviorManager::updateBehaviors() {
 }
 
 void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry) {
+	debug(0, "BehaviorManager::updateBehavior() %d", entry->_itemsCount);
 	for (int i = 0; i < entry->_itemsCount; i++) {
 		BehaviorEntryInfo *bhi = entry->_items[i];
 		if (!(bhi->_flags & 1)) {
 			if (bhi->_flags & 2) {
-				MessageQueue *mq = new MessageQueue(entry->_items[i]->_messageQueue, 0, 1);
+				MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
 
 				mq->sendNextCommand();
 
-				entry->_items[i]->_flags &= 0xFFFFFFFD;
+				bhi->_flags &= 0xFFFFFFFD;
 			} else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fullpipe->_rnd->getRandomNumber(32767) <= entry->_items[i]->_percent) {
-				MessageQueue *mq = new MessageQueue(entry->_items[i]->_messageQueue, 0, 1);
+				MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
 
 				mq->sendNextCommand();
 
@@ -141,8 +143,40 @@ void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *
 	}
 }
 
-void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, unsigned int delay, BehaviorEntry *behaviorEntry) {
-	warning("STUB: BehaviorManager::updateStaticAniBehavior()");
+void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *bhe) {
+	debug(0, "BehaviorManager::updateStaticAniBehavior(%s)", transCyrillic((byte *)ani->_objectName));
+
+	MessageQueue *mq = 0;
+
+	if (bhe->_flags & 1) {
+		uint rnd = g_fullpipe->_rnd->getRandomNumber(32767);
+		uint runPercent = 0;
+		for (int i = 0; i < bhe->_itemsCount; i++) {
+			if (!(bhe->_items[i]->_flags & 1) && bhe->_items[i]->_percent) {
+				if (rnd >= runPercent && rnd <= runPercent + bhe->_items[i]->_percent || i == bhe->_itemsCount - 1) {
+					mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
+					break;
+				}
+				runPercent += bhe->_items[i]->_percent;
+			}
+		}
+	} else {
+		for (int i = 0; i < bhe->_itemsCount; i++) {
+			if (!(bhe->_items[i]->_flags & 1) && delay >= bhe->_items[i]->_delay) {
+				if (bhe->_items[i]->_percent) {
+					if (g_fullpipe->_rnd->getRandomNumber(32767) <= bhe->_items[i]->_percent) {
+						mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	if (mq) {
+		mq->replaceKeyCode(-1, ani->_okeyCode);
+		mq->chain(ani);
+	}
 }
 
 void BehaviorInfo::clear() {
@@ -157,8 +191,28 @@ void BehaviorInfo::clear() {
 	_bheItems.clear();
 }
 
-void BehaviorInfo::initAmbientBehavior(CGameVar *var) {
-	warning("STUB: BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
+void BehaviorInfo::initAmbientBehavior(CGameVar *var, Scene *sc) {
+	debug(0, "BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
+
+	clear();
+	_itemsCount = 1;
+	_counterMax = -1;
+
+	BehaviorEntry *bi = new BehaviorEntry();
+
+	_bheItems.push_back(bi);
+
+	bi->_itemsCount = var->getSubVarsCount();
+
+	bi->_items = (BehaviorEntryInfo**)calloc(bi->_itemsCount, sizeof(BehaviorEntryInfo *));
+
+	for (int i = 0; i < bi->_itemsCount; i++) {
+		int delay;
+		bi->_items[i] = new BehaviorEntryInfo(var->getSubVarByIndex(i), sc, &delay);
+
+		if (bi->_items[i]->_delay <_counterMax)
+			_counterMax = bi->_items[i]->_delay;
+	}
 }
 
 void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject *ani) {
@@ -189,16 +243,23 @@ void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject
 
 		_bheItems.push_back(new BehaviorEntry(var->getSubVarByIndex(i), sc, ani, &maxDelay));
 
-		if (maxDelay < _counterMax )
+		if (maxDelay < _counterMax)
 			_counterMax = maxDelay;
 	}
 }
 
+BehaviorEntry::BehaviorEntry() {
+	_staticsId = 0;
+	_itemsCount = 0;
+	_flags = 0;
+	_items = 0;
+}
+
 BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay) {
 	_staticsId = 0;
 	_itemsCount = 0;
 
-	*minDelay = -1;
+	*minDelay = 100000000;
 
 	int totalPercent = 0;
 	_flags = 0;
@@ -214,9 +275,10 @@ BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int
 
 		for (int i = 0; i < _itemsCount; i++) {
 			CGameVar *subvar = var->getSubVarByIndex(i);
+			int delay;
 
-			_items[i] = new BehaviorEntryInfo(subvar, sc);
-			totalPercent += _items[i]->_percent;
+			_items[i] = new BehaviorEntryInfo(subvar, sc, &delay);
+			totalPercent += delay;
 
 			if (_items[i]->_delay < *minDelay)
 				*minDelay = _items[i]->_delay;
@@ -227,7 +289,7 @@ BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int
 	}
 }
 
-BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc) {
+BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc, int *delay) {
 	_messageQueue = 0;
 	_delay = 0;
 	_percent = 0;
@@ -241,7 +303,9 @@ BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc) {
 	vart = subvar->getSubVarByName("dwPercent");
 	if (vart)
 		_percent = 0x7FFF * vart->_value.intValue / 1000;
-	
+
+	*delay = vart->_value.intValue;
+
 	vart = subvar->getSubVarByName("dwFlags");
 	if (vart && vart->_varType == 2 && strstr(vart->_value.stringValue, "QDESC_AUTOSTART"))
 		_flags |= 2;
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index 210426e..d9375d4 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -28,10 +28,10 @@ namespace Fullpipe {
 struct BehaviorEntryInfo {
 	MessageQueue *_messageQueue;
 	int _delay;
-	uint _percent;
+	uint32 _percent;
 	int _flags;
 
-	BehaviorEntryInfo(CGameVar *subvar, Scene *sc);
+	BehaviorEntryInfo(CGameVar *subvar, Scene *sc, int *delay);
 };
 
 struct BehaviorEntry {
@@ -40,6 +40,7 @@ struct BehaviorEntry {
 	int _flags;
 	BehaviorEntryInfo **_items;
 
+	BehaviorEntry();
 	BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay);
 };
 
@@ -56,7 +57,7 @@ struct BehaviorInfo {
 	BehaviorInfo() { clear(); }
 
 	void clear();
-	void initAmbientBehavior(CGameVar *var);
+	void initAmbientBehavior(CGameVar *var, Scene *sc);
 	void initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject *ani);
 };
 
@@ -75,7 +76,7 @@ class BehaviorManager : public CObject {
 
 	void updateBehaviors();
 	void updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry);
-	void updateStaticAniBehavior(StaticANIObject *ani, unsigned int delay, BehaviorEntry *behaviorEntry);
+	void updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *beh);
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 6367407..df48a1c 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -199,6 +199,7 @@ GameObject::GameObject() {
 	_oy = 0;
 	_priority = 0;
 	_field_20 = 0;
+	_field_6 = 0;
 	_field_8 = 0;
 	_objectName = 0;
 }
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 953b87c..22343af 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -414,10 +414,20 @@ void MessageQueue::finish() {
 	warning("STUB: MessageQueue::finish()");
 }
 
+void MessageQueue::replaceKeyCode(int key1, int key2) {
+	for (uint i = 0; i < getCount(); i++) {
+		ExCommand *ex = getExCommandByIndex(i);
+		int k = ex->_messageKind;
+		if ((k == 1 || k == 20 || k == 5 || k == 6 || k == 2 || k == 18 || k == 19 || k == 22 || k == 55)
+					&& ex->_keyCode == key1)
+			ex->_keyCode = key2;
+    }
+}
+
 MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
 	for (CPtrList::iterator s = begin(); s != end(); ++s) {
-		if (((MessageQueue *)s)->_id == id)
-			return (MessageQueue *)s;
+		if (((MessageQueue *)*s)->_id == id)
+			return (MessageQueue *)*s;
 	}
 
 	return 0;
@@ -446,8 +456,8 @@ void GlobalMessageQueueList::removeQueueById(int id) {
 
 void GlobalMessageQueueList::disableQueueById(int id) {
 	for (CPtrList::iterator s = begin(); s != end(); ++s) {
-		if (((MessageQueue *)s)->_parId == id)
-			((MessageQueue *)s)->_parId = 0;
+		if (((MessageQueue *)*s)->_parId == id)
+			((MessageQueue *)*s)->_parId = 0;
 	}
 }
 
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 03d30f2..d202235 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -121,6 +121,8 @@ class MessageQueue : public CObject {
 
 	ExCommand *getExCommandByIndex(uint idx);
 
+	void replaceKeyCode(int key1, int key2);
+
 	bool chain(StaticANIObject *ani);
 	void update();
 	void sendNextCommand();
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index 590e8eb..dd1545f 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -91,7 +91,7 @@ class Sc2Array : public Common::Array<Sc2> {
 
 union VarValue {
 	float floatValue;
-	int intValue;
+	int32 intValue;
 	char *stringValue;
 };
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index b6c05af..843b098 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -141,7 +141,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
 
 	for (CPtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {
 		StaticANIObject *o = (StaticANIObject *)*s;
-		o->setFlags(o->_field_6 & 0xFE7F);
+		o->setFlags(o->_flags & 0xFE7F);
 	}
 
 	PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index de5d689..168ec90 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -1225,7 +1225,48 @@ bool Movement::gotoNextFrame(int callback1, int callback2) {
 }
 
 bool Movement::gotoPrevFrame() {
-	warning("STUB: Movement::gotoPrevFrame()");
+	debug(8, "Movement::gotoPrevFrame()");
+
+	if (!_currDynamicPhaseIndex) {
+		gotoLastFrame();
+		return false;
+	}
+
+	Common::Point point;
+
+	getCurrDynamicPhaseXY(point);
+
+	_ox -= point.x;
+	_oy -= point.y;
+
+	if (_currMovement) {
+		if (_currMovement->_framePosOffsets) {
+			_ox += _currMovement->getDimensionsOfPhase(&point, _currDynamicPhaseIndex)->x;
+			_ox += _currMovement->_framePosOffsets[_currDynamicPhaseIndex]->x;
+			_oy -= _currMovement->_framePosOffsets[_currDynamicPhaseIndex]->y;
+		}
+
+		_currDynamicPhaseIndex--;
+		if (_currDynamicPhaseIndex < 0)
+			_currDynamicPhaseIndex = _currMovement->_dynamicPhases.size() - 1;
+
+		_ox -= _currMovement->getDimensionsOfPhase(&point, _currDynamicPhaseIndex)->x;
+	} else {
+		if (_framePosOffsets) {
+			_ox -= _framePosOffsets[_currDynamicPhaseIndex]->x;
+			_oy -= _framePosOffsets[_currDynamicPhaseIndex]->y;
+		}
+
+		_currDynamicPhaseIndex--;
+		if (_currDynamicPhaseIndex < 0)
+			_currDynamicPhaseIndex = _currMovement->_dynamicPhases.size() - 1;
+	}
+
+	updateCurrDynamicPhase();
+	getCurrDynamicPhaseXY(point);
+
+	_ox += point.x;
+	_oy += point.y;
 
 	return true;
 }


Commit: 2167968d21d4a94d6077204f28e6d188ccaa9d5d
    https://github.com/scummvm/scummvm/commit/2167968d21d4a94d6077204f28e6d188ccaa9d5d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:15-07:00

Commit Message:
FULLPIPE: Implement Movement::draw()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index df48a1c..e5cbac3 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -798,6 +798,24 @@ Bitmap *Bitmap::reverseImage() {
 	return this;
 }
 
+Bitmap *Bitmap::flipVertical() {
+	warning("STUB: Bitmap::flipVertical()");
+
+	return this;
+}
+
+	void Bitmap::drawShaded(int type, int x, int y, byte *palette) {
+	warning("STUB: Bitmap::drawShaded(%d, %d, %d)", type, x, y);
+
+	putDib(x, y, (int32 *)palette);
+}
+
+	void Bitmap::drawRotated(int x, int y, int angle, byte *palette) {
+	warning("STUB: Bitmap::drawShaded(%d, %d, %d)", x, y, angle);
+
+	putDib(x, y, (int32 *)palette);
+}
+
 bool BigPicture::load(MfcArchive &file) {
 	debug(5, "BigPicture::load()");
 	Picture::load(file);
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index a47596c..7cc18ad 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -52,6 +52,10 @@ struct Bitmap {
 	void copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_format);
 
 	Bitmap *reverseImage();
+	Bitmap *flipVertical();
+
+	void drawShaded(int type, int x, int y, byte *palette);
+	void drawRotated(int x, int y, int angle, byte *palette);
 };
 
 class Picture : public MemoryObject {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 168ec90..0bb580f 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -313,6 +313,56 @@ Movement *StaticANIObject::getMovementByName(char *name) {
 
 void Movement::draw(bool flipFlag, int angle) {
 	warning("STUB: Movement::draw(%d, %d)", flipFlag, angle);
+
+	Common::Point point;
+
+	getCurrDynamicPhaseXY(point);
+
+	int x = _ox - point.x;
+	int y = _oy - point.y;
+
+	if (_currDynamicPhase->getPaletteData())
+		g_fullpipe->_globalPalette = _currDynamicPhase->getPaletteData();
+
+	if (_currDynamicPhase->getAlpha() < 0xFF) {
+		warning("Movement::draw: alpha < 0xff: %d", _currDynamicPhase->getAlpha());
+		//vrtSetAlphaBlendMode(g_vrtDrawHandle, 1, _currDynamicPhase->getAlpha());
+	}
+
+	Bitmap *bmp;
+	if (_currMovement) {
+		bmp = _currDynamicPhase->getPixelData()->reverseImage();
+	} else {
+		bmp = _currDynamicPhase->getPixelData();
+	}
+
+	if (flipFlag) {
+		bmp->flipVertical()->drawShaded(1, x, y + 30 + _currDynamicPhase->_rect->bottom, _currDynamicPhase->_paletteData);
+	} if (angle) {
+		bmp->drawRotated(x, y, angle, _currDynamicPhase->_paletteData);
+	} else {
+		bmp->putDib(x, y, (int32 *)_currDynamicPhase->_paletteData);
+	}
+
+	if (_currDynamicPhase->_rect->top) {
+		if (!_currDynamicPhase->_convertedBitmap) {
+			//v12 = Picture_getPixelData(v5);
+			//v13 = Bitmap_convertTo16Bit565(v12, (unsigned int *)&_currDynamicPhase->rect);
+			//_currDynamicPhase->convertedBitmap = v13;
+		}
+
+		if (_currDynamicPhase->_convertedBitmap) {
+			if (_currMovement) {
+				//vrtSetAlphaBlendMode(g_vrtDrawHandle, 1, LOBYTE(_currDynamicPhase->rect.top));
+				_currDynamicPhase->_convertedBitmap->reverseImage()->putDib(x, y, (int32 *)_currDynamicPhase->_paletteData);
+				//vrtSetAlphaBlendMode(g_vrtDrawHandle, 0, 255);
+			} else {
+				//vrtSetAlphaBlendMode(g_vrtDrawHandle, 1, LOBYTE(_currDynamicPhase->rect.top));
+				_currDynamicPhase->_convertedBitmap->putDib(x, y, (int32 *)_currDynamicPhase->_paletteData);
+				//vrtSetAlphaBlendMode(g_vrtDrawHandle, 0, 255);
+			}
+		}
+	}
 }
 
 


Commit: 0945b4595656c32997d32aa64ed14e0d073731dd
    https://github.com/scummvm/scummvm/commit/0945b4595656c32997d32aa64ed14e0d073731dd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:15-07:00

Commit Message:
FULLPIPE: Implement StaticANIObject::stopAnim_maybe()

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 0bb580f..6de3b69 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -638,7 +638,70 @@ void StaticANIObject::update(int counterdiff) {
 }
 
 void StaticANIObject::stopAnim_maybe() {
-	warning("STUB: StaticANIObject::stopAnim_maybe()");
+	debug(0, "StaticANIObject::stopAnim_maybe()");
+
+	if (!(_flags & 1))
+		return;
+
+	_flags ^= 1;
+
+	int oid = 0;
+	int oldmqid = _messageQueueId;
+	Common::Point point;
+
+	if (_movement) {
+		setOXY(_movement->_ox, _movement->_oy);
+
+		if (_flags & 0x40) {
+			if (!_movement->_currMovement && !_movement->_currDynamicPhaseIndex) {
+				_statics = _movement->_staticsObj1;
+				_movement->getCurrDynamicPhaseXY(point);
+				_ox -= point.x;
+				_oy -= point.y;
+
+				_ox -= _movement->_mx;
+				_oy -= _movement->_my;
+
+				if (_movement->_currMovement) {
+					_oy += point.y;
+					_ox -= point.x;
+					_ox += _statics->getDimensions(&point)->x;
+				} else {
+					_statics->getSomeXY(point);
+					_ox += point.x;
+					_oy += point.y;
+				}
+			}
+		}
+
+		if (_movement->_currDynamicPhaseIndex || !(_flags & 0x40))
+			_statics = _movement->_staticsObj2;
+
+		_statics->getSomeXY(point);
+
+		_statics->_x = _ox - point.x;
+		_statics->_y = _oy - point.y;
+		oid = _movement->_id;
+		_movement = 0;
+
+		ExCommand *ex = new ExCommand(oid, 17, 24, 0, 0, 0, 1, 0, 0, 0);
+		ex->_keyCode = _okeyCode;
+		ex->_excFlags = 2;
+		ex->postMessage();
+	}
+
+	int mqid = _messageQueueId;
+
+	if (_animExFlag) {
+		_messageQueueId = 0;
+		startAnimEx(oid, mqid, -1, -1);
+	} else {
+		if (_messageQueueId == oldmqid) {
+			_messageQueueId = 0;
+			if (_field_34 == 1)
+				updateGlobalMessageQueue(mqid, oldmqid);
+		}
+	}
 }
 
 void StaticANIObject::adjustSomeXY() {


Commit: 4db508bec199666d5287889ca24656bf0705a4f2
    https://github.com/scummvm/scummvm/commit/4db508bec199666d5287889ca24656bf0705a4f2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:15-07:00

Commit Message:
FULLPIPE: Unstubbed Picture::draw()

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index e5cbac3..9c19762 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -436,13 +436,20 @@ void Picture::draw(int x, int y, int style, int angle) {
 		pal = g_fullpipe->_globalPalette;
 	}
 
+	Common::Point point;
+
 	switch (style) {
 	case 1:
 		//flip
-		warning("STUB: Picture::draw: style 1");
+		getDimensions(&point);
+		_bitmap->flipVertical()->drawShaded(1, x1, y1 + 30 + point.y, pal);
 		break;
 	case 2:
-		error("STUB: Picture::draw: style 2");
+		//vrtSetFadeRatio(g_vrtDrawHandle, 0.34999999);
+		//vrtSetFadeTable(g_vrtDrawHandle, &unk_477F88, 1.0, 1000.0, 0, 0);
+		_bitmap->drawShaded(2, x1, y1, pal);
+		//vrtSetFadeRatio(g_vrtDrawHandle, 0.0);
+		//vrtSetFadeTable(g_vrtDrawHandle, &unk_477F90, 1.0, 1000.0, 0, 0);
 		break;
 	default:
 		if (angle)
@@ -804,7 +811,7 @@ Bitmap *Bitmap::flipVertical() {
 	return this;
 }
 
-	void Bitmap::drawShaded(int type, int x, int y, byte *palette) {
+void Bitmap::drawShaded(int type, int x, int y, byte *palette) {
 	warning("STUB: Bitmap::drawShaded(%d, %d, %d)", type, x, y);
 
 	putDib(x, y, (int32 *)palette);


Commit: 6a172694fb5da9851447eaf30403e63ed032b98b
    https://github.com/scummvm/scummvm/commit/6a172694fb5da9851447eaf30403e63ed032b98b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:15-07:00

Commit Message:
FULLPIPE: Implement Bitmap::reverseImage()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 9c19762..9b15d69 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -31,6 +31,28 @@
 
 namespace Fullpipe {
 
+Bitmap::Bitmap() {
+	_x = 0;
+	_y = 0;
+	_width = 0;
+	_height = 0;
+	_pixels = 0;
+	_type = 0;
+	_dataSize = 0;
+	_flags = 0;
+}
+
+Bitmap::Bitmap(Bitmap *src) {
+	_x = src->_x;
+	_y = src->_y;
+	_flags = src->_flags;
+	_dataSize = src->_dataSize;
+	_type = src->_type;
+	_width = src->_width;
+	_height = src->_height;
+	_pixels = src->_pixels;
+}
+
 void Bitmap::load(Common::ReadStream *s) {
 	debug(5, "Bitmap::load()");
 
@@ -40,10 +62,10 @@ void Bitmap::load(Common::ReadStream *s) {
 	_height = s->readUint32LE();
 	s->readUint32LE(); // pixels
 	_type = s->readUint32LE();
-	_field_18 = s->readUint32LE();
+	_dataSize = s->readUint32LE();
 	_flags = s->readUint32LE();
 
-	debug(8, "Bitmap: x: %d y: %d w: %d h: %d field_18: 0x%x", _x, _y, _width, _height, _field_18);
+	debug(8, "Bitmap: x: %d y: %d w: %d h: %d dataSize: 0x%x", _x, _y, _width, _height, _dataSize);
 	debug(8, "Bitmap: type: %s (0x%04x) flags: 0x%x", Common::tag2string(_type).c_str(), _type, _flags);
 }
 
@@ -565,6 +587,7 @@ void Bitmap::putDibRB(int32 *palette) {
 		starty = 0;
 
 	y = endy;
+
 	srcPtr = (uint16 *)_pixels;
 
 	bool breakup = false;
@@ -606,6 +629,7 @@ void Bitmap::putDibRB(int32 *palette) {
 					if (x <= 799 + 1 || (fillLen += 799 - x + 1, fillLen > 0)) {
 						if (y <= endy) {
 							curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
+
 							int bgcolor = palette[(pixel >> 8) & 0xff];
 							colorFill(curDestPtr, fillLen, bgcolor);
 						}
@@ -800,7 +824,68 @@ void Bitmap::copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_
 }
 
 Bitmap *Bitmap::reverseImage() {
-	warning("STUB: Bitmap::reverseImage()");
+	switch (_type) {
+	case MKTAG('R', 'B', '\0', '\0'):
+		return reverseImageRB();
+	case MKTAG('C', 'B', '\0', '\0'):
+		return reverseImageCB();
+	case MKTAG('C', 'B', '\05', 'e'):
+		return reverseImageCB05();
+	default:
+		error("Bitmap::reverseImage: Unknown image type: %x", _type);
+	}
+
+	return 0;
+}
+
+Bitmap *Bitmap::reverseImageRB() {
+	uint16 *newpixels = (uint16 *)calloc(((_dataSize + 15) & 0xfffffff0) + sizeof(Bitmap), 1);
+	uint16 *srcPtr = (uint16 *)_pixels;
+
+	int idx = 0;
+	while (srcPtr[idx] != 0x100) {
+		uint16 *srcPtr2 = &srcPtr[idx];
+
+		int prevIdx = idx;
+		int i = idx;
+
+		while (*srcPtr2) {
+			++srcPtr2;
+			++idx;
+		}
+
+		int idx2 = idx;
+
+		newpixels[idx] = srcPtr[idx];
+
+		while (i != idx) {
+			int fillLen = 2 - ((srcPtr[prevIdx] & 0xff) != 0 ? 1 : 0);
+			idx2 -= fillLen;
+			memcpy(&newpixels[idx2], &srcPtr[prevIdx], 2 * fillLen);
+			prevIdx = fillLen + i;
+			i += fillLen;
+		}
+		++idx;
+	}
+	newpixels[idx] = 256;
+
+	int oldBmp = ((_dataSize + 15) >> 1) & 0x7FFFFFF8;
+	memcpy(&newpixels[oldBmp], &srcPtr[oldBmp], sizeof(Bitmap));
+
+	Bitmap *res = new Bitmap(this);
+	res->_pixels = (byte *)newpixels;
+
+	return res;
+}
+
+Bitmap *Bitmap::reverseImageCB() {
+	warning("STUB: Bitmap::reverseImageCB()");
+
+	return this;
+}
+
+Bitmap *Bitmap::reverseImageCB05() {
+	warning("STUB: Bitmap::reverseImageCB05()");
 
 	return this;
 }
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 7cc18ad..eeff026 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -38,9 +38,12 @@ struct Bitmap {
 	int _height;
 	byte *_pixels;
 	int _type;
-	int _field_18;
+	int _dataSize;
 	int _flags;
 
+	Bitmap();
+	Bitmap(Bitmap *src);
+
 	void load(Common::ReadStream *s);
 	void putDib(int x, int y, int32 *palette);
 	void putDibRB(int32 *palette);
@@ -52,6 +55,9 @@ struct Bitmap {
 	void copier(uint16 *dest, byte *src, int len, int32 *palette, bool cb05_format);
 
 	Bitmap *reverseImage();
+	Bitmap *reverseImageRB();
+	Bitmap *reverseImageCB();
+	Bitmap *reverseImageCB05();
 	Bitmap *flipVertical();
 
 	void drawShaded(int type, int x, int y, byte *palette);


Commit: f9cefd02dfa3a8dd665e23d002aea870a3269e03
    https://github.com/scummvm/scummvm/commit/f9cefd02dfa3a8dd665e23d002aea870a3269e03
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:16-07:00

Commit Message:
FULLPIPE: Implement Picture::isPointInside()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 9b15d69..de2b81d 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -454,7 +454,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 	byte *pal = _paletteData;
 
 	if (!pal) {
-		warning("Picture:draw: using global palette");
+		//warning("Picture:draw: using global palette");
 		pal = g_fullpipe->_globalPalette;
 	}
 
@@ -537,6 +537,14 @@ void Picture::copyMemoryObject2(Picture *src) {
 	}
 }
 
+bool Picture::isPointInside(int x, int y) {
+	if (x >= _x) {
+		if (y >= _y && x < _x + _width && y < _y + _height)
+			return true;
+	}
+	return false;
+}
+
 void Bitmap::putDib(int x, int y, int32 *palette) {
 	debug(0, "Bitmap::putDib(%d, %d)", x, y);
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index eeff026..4c4ed30 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -104,6 +104,7 @@ class Picture : public MemoryObject {
 	void setAlpha(byte alpha) { _alpha = alpha; }
 
 	Common::Point *getDimensions(Common::Point *p);
+	bool isPointInside(int x, int y);
 
 	byte *getPaletteData() { return _paletteData; }
 	void setPaletteData(byte *pal);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 6de3b69..a6e9d3a 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -312,7 +312,7 @@ Movement *StaticANIObject::getMovementByName(char *name) {
 }
 
 void Movement::draw(bool flipFlag, int angle) {
-	warning("STUB: Movement::draw(%d, %d)", flipFlag, angle);
+	debug(3, "Movement::draw(%d, %d)", flipFlag, angle);
 
 	Common::Point point;
 


Commit: 5e21cefa72c25fa8695b3be323367411e1e7bd28
    https://github.com/scummvm/scummvm/commit/5e21cefa72c25fa8695b3be323367411e1e7bd28
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:16-07:00

Commit Message:
FULLPIPE: Implement PictureObject::isPointInside()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index de2b81d..63245a1 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -213,6 +213,22 @@ bool PictureObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	return false;
 }
 
+bool PictureObject::isPointInside(int x, int y) {
+	bool res;
+	int oldx = _picture->_x;
+	int oldy = _picture->_y;
+
+	_picture->_x = _ox;
+	_picture->_y = _oy;
+
+	res = _picture->isPointInside(x, y);
+
+	_picture->_x = oldx;
+	_picture->_y = oldy;
+
+	return res;
+}
+
 GameObject::GameObject() {
 	_okeyCode = 0;
 	_flags = 0;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 4c4ed30..45414eb 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -159,6 +159,7 @@ class PictureObject : public GameObject {
 	void draw();
 
 	bool setPicAniInfo(PicAniInfo *picAniInfo);
+	bool isPointInside(int x, int y);
 };
 
 class Background : public CObject {


Commit: f0795656929e09e74f85c427cbf506e35eefc44f
    https://github.com/scummvm/scummvm/commit/f0795656929e09e74f85c427cbf506e35eefc44f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:16-07:00

Commit Message:
FULLPIPE: Implement global_messageHandler2()

Changed paths:
    engines/fullpipe/scenes.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/sound.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 843b098..09fc158 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -822,10 +822,77 @@ int global_messageHandler1(ExCommand *cmd) {
 	return 0;
 }
 
+void staticANIObjectCallback(int *arg) {
+	*arg--;
+}
+
 int global_messageHandler2(ExCommand *cmd) {
-	warning("STUB: global_messageHandler2()");
+	debug(0, "global_messageHandler2()");
 
-	return 0;
+	if (cmd->_messageKind != 17)
+		return 0;
+
+	int res = 0;
+	StaticANIObject *ani;
+
+	switch (cmd->_messageNum) {
+	case 0x44c8:
+		// Unk3_sub_4477A0(&unk3, _parentId, _field_14 != 0);
+		break;
+
+	case 28:
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (ani)
+			ani->_priority = cmd->_field_14;
+		break;
+
+	case 25:
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (ani) {
+			if (cmd->_field_14) {
+				ani->setFlags40(true);
+				ani->_callback2 = staticANIObjectCallback;
+			} else {
+				ani->setFlags40(false);
+				ani->_callback2 = 0;
+			}
+		}
+		break;
+
+	case 26:
+		ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+		if (ani) {
+			Movement *mov = ani->_movement;
+			if (mov)
+				mov->_currDynamicPhase->_field_68 = 0;
+		}
+		break;
+
+	default:
+#if 0
+		// We never put anything into _defMsgArray
+		while (::iterator it = g_fullpipe->_defMsgArray.begin(); it != g_fullpipe->_defMsgArray.end(); ++it)
+			if (((ExCommand *)*it)->_field_24 == _messageNum) {
+				((ExCommand *)*it)->firef34(v13);
+				res = 1;
+			}
+#endif
+
+		//debug_msg(_messageNum);
+
+		if (!g_fullpipe->_soundEnabled || cmd->_messageNum != 33 || g_fullpipe->_currSoundListCount <= 0)
+			return res;
+
+		for (int snd = 0; snd < g_fullpipe->_currSoundListCount; snd++) {
+			SoundList *s = g_fullpipe->_currSoundList1[snd];
+		    int ms = s->getCount();
+			for (int i = 0; i < ms; i++) {
+				s->getSoundByIndex(i)->setPanAndVolumeByStaticAni();
+			}
+		}
+	}
+
+	return res;
 }
 
 int global_messageHandler3(ExCommand *cmd) {
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 7a6696e..516e4ab 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -107,6 +107,10 @@ void Sound::updateVolume() {
 	warning("STUB Sound::updateVolume()");
 }
 
+void Sound::setPanAndVolumeByStaticAni() {
+	warning("STUB Sound::setPanAndVolumeByStaticAni()");
+}
+
 void FullpipeEngine::setSceneMusicParameters(CGameVar *var) {
 	warning("STUB: FullpipeEngine::setSceneMusicParameters()");
 }
diff --git a/engines/fullpipe/sound.h b/engines/fullpipe/sound.h
index 93e994a..4014cdd 100644
--- a/engines/fullpipe/sound.h
+++ b/engines/fullpipe/sound.h
@@ -38,6 +38,8 @@ class Sound : public MemoryObject {
 	Sound();
 	bool load(MfcArchive &file, NGIArchive *archive);
 	void updateVolume();
+
+	void setPanAndVolumeByStaticAni();
 };
 
 class SoundList : public CObject {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index a6e9d3a..ce782d1 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -201,6 +201,15 @@ void StaticANIObject::clearFlags() {
 	_stepArray.clear();
 }
 
+void StaticANIObject::setFlags40(bool state) {
+	if (state) {
+		_flags |= 0x40;
+	} else {
+		if (_flags & 0x40)
+			_flags ^= 0x40;
+	}
+}
+
 void StaticANIObject::deleteFromGlobalMessageQueue() {
 	while (_messageQueueId) {
 		if (g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId)) {
@@ -1216,8 +1225,8 @@ void Movement::removeFirstPhase() {
 	_updateFlag1 = 0;
 }
 
-bool Movement::gotoNextFrame(int callback1, int callback2) {
-	debug(8, "Movement::gotoNextFrame(%d, %d)", callback1, callback2);
+bool Movement::gotoNextFrame(int callback1, void (*callback2)(int *)) {
+	debug(8, "Movement::gotoNextFrame()");
 
 	if (!callback2) {
 		if (_currMovement) {
@@ -1250,7 +1259,7 @@ bool Movement::gotoNextFrame(int callback1, int callback2) {
 	int oldDynIndex = _currDynamicPhaseIndex;
 
 	if (callback2)
-		; //callback2(&_currDynamicPhaseIndex);
+		callback2(&_currDynamicPhaseIndex);
 	else
 		_currDynamicPhaseIndex++;
 
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 40fc91d..9503018 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -101,8 +101,7 @@ class Statics : public DynamicPhase {
 class StaticANIObject;
 
 class Movement : public GameObject {
-	friend class StaticANIObject;
-
+  public:
 	int _field_24;
 	int _field_28;
 	int _lastFrameSpecialFlag;
@@ -145,7 +144,7 @@ class Movement : public GameObject {
 	void setDynamicPhaseIndex(int index);
 
 	void removeFirstPhase();
-	bool gotoNextFrame(int callback1, int callback2);
+	bool gotoNextFrame(int callback1, void (*callback2)(int *));
 	bool gotoPrevFrame();
 	void gotoFirstFrame();
 	void gotoLastFrame();
@@ -165,7 +164,7 @@ class StaticANIObject : public GameObject {
 	int _field_34;
 	int _initialCounter;
 	int _callback1;
-	int _callback2;
+	void (*_callback2)(int *);
 	CPtrList _movements;
 	CPtrList _staticsList;
 	CStepArray _stepArray;
@@ -194,6 +193,7 @@ class StaticANIObject : public GameObject {
 	Common::Point *getCurrDimensions(Common::Point &p);
 
 	void clearFlags();
+	void setFlags40(bool state);
 	bool isIdle();
 
 	void deleteFromGlobalMessageQueue();


Commit: 6ba453fa2a967f6081712efc5cb32c969b54472e
    https://github.com/scummvm/scummvm/commit/6ba453fa2a967f6081712efc5cb32c969b54472e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:16-07:00

Commit Message:
FULLPIPE: Fix number of bugs found by Coverity

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/init.cpp
    engines/fullpipe/interaction.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/scenes.h
    engines/fullpipe/stateloader.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 2551133..79ef86e 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -300,11 +300,12 @@ BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc, int *delay) {
 	if (vart)
 		_delay = vart->_value.intValue;
 
+	*delay = 0;
 	vart = subvar->getSubVarByName("dwPercent");
-	if (vart)
+	if (vart) {
 		_percent = 0x7FFF * vart->_value.intValue / 1000;
-
-	*delay = vart->_value.intValue;
+		*delay = vart->_value.intValue;
+	}
 
 	vart = subvar->getSubVarByName("dwFlags");
 	if (vart && vart->_varType == 2 && strstr(vart->_value.stringValue, "QDESC_AUTOSTART"))
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 740c2c2..569958c 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -111,6 +111,29 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 
 	_cursorId = 0;
 
+	_keyState = Common::KEYCODE_INVALID;
+	_buttonState = 0;
+
+	_gameLoader = 0;
+	_gameProject = 0;
+
+	_updateFlag = true;
+	_flgCanOpenMap = true;
+
+	_sceneWidth = 1;
+	_sceneHeight = 1;
+
+	for (int i = 0; i < 11; i++)
+		_currSoundList1[i] = 0;
+	
+	for (int i = 0; i < 200; i++)
+		_mapTable[i] = 0;
+
+	_inventoryScene = 0;
+	_inventory = 0;
+
+	_isSaveAllowed = true;
+
 	g_fullpipe = this;
 	g_vars = new Vars;
 }
@@ -241,6 +264,7 @@ void FullpipeEngine::updateEvents() {
 				ex->handle();
 				break;
 			}
+			break;
 		case Common::EVENT_KEYUP:
 			if (!_inputArFlag) {
 				ex = new ExCommand(0, 17, 37, 0, 0, 0, 1, 0, 0, 0);
@@ -326,8 +350,7 @@ void FullpipeEngine::updateScreen() {
 				_modalObject->saveload();
 				CBaseModalObject *tmp = _modalObject->_parentObj;
 
-				if (_modalObject)
-					delete _modalObject;
+				delete _modalObject;
 
 				_modalObject = tmp;
 			}
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 404a70a..69a1acc 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -182,10 +182,6 @@ public:
 	void initCursors();
 	void addCursor(CursorInfo *cursorInfo, Scene *inv, int pictureId, int hotspotX, int hotspotY, int itemPictureOffsX, int itemPictureOffsY);
 
-	CGameVar *_swallowedEgg1;
-	CGameVar *_swallowedEgg2;
-	CGameVar *_swallowedEgg3;
-
 	int32 _mapTable[200];
 
 	Scene *_inventoryScene;
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 63245a1..8201442 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -139,6 +139,9 @@ PictureObject::PictureObject() {
 	_ox = 0;
 	_oy = 0;
 	_picture = 0;
+	_ox2 = 0;
+	_oy2 = 0;
+	_pictureObject2List = 0;
 }
 
 PictureObject::PictureObject(PictureObject *src) : GameObject(src) {
@@ -237,7 +240,6 @@ GameObject::GameObject() {
 	_oy = 0;
 	_priority = 0;
 	_field_20 = 0;
-	_field_6 = 0;
 	_field_8 = 0;
 	_objectName = 0;
 }
@@ -257,6 +259,10 @@ GameObject::GameObject(GameObject *src) {
 	_field_8 = src->_field_8;
 }
 
+GameObject::~GameObject() {
+	free(_objectName);
+}
+
 bool GameObject::load(MfcArchive &file) {
 	debug(5, "GameObject::load()");
 	_okeyCode = 0;
@@ -309,6 +315,9 @@ Picture::Picture() {
 	_alpha = -1;
 	_paletteData = 0;
 	_convertedBitmap = 0;
+	_memoryObject2 = 0;
+	_width = 0;
+	_height = 0;
 }
 
 Picture::~Picture() {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 45414eb..18a4822 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -23,8 +23,6 @@
 #ifndef FULLPIPE_GFX_H
 #define FULLPIPE_GFX_H
 
-class Common::ReadStream;
-
 namespace Fullpipe {
 
 class DynamicPhase;
@@ -121,7 +119,6 @@ class BigPicture : public Picture {
 class GameObject : public CObject {
   public:
 	int16 _okeyCode;
-	int16 _field_6;
 	int _field_8;
 	int16 _flags;
 	int16 _id;
@@ -134,6 +131,7 @@ class GameObject : public CObject {
   public:
 	GameObject();
 	GameObject(GameObject *src);
+	~GameObject();
 
 	virtual bool load(MfcArchive &file);
 	void setOXY(int x, int y);
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index f4a62aa..c334542 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -139,18 +139,6 @@ void FullpipeEngine::setLevelStates() {
 	}
 }
 
-void FullpipeEngine::setSwallowedEggsState() {
-	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
-
-	_swallowedEgg1 = v->getSubVarByName(sO_Egg1);
-	_swallowedEgg2 = v->getSubVarByName(sO_Egg2);
-	_swallowedEgg3 = v->getSubVarByName(sO_Egg3);
-
-	_swallowedEgg1->_value.intValue = 0;
-	_swallowedEgg2->_value.intValue = 0;
-	_swallowedEgg3->_value.intValue = 0;
-}
-
 void FullpipeEngine::addCursor(CursorInfo *cursorInfo, Scene *inv, int pictureId, int hotspotX, int hotspotY, int itemPictureOffsX, int itemPictureOffsY) {
 	cursorInfo->pictureId = pictureId;
 	cursorInfo->picture = inv->getPictureObjectById(pictureId, 0)->_picture;
diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
index 5931f1a..f86e8e9 100644
--- a/engines/fullpipe/interaction.h
+++ b/engines/fullpipe/interaction.h
@@ -39,7 +39,6 @@ class CInteraction : public CObject {
 	int16 _objectId3;
 	int16 _staticsId1;
 	int16 _staticsId2;
-	int16 _field_E;
 	int _objectState1;
 	int _objectState2;
 	int _xOffs;
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index c45c66d..8dc856e 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -44,7 +44,7 @@ bool CInventory::load(MfcArchive &file) {
 		t->flags = file.readUint32LE();
 		t->field_C = 0;
 		t->field_A = -536;
-		_itemsPool.push_back(*t);
+		_itemsPool.push_back(t);
 	}
 
 	return true;
@@ -55,7 +55,7 @@ int CInventory::getInventoryPoolItemIndexById(int itemId) {
 		return -1;
 
 	for (uint i = 0; i < _itemsPool.size(); i++) {
-		if (_itemsPool[i].id == itemId)
+		if (_itemsPool[i]->id == itemId)
 			return i;
 	}
 
@@ -68,7 +68,7 @@ bool CInventory::setItemFlags(int itemId, int flags) {
 	if (idx < 0)
 		return false;
 	else
-		_itemsPool[idx].flags = flags;
+		_itemsPool[idx]->flags = flags;
 
 	return true;
 }
@@ -90,7 +90,7 @@ bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartia
 		InventoryItem *t = new InventoryItem();
 		t->itemId = file.readUint16LE();
 		t->count = file.readUint16LE();
-		_inventoryItems.push_back(*t);
+		_inventoryItems.push_back(t);
 	}
 
 	return true;
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index accfb08..8b7c854 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -41,12 +41,11 @@ struct InventoryPoolItem {
 	int flags;
 };
 
-typedef Common::Array<InventoryPoolItem> InventoryPoolItems;
+typedef Common::Array<InventoryPoolItem *> InventoryPoolItems;
 
 class CInventory : public CObject {
  protected:
 	int16 _sceneId;
-	int16 _field_6;
 	InventoryPoolItems _itemsPool;
 
  public:
@@ -62,7 +61,7 @@ struct InventoryItem {
 	int16 count;
 };
 
-typedef Common::Array<InventoryItem> InventoryItems;
+typedef Common::Array<InventoryItem *> InventoryItems;
 
 class PictureObject;
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index da89611..8c53444 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -507,7 +507,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 				bgNumX++;
 
 				if (bgNumX >= _bigPictureArray1Count) {
-					if (!((PictureObject *)_picObjList[0])->_flags & 0x2)
+					if (!(((PictureObject *)_picObjList[0])->_flags & 0x2))
 						break;
 					bgNumX = 0;
 				}
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 09fc158..70b3dff 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -60,6 +60,13 @@ Vars::Vars() {
 	sceneIntro_skipIntro = true;
 	sceneIntro_playing = false;
 	sceneIntro_needBlackout = false;
+
+	swallowedEgg1 = 0;
+	swallowedEgg2 = 0;
+	swallowedEgg3 = 0;
+
+	scene01_picSc01Osk = 0;
+	scene01_picSc01Osk2 = 0;
 }
 
 bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
@@ -1141,6 +1148,18 @@ int sceneIntro_updateCursor() {
 	return 0;
 }
 
+void FullpipeEngine::setSwallowedEggsState() {
+	CGameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+
+	g_vars->swallowedEgg1 = v->getSubVarByName(sO_Egg1);
+	g_vars->swallowedEgg2 = v->getSubVarByName(sO_Egg2);
+	g_vars->swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+
+	g_vars->swallowedEgg1->_value.intValue = 0;
+	g_vars->swallowedEgg2->_value.intValue = 0;
+	g_vars->swallowedEgg3->_value.intValue = 0;
+}
+
 void sceneIntro_initScene(Scene *sc) {
 	g_fullpipe->_gameLoader->loadScene(SC_INTRO2);
 
@@ -1169,8 +1188,6 @@ void scene01_fixEntrance() {
 }
 
 void scene01_initScene(Scene *sc, int entrance) {
-	g_vars->scene01_unused = 0;
-
 	g_vars->scene01_picSc01Osk = sc->getPictureObjectById(PIC_SC1_OSK, 0);
 	g_vars->scene01_picSc01Osk->_flags &= 0xFFFB;
 
diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h
index da3ac51..ae5f2da 100644
--- a/engines/fullpipe/scenes.h
+++ b/engines/fullpipe/scenes.h
@@ -31,6 +31,10 @@ class Vars {
  public:
 	Vars();
 
+	CGameVar *swallowedEgg1;
+	CGameVar *swallowedEgg2;
+	CGameVar *swallowedEgg3;
+
 	StaticANIObject *sceneIntro_aniin1man;
 	bool sceneIntro_needSleep;
 	bool sceneIntro_needGetup;
@@ -38,7 +42,6 @@ class Vars {
 	bool sceneIntro_playing;
 	bool sceneIntro_needBlackout;
 
-	int scene01_unused;
 	PictureObject *scene01_picSc01Osk;
 	PictureObject *scene01_picSc01Osk2;
 };
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 97306c1..40169dd 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -370,7 +370,7 @@ bool Sc2::load(MfcArchive &file) {
 	debug(4, "_entranceData: %d", _entranceDataCount);
 
 	if (_entranceDataCount > 0) {
-		_entranceData = (EntranceInfo **)malloc(_defPicAniInfosCount * sizeof(EntranceInfo *));
+		_entranceData = (EntranceInfo **)malloc(_entranceDataCount * sizeof(EntranceInfo *));
 
 		for (int i = 0; i < _entranceDataCount; i++) {
 			_entranceData[i] = new EntranceInfo();
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index ce782d1..3308b05 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -393,7 +393,7 @@ Statics *StaticANIObject::addReverseStatics(Statics *st) {
 }
 
 void StaticANIObject::draw() {
-	if (_flags & 4 == 0)
+	if ((_flags & 4) == 0)
 		return;
 
 	Common::Point point;


Commit: 14ca32ee97c46a155dda057c6c9d3a50528b68f3
    https://github.com/scummvm/scummvm/commit/14ca32ee97c46a155dda057c6c9d3a50528b68f3
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:16-07:00

Commit Message:
FULLPIPE: Fix mistype

Changed paths:
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 70b3dff..30cb3a8 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -830,7 +830,7 @@ int global_messageHandler1(ExCommand *cmd) {
 }
 
 void staticANIObjectCallback(int *arg) {
-	*arg--;
+	(*arg)--;
 }
 
 int global_messageHandler2(ExCommand *cmd) {


Commit: 625de9c9a38026a298177c129751fbd48c274b0a
    https://github.com/scummvm/scummvm/commit/625de9c9a38026a298177c129751fbd48c274b0a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:17-07:00

Commit Message:
FULLPIPE: Implement CInventory2::slideIn()

Changed paths:
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h



diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 8dc856e..c7e1fbc 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -110,6 +110,18 @@ void CInventory2::draw() {
 	warning("STUB: CInventory2::draw()");
 }
 
+void CInventory2::slideIn() {
+	_isInventoryOut = false;
+
+	ExCommand *ex = new ExCommand(0, 17, 65, 0, 0, 0, 1, 0, 0, 0);
+
+	ex->_field_2C = 10;
+	ex->_field_14 = _isInventoryOut;
+	ex->_field_20 = !_isInventoryOut;
+	ex->_excFlags |= 3;
+	ex->postMessage();
+}
+
 void CInventory2::slideOut() {
 	_isInventoryOut = true;
 
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 8b7c854..f451b6a 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -105,6 +105,7 @@ class CInventory2 : public CInventory {
 
 	int getSelectedItemId() { return _selectedId < 0 ? 0 : _selectedId; }
 	int getHoveredItem(Common::Point *point);
+	void slideIn();
 	void slideOut();
 
 	int handleLeftClick(ExCommand *cmd);


Commit: e08340e64dfde2bd8abcab2281e80d67dc45128d
    https://github.com/scummvm/scummvm/commit/e08340e64dfde2bd8abcab2281e80d67dc45128d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:17-07:00

Commit Message:
FULLPIPE: Turn noisy stub warnings into debug messages.

Changed paths:
    engines/fullpipe/sound.cpp



diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 516e4ab..d0ff8dd 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -104,11 +104,11 @@ bool Sound::load(MfcArchive &file, NGIArchive *archive) {
 }
 
 void Sound::updateVolume() {
-	warning("STUB Sound::updateVolume()");
+	debug(3, "STUB Sound::updateVolume()");
 }
 
 void Sound::setPanAndVolumeByStaticAni() {
-	warning("STUB Sound::setPanAndVolumeByStaticAni()");
+	debug(3, "STUB Sound::setPanAndVolumeByStaticAni()");
 }
 
 void FullpipeEngine::setSceneMusicParameters(CGameVar *var) {


Commit: e826d359c9c452664a242cda71939dc9a1640488
    https://github.com/scummvm/scummvm/commit/e826d359c9c452664a242cda71939dc9a1640488
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:17-07:00

Commit Message:
FULLPIPE: Implement StaticANIObject::show1()

Changed paths:
    engines/fullpipe/messages.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 22343af..dcb47fa 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -302,7 +302,8 @@ void MessageQueue::update() {
 }
 
 void MessageQueue::messageQueueCallback1(int par) {
-	warning("STUB: MessageQueue::messageQueueCallback1()");
+	// Autosave
+	debug(3, "STUB: MessageQueue::messageQueueCallback1()");
 }
 
 ExCommand *MessageQueue::getExCommandByIndex(uint idx) {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 3308b05..897db56 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -774,8 +774,51 @@ void StaticANIObject::hide() {
 	}
 }
 
-void StaticANIObject::show1(int x, int y, int movementId, int mqId) {
-	warning("STUB: StaticANIObject::show1(%d, %d, %d, %d)", x, y, movementId, mqId);
+void StaticANIObject::show1(int x, int y, int movId, int mqId) {
+	debug(0, "StaticANIObject::show1(%d, %d, %d, %d)", x, y, movId, mqId);
+
+	if (_messageQueueId)
+		return;
+
+	if (movId == -1) {
+		_flags |= 4u;
+		if (x != -1 && y != -1)
+			setOXY(x, y);
+
+		return;
+	}
+
+	Movement *mov = getMovementById(movId);
+	if (!mov)
+		return;
+
+	if (x != -1 && y != -1)
+		setOXY(x, y);
+
+	_statics = mov->_staticsObj1;
+
+	Common::Point point;
+
+	mov->_staticsObj1->getSomeXY(point);
+	_statics->_x = x - point.x;
+	_statics->_y = y - point.y;
+
+	_statics->_countdown = _statics->_initialCountdown;
+
+	_flags |= 4;
+	_ox = x;
+	_oy = y;
+	_movement = 0;
+
+	if (mov->_currMovement)
+		_flags |= 8;
+	else if (_flags & 8)
+		_flags ^= 8;
+
+	if (_flags & 1)
+		_flags ^= 1;
+
+	_messageQueueId = mqId;
 }
 
 void StaticANIObject::show2(int x, int y, int movementId, int mqId) {


Commit: ebaf5f6b4d36e9009014ffdd9286b153f611def1
    https://github.com/scummvm/scummvm/commit/ebaf5f6b4d36e9009014ffdd9286b153f611def1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:17-07:00

Commit Message:
FULLPIPE: Bugfix StaticANIObject::stopAnim_maybe()

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 897db56..c409738 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -671,12 +671,12 @@ void StaticANIObject::stopAnim_maybe() {
 				_ox -= _movement->_mx;
 				_oy -= _movement->_my;
 
+				_statics->getSomeXY(point);
 				if (_movement->_currMovement) {
 					_oy += point.y;
 					_ox -= point.x;
 					_ox += _statics->getDimensions(&point)->x;
 				} else {
-					_statics->getSomeXY(point);
 					_ox += point.x;
 					_oy += point.y;
 				}
@@ -693,7 +693,7 @@ void StaticANIObject::stopAnim_maybe() {
 		oid = _movement->_id;
 		_movement = 0;
 
-		ExCommand *ex = new ExCommand(oid, 17, 24, 0, 0, 0, 1, 0, 0, 0);
+		ExCommand *ex = new ExCommand(_id, 17, 24, 0, 0, 0, 1, 0, 0, 0);
 		ex->_keyCode = _okeyCode;
 		ex->_excFlags = 2;
 		ex->postMessage();
@@ -708,7 +708,7 @@ void StaticANIObject::stopAnim_maybe() {
 		if (_messageQueueId == oldmqid) {
 			_messageQueueId = 0;
 			if (_field_34 == 1)
-				updateGlobalMessageQueue(mqid, oldmqid);
+				updateGlobalMessageQueue(mqid, _id);
 		}
 	}
 }


Commit: 739c24cdd10a329a729a185ca25bed6acc05dfef
    https://github.com/scummvm/scummvm/commit/739c24cdd10a329a729a185ca25bed6acc05dfef
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:17-07:00

Commit Message:
FULLPIPE: Implement CInventory2::addItem()

Changed paths:
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h



diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index c7e1fbc..36ee712 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -96,8 +96,9 @@ bool CInventory2::loadPartial(MfcArchive &file) { // CInventory2_SerializePartia
 	return true;
 }
 
-void CInventory2::addItem(int itemId, int value) {
-	warning("STUB: CInventory2::addItem(%d, %d)", itemId, value);
+void CInventory2::addItem(int itemId, int count) {
+	if (getInventoryPoolItemIndexById(itemId) >= 0)
+		_inventoryItems.push_back(new InventoryItem(itemId, count));
 }
 
 void CInventory2::rebuildItemRects() {
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index f451b6a..0d16909 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -59,6 +59,9 @@ class CInventory : public CObject {
 struct InventoryItem {
 	int16 itemId;
 	int16 count;
+
+	InventoryItem() { itemId = count = 0; }
+	InventoryItem(int id, int cnt) : itemId(id), count(cnt) {}
 };
 
 typedef Common::Array<InventoryItem *> InventoryItems;
@@ -95,7 +98,7 @@ class CInventory2 : public CInventory {
  public:
 	CInventory2();
 	bool loadPartial(MfcArchive &file);
-	void addItem(int itemId, int value);
+	void addItem(int itemId, int count);
 	void rebuildItemRects();
 
 	Scene *getScene() { return _scene; }


Commit: 54f4a8146128109edfaaacdbabbb4d945b4a9f62
    https://github.com/scummvm/scummvm/commit/54f4a8146128109edfaaacdbabbb4d945b4a9f62
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:18-07:00

Commit Message:
FULLPIPE: Fix formatting

Changed paths:
    engines/fullpipe/messages.cpp



diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index dcb47fa..c107933 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -295,7 +295,7 @@ void MessageQueue::update() {
 
 	if (_exCommands.size()) {
 		sendNextCommand();
-	} else if (_counter == 0 ) {
+	} else if (_counter == 0) {
 		_isFinished = 1;
 		finish();
 	}


Commit: cba0fb54f19fabbd71d4d20034dde2660fc3b673
    https://github.com/scummvm/scummvm/commit/cba0fb54f19fabbd71d4d20034dde2660fc3b673
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:18-07:00

Commit Message:
FULLPIPE: Started CInventory2::rebuildItemRects() implementation

Changed paths:
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h



diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 36ee712..35b516b 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -104,7 +104,120 @@ void CInventory2::addItem(int itemId, int count) {
 void CInventory2::rebuildItemRects() {
 	_scene = g_fullpipe->accessScene(_sceneId);
 
-	warning("STUB: CInventory2::rebuildItemRects()");
+	if (!_scene)
+		return;
+
+	_picture = _scene->getBigPicture(0, 0);
+	_picture->setAlpha(50);
+
+	int itemX = 9;
+	int itemY = 0;
+
+	for (uint i = 0; i < _scene->_picObjList.size(); i++) {
+		PictureObject *pic = (PictureObject *)_scene->_picObjList[i];
+
+		for (uint j = 0; j < _itemsPool.size(); j++) {
+			if (_itemsPool[j]->pictureObjectNormalId == pic->_id) {
+				if (pic->okeyCode)
+					_scene->deletePictureObject(pic);
+				else
+					pic->_flags &= 0xFFFB;
+			}
+		}
+	}
+
+	for (uint i = 0; i < _inventoryItems.size(); i++) {
+		Common::Point point;
+
+		idx = getInventoryPoolItemIndexById(_inventoryItems[i]->itemId);
+
+		InventoryIcon *icn = new InventoryIcon();
+
+		icn->inventoryItemId = _itemsPool[idx]->id;
+		
+		PictureObject *pic = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectNormalId, 0);
+
+		icn->pictureObjectNormal = pic;
+
+		icn->icons = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectMouseInsideId, 0);
+
+		icn->numIcons = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectId3, 0); // Weird
+
+		pic->getDimensions(point);
+
+		if (_itemsPool[idx]->flags & 0x10000) {
+			icn->x1 = 730;
+			icn->y1 = itemY;
+			icn->x2 = point.x + 730;
+			icn->y2 = point.y + itemY + 10;
+		} else {
+			icn->x1 = itemX;
+			icn->y1 = itemY;
+			icn->x2 = itemX + point.x;
+			itemX = icn->x2 + 1;
+			icn->y2 = point.y + itemY + 10;
+		}
+		v22 = _inventoryIcons->numIcons;
+		_inventoryIcons->numIcons++;
+		v38 = v23;
+		v24 = v23 + 1;
+		if (v24) {
+			v25 = _inventoryIcons->icons;
+			if (v25) {
+				v27 = _inventoryIcons->x1;
+				if (v24 > v27) {
+					v28 = _inventoryIcons->y1;
+					if (!v28) {
+						v28 = v22 / 8;
+						if (v22 / 8 >= 4) {
+							if (v28 > 1024)
+								v28 = 1024;
+						} else {
+							v28 = 4;
+						}
+					}
+					v29 = v27 + v28;
+					if (v24 >= v29) {
+						v34 = v24;
+						v29 = v24;
+					} else {
+						v34 = v29;
+					}
+					v30 = operator new(40 * v29);
+					memcpy(v30, _inventoryIcons->icons, 40 * _inventoryIcons->numIcons);
+					memset((char *)v30 + 40 * _inventoryIcons->numIcons, 0, 4 * ((unsigned int)(40 * (v24 - _inventoryIcons->numIcons)) >> 2));
+					CObjectFree(_inventoryIcons->icons);
+					_inventoryIcons->icons = (InventoryIcon **)v30;
+					_inventoryIcons->numIcons = v24;
+					_inventoryIcons->x1 = v34;
+				} else if (v22 >= v24) {
+					_inventoryIcons->numIcons = v24;
+				} else {
+					memset(&v25[10 * v22], 0, 40 * (v24 - v22));
+					_inventoryIcons->numIcons = v24;
+				}
+			} else {
+				v26 = (InventoryIcon **)operator new(40 * v24);
+				_inventoryIcons->icons = v26;
+				memset(v26, 0, 4 * ((unsigned int)(40 * v24) >> 2));
+				_inventoryIcons->x1 = v24;
+				_inventoryIcons->numIcons = v24;
+			}
+		} else {
+			if (_inventoryIcons->icons) {
+				CObjectFree(_inventoryIcons->icons);
+				_inventoryIcons->icons = 0;
+			}
+			_inventoryIcons->x1 = 0;
+			_inventoryIcons->numIcons = 0;
+		}
+		v31 = icn->x1;
+		memcpy(&_inventoryIcons->icons[10 * v38], &inventoryIcon, 0x28u);
+		if (itemX >= 2 * (v31 - icn->x2) + 800) {
+			itemX = 9;
+			itemY = icn->y2 + 1;
+		}
+	}
 }
 
 void CInventory2::draw() {
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 0d16909..6193c4a 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -29,7 +29,6 @@ class Scene;
 class BigPicture;
 
 struct InventoryPoolItem {
- public:
 	int16 id;
 	int16 pictureObjectNormalId;
 	int16 pictureObjectId1;
@@ -68,21 +67,21 @@ typedef Common::Array<InventoryItem *> InventoryItems;
 
 class PictureObject;
 
-class InventoryIcon {
-	PictureObject *_pictureObjectNormal;
-	InventoryIcon **_icons;
-	int _numIcons;
-	int _x1;
-	int _y1;
-	int _x2;
-	int _y2;
-	int16 _inventoryItemId;
-	int16 _field_1E;
-	int _isSelected;
-	int _isMouseInside;
+struct InventoryIcon {
+	PictureObject *pictureObjectNormal;
+	InventoryIcon **icons;
+	int numIcons;
+	int x1;
+	int y1;
+	int x2;
+	int y2;
+	int16 inventoryItemId;
+	int16 field_1E;
+	int isSelected;
+	int isMouseInside;
 };
 
-typedef Common::Array<InventoryIcon> InventoryIcons;
+typedef Common::Array<InventoryIcon *> InventoryIcons;
 
 class CInventory2 : public CInventory {
 	InventoryItems _inventoryItems;


Commit: 2a59b516890375bf542f049c1dc302dc2c19c260
    https://github.com/scummvm/scummvm/commit/2a59b516890375bf542f049c1dc302dc2c19c260
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:18-07:00

Commit Message:
FULLPIPE: Implemented CInventory2::rebuildItemRects()

Changed paths:
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h



diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 18a4822..f7fd292 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -177,6 +177,8 @@ class Background : public CObject {
 	Background();
 	virtual bool load(MfcArchive &file);
 	void addPictureObject(PictureObject *pct);
+
+	BigPicture *getBigPicture(int x, int y) { return _bigPictureArray[x][y]; }
 };
 
 struct ShadowsItem {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 35b516b..c6eebab 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -39,7 +39,7 @@ bool CInventory::load(MfcArchive &file) {
 		t->id = file.readUint16LE();
 		t->pictureObjectNormalId = file.readUint16LE();
 		t->pictureObjectId1 = file.readUint16LE();
-		t->pictureObjectMouseInsideId = file.readUint16LE();
+		t->pictureObjectMouseHover = file.readUint16LE();
 		t->pictureObjectId3 = file.readUint16LE();
 		t->flags = file.readUint32LE();
 		t->field_C = 0;
@@ -118,7 +118,7 @@ void CInventory2::rebuildItemRects() {
 
 		for (uint j = 0; j < _itemsPool.size(); j++) {
 			if (_itemsPool[j]->pictureObjectNormalId == pic->_id) {
-				if (pic->okeyCode)
+				if (pic->_okeyCode)
 					_scene->deletePictureObject(pic);
 				else
 					pic->_flags &= 0xFFFB;
@@ -129,21 +129,17 @@ void CInventory2::rebuildItemRects() {
 	for (uint i = 0; i < _inventoryItems.size(); i++) {
 		Common::Point point;
 
-		idx = getInventoryPoolItemIndexById(_inventoryItems[i]->itemId);
+		int idx = getInventoryPoolItemIndexById(_inventoryItems[i]->itemId);
 
 		InventoryIcon *icn = new InventoryIcon();
 
 		icn->inventoryItemId = _itemsPool[idx]->id;
 		
-		PictureObject *pic = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectNormalId, 0);
+		icn->pictureObjectNormal = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectNormalId, 0);
+		icn->pictureObjectHover = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectMouseHover, 0);
+		icn->pictureObjectId3 = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectId3, 0);
 
-		icn->pictureObjectNormal = pic;
-
-		icn->icons = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectMouseInsideId, 0);
-
-		icn->numIcons = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectId3, 0); // Weird
-
-		pic->getDimensions(point);
+		icn->pictureObjectNormal->getDimensions(&point);
 
 		if (_itemsPool[idx]->flags & 0x10000) {
 			icn->x1 = 730;
@@ -157,63 +153,10 @@ void CInventory2::rebuildItemRects() {
 			itemX = icn->x2 + 1;
 			icn->y2 = point.y + itemY + 10;
 		}
-		v22 = _inventoryIcons->numIcons;
-		_inventoryIcons->numIcons++;
-		v38 = v23;
-		v24 = v23 + 1;
-		if (v24) {
-			v25 = _inventoryIcons->icons;
-			if (v25) {
-				v27 = _inventoryIcons->x1;
-				if (v24 > v27) {
-					v28 = _inventoryIcons->y1;
-					if (!v28) {
-						v28 = v22 / 8;
-						if (v22 / 8 >= 4) {
-							if (v28 > 1024)
-								v28 = 1024;
-						} else {
-							v28 = 4;
-						}
-					}
-					v29 = v27 + v28;
-					if (v24 >= v29) {
-						v34 = v24;
-						v29 = v24;
-					} else {
-						v34 = v29;
-					}
-					v30 = operator new(40 * v29);
-					memcpy(v30, _inventoryIcons->icons, 40 * _inventoryIcons->numIcons);
-					memset((char *)v30 + 40 * _inventoryIcons->numIcons, 0, 4 * ((unsigned int)(40 * (v24 - _inventoryIcons->numIcons)) >> 2));
-					CObjectFree(_inventoryIcons->icons);
-					_inventoryIcons->icons = (InventoryIcon **)v30;
-					_inventoryIcons->numIcons = v24;
-					_inventoryIcons->x1 = v34;
-				} else if (v22 >= v24) {
-					_inventoryIcons->numIcons = v24;
-				} else {
-					memset(&v25[10 * v22], 0, 40 * (v24 - v22));
-					_inventoryIcons->numIcons = v24;
-				}
-			} else {
-				v26 = (InventoryIcon **)operator new(40 * v24);
-				_inventoryIcons->icons = v26;
-				memset(v26, 0, 4 * ((unsigned int)(40 * v24) >> 2));
-				_inventoryIcons->x1 = v24;
-				_inventoryIcons->numIcons = v24;
-			}
-		} else {
-			if (_inventoryIcons->icons) {
-				CObjectFree(_inventoryIcons->icons);
-				_inventoryIcons->icons = 0;
-			}
-			_inventoryIcons->x1 = 0;
-			_inventoryIcons->numIcons = 0;
-		}
-		v31 = icn->x1;
-		memcpy(&_inventoryIcons->icons[10 * v38], &inventoryIcon, 0x28u);
-		if (itemX >= 2 * (v31 - icn->x2) + 800) {
+
+		_inventoryIcons.push_back(icn);
+
+		if (itemX >= 2 * (icn->x1 - icn->x2) + 800) {
 			itemX = 9;
 			itemY = icn->y2 + 1;
 		}
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 6193c4a..9244f95 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -32,7 +32,7 @@ struct InventoryPoolItem {
 	int16 id;
 	int16 pictureObjectNormalId;
 	int16 pictureObjectId1;
-	int16 pictureObjectMouseInsideId;
+	int16 pictureObjectMouseHover;
 	int16 pictureObjectId3;
 	int16 field_A;
 	int field_C;
@@ -69,8 +69,8 @@ class PictureObject;
 
 struct InventoryIcon {
 	PictureObject *pictureObjectNormal;
-	InventoryIcon **icons;
-	int numIcons;
+	PictureObject *pictureObjectHover;
+	PictureObject *pictureObjectId3;
 	int x1;
 	int y1;
 	int x2;
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 8c53444..8061455 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -334,6 +334,17 @@ PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 	return 0;
 }
 
+void Scene::deletePictureObject(PictureObject *obj) {
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		if (((PictureObject *)_picObjList[i]) == obj) {
+			_picObjList.remove_at(i);
+			delete obj;
+
+			return;
+		}
+	}
+}
+
 MessageQueue *Scene::getMessageQueueById(int messageId) {
 	for (uint i = 0; i < _messageQueueList.size(); i++)
 		if (((MessageQueue *)_messageQueueList[i])->_dataId == messageId)
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 1292bed..9c57bcb 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -67,6 +67,7 @@ class Scene : public Background {
 
 	void setPictureObjectsFlag4();
 	PictureObject *getPictureObjectById(int objId, int flags);
+	void deletePictureObject(PictureObject *obj);
 	void preloadMovements(CGameVar *var);
 
 	void initObjectCursors(const char *name);


Commit: 87488185a82f123387176cb9f72e2c714d088c73
    https://github.com/scummvm/scummvm/commit/87488185a82f123387176cb9f72e2c714d088c73
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:18-07:00

Commit Message:
FULLPIPE: Implement CInventory2::draw()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 8201442..6c22c2a 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -196,6 +196,21 @@ void PictureObject::draw() {
 		_picture->draw(_ox, _oy, 0, 0);
 }
 
+void PictureObject::drawAt(int x, int y) {
+	if (x == -1)
+		x = _ox;
+	if (y == -1)
+		y = _oy;
+
+	_picture->_x = x;
+	_picture->_y = y;
+
+	if (_flags & 1)
+		_picture->draw(x, y, 2, 0);
+	else
+		_picture->draw(x, y, 0, 0);
+}
+
 bool PictureObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	if (!(picAniInfo->type & 2) || (picAniInfo->type & 1)) {
 		error("Picture::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index f7fd292..eec3284 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -155,6 +155,7 @@ class PictureObject : public GameObject {
 	bool load(MfcArchive &file, bool bigPicture);
 	Common::Point *getDimensions(Common::Point *p);
 	void draw();
+	void drawAt(int x, int y);
 
 	bool setPicAniInfo(PicAniInfo *picAniInfo);
 	bool isPointInside(int x, int y);
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index c6eebab..002c9b9 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -37,10 +37,10 @@ bool CInventory::load(MfcArchive &file) {
 	for (int i = 0; i < numInvs; i++) {
 		InventoryPoolItem *t = new InventoryPoolItem();
 		t->id = file.readUint16LE();
-		t->pictureObjectNormalId = file.readUint16LE();
+		t->pictureObjectNormal = file.readUint16LE();
 		t->pictureObjectId1 = file.readUint16LE();
-		t->pictureObjectMouseHover = file.readUint16LE();
-		t->pictureObjectId3 = file.readUint16LE();
+		t->pictureObjectHover = file.readUint16LE();
+		t->pictureObjectSelected = file.readUint16LE();
 		t->flags = file.readUint32LE();
 		t->field_C = 0;
 		t->field_A = -536;
@@ -117,7 +117,7 @@ void CInventory2::rebuildItemRects() {
 		PictureObject *pic = (PictureObject *)_scene->_picObjList[i];
 
 		for (uint j = 0; j < _itemsPool.size(); j++) {
-			if (_itemsPool[j]->pictureObjectNormalId == pic->_id) {
+			if (_itemsPool[j]->pictureObjectNormal == pic->_id) {
 				if (pic->_okeyCode)
 					_scene->deletePictureObject(pic);
 				else
@@ -135,9 +135,9 @@ void CInventory2::rebuildItemRects() {
 
 		icn->inventoryItemId = _itemsPool[idx]->id;
 		
-		icn->pictureObjectNormal = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectNormalId, 0);
-		icn->pictureObjectHover = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectMouseHover, 0);
-		icn->pictureObjectId3 = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectId3, 0);
+		icn->pictureObjectNormal = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectNormal, 0);
+		icn->pictureObjectHover = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectHover, 0);
+		icn->pictureObjectSelected = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectSelected, 0);
 
 		icn->pictureObjectNormal->getDimensions(&point);
 
@@ -164,7 +164,76 @@ void CInventory2::rebuildItemRects() {
 }
 
 void CInventory2::draw() {
-	warning("STUB: CInventory2::draw()");
+	if (!_scene)
+		return;
+
+	int oldScLeft = g_fullpipe->_sceneRect.left;
+	int oldScTop = g_fullpipe->_sceneRect.top;
+
+	g_fullpipe->_sceneRect.top = -_topOffset;
+	g_fullpipe->_sceneRect.left = 0;
+
+	_picture->draw(-1, -1, 0, 0);
+
+	for (uint i = 0; i < _inventoryIcons.size(); i++) {
+		InventoryIcon *icn = _inventoryIcons[i];
+
+		if (icn->isSelected) {
+			icn->pictureObjectSelected->drawAt(icn->x1, icn->y1 + 10);
+		} else {
+			if (icn->isMouseHover)
+				icn->pictureObjectHover->drawAt(icn->x1, icn->y1 + 10);
+			else
+				icn->pictureObjectNormal->drawAt(icn->x1, icn->y1 + 10);
+		}
+    }
+
+	if (!_isInventoryOut)
+		goto LABEL_30;
+
+	int v10, v11, v12;
+
+	if (_topOffset != -10) {
+		if (_topOffset < -10) {
+			v10 = -10;
+			goto LABEL_13;
+		}
+		if (_topOffset + 10 >= 20) {
+			v11 = -20;
+cont:
+			_topOffset += v11;
+			goto reset;
+		}
+		v12 = -10;
+		goto LABEL_25;
+	}
+	if (!_isInventoryOut) {
+LABEL_30:
+		if (_topOffset != -65) {
+			if (_topOffset < -65) {
+				v10 = -65;
+LABEL_13:
+				v11 = v10 - _topOffset;
+				if (v11 >= 20)
+					v11 = 20;
+				goto cont;
+			}
+			if (_topOffset + 65 >= 20) {
+				v11 = -20;
+				goto cont;
+			}
+			v12 = -65;
+LABEL_25:
+			v11 = v12 - _topOffset;
+			goto cont;
+		}
+	}
+
+reset:
+
+	g_fullpipe->_sceneRect.top = oldScTop;
+	g_fullpipe->_sceneRect.left = oldScLeft;
+
 }
 
 void CInventory2::slideIn() {
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 9244f95..902ecff 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -30,10 +30,10 @@ class BigPicture;
 
 struct InventoryPoolItem {
 	int16 id;
-	int16 pictureObjectNormalId;
+	int16 pictureObjectNormal;
 	int16 pictureObjectId1;
-	int16 pictureObjectMouseHover;
-	int16 pictureObjectId3;
+	int16 pictureObjectHover;
+	int16 pictureObjectSelected;
 	int16 field_A;
 	int field_C;
 	int obj;
@@ -70,15 +70,14 @@ class PictureObject;
 struct InventoryIcon {
 	PictureObject *pictureObjectNormal;
 	PictureObject *pictureObjectHover;
-	PictureObject *pictureObjectId3;
+	PictureObject *pictureObjectSelected;
 	int x1;
 	int y1;
 	int x2;
 	int y2;
 	int16 inventoryItemId;
-	int16 field_1E;
 	int isSelected;
-	int isMouseInside;
+	int isMouseHover;
 };
 
 typedef Common::Array<InventoryIcon *> InventoryIcons;


Commit: 1261cd421d176d6caa7230c5cf726b08e04ff25f
    https://github.com/scummvm/scummvm/commit/1261cd421d176d6caa7230c5cf726b08e04ff25f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:18-07:00

Commit Message:
FULLPIPE: Implement CInventory2::getHoveredItem()

Changed paths:
    engines/fullpipe/inventory.cpp



diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 002c9b9..9384cb2 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -78,7 +78,7 @@ CInventory2::CInventory2() {
 	_field_48 = -1;
 	_scene = 0;
 	_picture = 0;
-	_isInventoryOut = 0;
+	_isInventoryOut = false;
 	_isLocked = 0;
 	_topOffset = -65;
 }
@@ -273,7 +273,35 @@ int CInventory2::unselectItem(bool flag) {
 }
 
 int CInventory2::getHoveredItem(Common::Point *point) {
-	warning("STUB: CInventory2::getHoveredItem()");
+	int selId = getSelectedItemId();
+
+	if (point->y <= 20 && !_isInventoryOut && !_isLocked )
+		slideOut();
+
+	if (!selId && point->y >= 55) {
+		if (!_isInventoryOut)
+			return 0;
+
+		if (!_isLocked)
+			slideIn();
+	}
+
+	if (!_isInventoryOut)
+		return 0;
+
+	for (uint i = 0; i < _inventoryIcons.size(); i++) {
+		InventoryIcon *icn = _inventoryIcons[i];
+		if (selId ||
+			point->x < icn->x1 ||
+			point->x > icn->x2 ||
+			point->y < _topOffset + icn->y1 ||
+			point->y > _topOffset + icn->y2) {
+			icn->isMouseHover = 0;
+		} else {
+			icn->isMouseHover = 1;
+			return icn->inventoryItemId;
+		}
+    }
 
 	return 0;
 }


Commit: 3e4670e6be0b0ea77044355cb1d2c25704564cd1
    https://github.com/scummvm/scummvm/commit/3e4670e6be0b0ea77044355cb1d2c25704564cd1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:19-07:00

Commit Message:
FULLPIPE: Implement Scene::initObjectCursors()

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/input.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 569958c..6f4feee 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -132,6 +132,8 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_inventoryScene = 0;
 	_inventory = 0;
 
+	_minCursorId = 0;
+
 	_isSaveAllowed = true;
 
 	g_fullpipe = this;
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 69a1acc..5d4deed 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -53,6 +53,7 @@ struct CursorInfo;
 class EntranceInfo;
 class ExCommand;
 class GameProject;
+class GameObject;
 class GlobalMessageQueueList;
 class MessageHandler;
 struct MovTable;
@@ -198,7 +199,11 @@ public:
 	int (*_updateCursorCallback)();
 
 	int _cursorId;
+	int _minCursorId;
+	Common::Array<int> _objectIdCursors;
+
 	void setCursor(int id);
+	void updateCursorsCommon();
 
 	int getObjectState(const char *objname);
 	void setObjectState(const char *name, int state);
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index b649c01..64fd0d5 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -117,4 +117,8 @@ void FullpipeEngine::defHandleKeyDown(int key) {
 	warning("STUB: FullpipeEngine::defHandleKeyDown(%d)", key);
 }
 
+void FullpipeEngine::updateCursorsCommon() {
+	
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 8061455..c413779 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -26,6 +26,7 @@
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
 #include "fullpipe/messages.h"
+#include "fullpipe/gameloader.h"
 
 #include "fullpipe/constants.h"
 
@@ -326,7 +327,7 @@ void Scene::setPictureObjectsFlag4() {
 }
 
 PictureObject *Scene::getPictureObjectById(int objId, int flags) {
-	for (uint i = 1; i < _picObjList.size(); i++) {
+	for (uint i = 0; i < _picObjList.size(); i++) {
 		if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_okeyCode == flags)
 			return (PictureObject *)_picObjList[i];
 	}
@@ -334,6 +335,15 @@ PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 	return 0;
 }
 
+PictureObject *Scene::getPictureObjectByName(const char *objName, int flags) {
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		if (!strcmp(((PictureObject *)_picObjList[i])->_objectName, objName) && ((PictureObject *)_picObjList[i])->_okeyCode == flags || flags == -1)
+			return (PictureObject *)_picObjList[i];
+	}
+
+	return 0;
+}
+
 void Scene::deletePictureObject(PictureObject *obj) {
 	for (uint i = 0; i < _picObjList.size(); i++) {
 		if (((PictureObject *)_picObjList[i]) == obj) {
@@ -386,8 +396,41 @@ void Scene::preloadMovements(CGameVar *var) {
     }
 }
 
-void Scene::initObjectCursors(const char *name) {
-	warning("STUB: Scene::initObjectCursors(%s)", name);
+void Scene::initObjectCursors(const char *varname) {
+	CGameVar *cursorsVar = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(varname)->getSubVarByName("CURSORS");
+
+	if (!cursorsVar || !cursorsVar->_subVars)
+		return;
+
+	int maxId = 0;
+	int minId = 0xffff;
+
+	for (CGameVar *sub = cursorsVar->_subVars; sub; sub = sub->_nextVarObj) {
+		GameObject *obj = getPictureObjectByName(sub->_varName, -1);
+
+		if (obj || (obj = getStaticANIObject1ByName(sub->_varName, -1)) != 0) {
+          if (obj->_id < minId)
+            minId = obj->_id;
+          if (obj->_id > maxId)
+            maxId = obj->_id;
+        }
+    }
+
+	g_fullpipe->_minCursorId = minId;
+
+	g_fullpipe->_objectIdCursors.resize(maxId - minId + 1);
+
+	for (CGameVar *sub = cursorsVar->_subVars; sub; sub = sub->_nextVarObj) {
+		GameObject *obj = getPictureObjectByName(sub->_varName, -1);
+
+		if (!obj)
+			obj = getStaticANIObject1ByName(sub->_varName, -1);
+
+		PictureObject *pic = getGameLoaderInventory()->getScene()->getPictureObjectByName(sub->_value.stringValue, -1);
+
+		if (obj && pic)
+			g_fullpipe->_objectIdCursors[obj->_id - minId] = pic->_id;
+	}
 }
 
 bool Scene::compareObjPriority(const void *p1, const void *p2) {
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 9c57bcb..d1a5b39 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -67,6 +67,7 @@ class Scene : public Background {
 
 	void setPictureObjectsFlag4();
 	PictureObject *getPictureObjectById(int objId, int flags);
+	PictureObject *getPictureObjectByName(const char *name, int keyCode);
 	void deletePictureObject(PictureObject *obj);
 	void preloadMovements(CGameVar *var);
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 30cb3a8..2916a40 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -1137,7 +1137,7 @@ int global_messageHandler4(ExCommand *cmd) {
 }
 
 int defaultUpdateCursor() {
-	warning("STUB: defaultUpdateCursor");
+	g_fullpipe->updateCursorsCommon();
 
 	return g_fullpipe->_cursorId;
 }


Commit: ee18a545549f7ab58d3da2ca67fb6824b498b6d6
    https://github.com/scummvm/scummvm/commit/ee18a545549f7ab58d3da2ca67fb6824b498b6d6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:19-07:00

Commit Message:
FULLPIPE: Implemented FullpipeEngine::updateCursorsCommon()

Changed paths:
  A engines/fullpipe/lift.cpp
    engines/fullpipe/constants.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/fullpipe/input.cpp
    engines/fullpipe/module.mk
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index 43f90ed..5048bf9 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -28,6 +28,7 @@ namespace Fullpipe {
 #define ANI_BOOT_1 4231
 #define ANI_IN1MAN 5110
 #define ANI_INV_MAP 5321
+#define ANI_LIFTBUTTON 2751
 #define ANI_MAN 322
 #define MSG_DISABLESAVES 5201
 #define MSG_ENABLESAVES 5202
@@ -49,6 +50,12 @@ namespace Fullpipe {
 #define MV_MAN_TOLADDER2 2841
 #define MV_MAN_TURN_LU 486
 #define PIC_CMN_EVAL 3468
+#define PIC_CSR_DEFAULT 4891
+#define PIC_CSR_DEFAULT_INV 4892
+#define PIC_CSR_ITN 4893
+#define PIC_CSR_ITN_INV 4894
+#define PIC_CSR_GOFAR_L 4895
+#define PIC_CSR_GOFAR_R 4896
 #define PIC_CSR_ARCADE1 4901
 #define PIC_CSR_ARCADE2 4902
 #define PIC_CSR_ARCADE2_D 4903
@@ -137,7 +144,26 @@ namespace Fullpipe {
 #define SC_TITLES 5166
 #define SND_CMN_031 3516
 #define SND_CMN_070 5199
+#define ST_LBN_0N 2832
+#define ST_LBN_0P 2833
+#define ST_LBN_1N 2753
+#define ST_LBN_1P 2754
 #define ST_LBN_2N 2756
+#define ST_LBN_2P 2757
+#define ST_LBN_3N 2759
+#define ST_LBN_3P 2760
+#define ST_LBN_4N 2762
+#define ST_LBN_4P 2763
+#define ST_LBN_5N 2765
+#define ST_LBN_5P 2766
+#define ST_LBN_6N 2768
+#define ST_LBN_6P 2769
+#define ST_LBN_7N 2771
+#define ST_LBN_7P 2772
+#define ST_LBN_8N 2774
+#define ST_LBN_8P 2775
+#define ST_LBN_9N 2777
+#define ST_LBN_9P 2778
 #define ST_MAN_EMPTY 476
 #define ST_MAN_RIGHT 325
 #define TrubaDown 697
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 6f4feee..49abbab 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -132,7 +132,10 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_inventoryScene = 0;
 	_inventory = 0;
 
-	_minCursorId = 0;
+	_minCursorId = 0xffff;
+	_maxCursorId = 0;
+	_objectAtCursor = 0;
+	_objectIdAtCursor = 0;
 
 	_isSaveAllowed = true;
 
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 5d4deed..5b0ea44 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -200,7 +200,10 @@ public:
 
 	int _cursorId;
 	int _minCursorId;
+	int _maxCursorId;
 	Common::Array<int> _objectIdCursors;
+	GameObject *_objectAtCursor;
+	int _objectIdAtCursor;
 
 	void setCursor(int id);
 	void updateCursorsCommon();
@@ -219,6 +222,8 @@ public:
 	void openHelp();
 	void openMainMenu();
 
+	int lift_getButtonIdP(int objid);
+
 public:
 
 	bool _isSaveAllowed;
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 64fd0d5..7a21077 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -25,6 +25,10 @@
 #include "fullpipe/objects.h"
 #include "fullpipe/input.h"
 #include "fullpipe/gfx.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/constants.h"
 
 namespace Fullpipe {
 
@@ -118,7 +122,66 @@ void FullpipeEngine::defHandleKeyDown(int key) {
 }
 
 void FullpipeEngine::updateCursorsCommon() {
-	
+	GameObject *ani = _currentScene->getStaticANIObjectAtPos(_mouseVirtX, _mouseVirtY);
+
+	GameObject *pic = _currentScene->getPictureObjectAtPos(_mouseVirtX, _mouseVirtY);
+	if (!ani || pic && pic->_priority < ani->_priority )
+		ani = pic;
+
+	int selId = getGameLoaderInventory()->getSelectedItemId();
+
+	_objectAtCursor = ani;
+
+	if (ani) {
+		_objectIdAtCursor = ani->_id;
+
+		if (!selId && ani->_id >= _minCursorId && ani->_id <= _maxCursorId) {
+			selId = _objectIdCursors[ani->_id - _minCursorId];
+			if (selId) {
+				_cursorId = selId;
+				return;
+			}
+		}
+		if (_aniMan->canInteractAny(ani, selId)) {
+			_cursorId = selId > 0 ? PIC_CSR_ITN_INV : PIC_CSR_ITN;
+			return;
+		}
+		if (selId) {
+			_cursorId = PIC_CSR_DEFAULT_INV;
+			return;
+		}
+		if (_objectIdAtCursor == ANI_LIFTBUTTON && lift_getButtonIdP(((StaticANIObject *)ani)->_statics->_staticsId)) {
+			_cursorId = PIC_CSR_LIFT;
+			return;
+		}
+		if (_sceneRect.right - _mouseVirtX < 47 && _sceneRect.right < _sceneWidth - 1) {
+			_cursorId = PIC_CSR_GOFAR_R;
+			return;
+		}
+		if (_mouseVirtX - _sceneRect.left < 47 && _sceneRect.left > 0) {
+			_cursorId = PIC_CSR_GOFAR_L;
+			return;
+		}
+		_cursorId = PIC_CSR_DEFAULT;
+		return;
+	} else {
+		_objectIdAtCursor = 0;
+
+		if (selId) {
+			_cursorId = PIC_CSR_DEFAULT_INV;
+			return;
+		}
+		if (_sceneRect.right - _mouseVirtX < 47 && _sceneRect.right < _sceneWidth - 1) {
+			_cursorId = PIC_CSR_GOFAR_R;
+			return;
+		}
+		if (_mouseVirtX - _sceneRect.left < 47 && _sceneRect.left > 0 ) {
+			_cursorId = PIC_CSR_GOFAR_L;
+			return;
+		}
+	}
+
+	_cursorId = PIC_CSR_DEFAULT_INV;
 }
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/lift.cpp b/engines/fullpipe/lift.cpp
new file mode 100644
index 0000000..25dd261
--- /dev/null
+++ b/engines/fullpipe/lift.cpp
@@ -0,0 +1,67 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/constants.h"
+
+namespace Fullpipe {
+
+int FullpipeEngine::lift_getButtonIdP(int objid) {
+	switch (objid) {
+	case ST_LBN_0N:
+		return ST_LBN_0P;
+		break;
+	case ST_LBN_1N:
+		return ST_LBN_1P;
+		break;
+	case ST_LBN_2N:
+		return ST_LBN_2P;
+		break;
+	case ST_LBN_3N:
+		return ST_LBN_3P;
+		break;
+	case ST_LBN_4N:
+		return ST_LBN_4P;
+		break;
+	case ST_LBN_5N:
+		return ST_LBN_5P;
+		break;
+	case ST_LBN_6N:
+		return ST_LBN_6P;
+		break;
+	case ST_LBN_7N:
+		return ST_LBN_7P;
+		break;
+	case ST_LBN_8N:
+		return ST_LBN_8P;
+		break;
+	case ST_LBN_9N:
+		return ST_LBN_9P;
+		break;
+	default:
+		return 0;
+		break;
+	}
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 81cb0f9..41ed3e3 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -10,6 +10,7 @@ MODULE_OBJS = \
 	input.o \
 	interaction.o \
 	inventory.o \
+	lift.o \
 	messages.o \
 	modal.o \
 	motion.o \
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index c413779..0a7d035 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -417,6 +417,7 @@ void Scene::initObjectCursors(const char *varname) {
     }
 
 	g_fullpipe->_minCursorId = minId;
+	g_fullpipe->_maxCursorId = maxId;
 
 	g_fullpipe->_objectIdCursors.resize(maxId - minId + 1);
 
@@ -475,6 +476,18 @@ void Scene::updateScrolling2() {
 	warning("STUB Scene::updateScrolling2()");
 }
 
+StaticANIObject *Scene::getStaticANIObjectAtPos(int x, int y) {
+	warning("STUB: Scene::getStaticANIObjectAtPos(%d, %d)", x, y);
+
+	return 0;
+}
+
+PictureObject *Scene::getPictureObjectAtPos(int x, int y) {
+	warning("STUB: Scene::getPictureObjectAtPos(%d, %d)", x, y);
+
+	return 0;
+}
+
 void Scene::update(int counterdiff) {
 	debug(0, "Scene::update(%d)", counterdiff);
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index d1a5b39..0f0854b 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -71,6 +71,9 @@ class Scene : public Background {
 	void deletePictureObject(PictureObject *obj);
 	void preloadMovements(CGameVar *var);
 
+	StaticANIObject *getStaticANIObjectAtPos(int x, int y);
+	PictureObject *getPictureObjectAtPos(int x, int y);
+
 	void initObjectCursors(const char *name);
 
   private:
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index c409738..9706a45 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -312,6 +312,12 @@ int StaticANIObject::getMovementIdById(int itemId) {
 	return 0;
 }
 
+bool StaticANIObject::canInteractAny(GameObject *obj2, int a3) {
+	warning("STUB: StaticANIObject::canInteractAny()");
+	return false;
+}
+
+
 Movement *StaticANIObject::getMovementByName(char *name) {
 	for (uint i = 0; i < _movements.size(); i++)
 		if (!strcmp(((Movement *)_movements[i])->_objectName, name))
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 9503018..e4e2c1f 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -230,6 +230,8 @@ class StaticANIObject : public GameObject {
 
 	MessageQueue *changeStatics1(int msgNum);
 	void changeStatics2(int objId);
+
+	bool canInteractAny(GameObject *obj2, int a3);
 };
 
 struct MovTable {


Commit: 3d3ebc6ae7430ae4147bdc9e07115d134dd9d312
    https://github.com/scummvm/scummvm/commit/3d3ebc6ae7430ae4147bdc9e07115d134dd9d312
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:19-07:00

Commit Message:
FULLPIPE: Implement CInputController::setCursor()

Changed paths:
    engines/fullpipe/input.cpp
    engines/fullpipe/input.h



diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 7a21077..efc42b3 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -86,8 +86,17 @@ void CInputController::drawCursor(int x, int y) {
 	warning("STUB: CInputController::drawCursor(%d, %d)", x, y);
 }
 
-void CInputController::setCursor(int id) {
-	warning("STUB: CInputController::setCursor(%d)", id);
+void CInputController::setCursor(int cursorId) {
+	if (_cursorIndex == -1 || _cursorsArray[_cursorIndex]->pictureId != cursorId) {
+		_cursorIndex = -1;
+
+		for (uint i = 0; i < _cursorsArray.size(); i++) {
+			if (_cursorsArray[i]->pictureId == cursorId) {
+				_cursorIndex = i;
+				break;
+			}
+		}
+	}
 }
 
 CursorInfo::CursorInfo() {
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
index e527770..6a7ad11 100644
--- a/engines/fullpipe/input.h
+++ b/engines/fullpipe/input.h
@@ -56,7 +56,7 @@ class CInputController {
 	int _cursorIndex;
 	CursorsArray _cursorsArray;
 	Common::Rect _cursorBounds;
-	int _cursorItemPicture;
+	Picture *_cursorItemPicture;
 
  public:
 	CInputController();


Commit: 44081e6b1e625f5c52acf26a0336935cf99449d9
    https://github.com/scummvm/scummvm/commit/44081e6b1e625f5c52acf26a0336935cf99449d9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:19-07:00

Commit Message:
FULLPIPE: Implement InputController::drawCursor()

Changed paths:
    engines/fullpipe/input.cpp



diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index efc42b3..767a0d5 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -83,7 +83,18 @@ void CInputController::setCursorMode(bool enabled) {
 }
 
 void CInputController::drawCursor(int x, int y) {
-	warning("STUB: CInputController::drawCursor(%d, %d)", x, y);
+	if (_cursorIndex == -1)
+		return;
+
+	_cursorBounds.left = g_fullpipe->_sceneRect.left + x - _cursorsArray[_cursorIndex]->hotspotX;
+	_cursorBounds.top = g_fullpipe->_sceneRect.top + y - _cursorsArray[_cursorIndex]->hotspotY;
+	_cursorBounds.right = _cursorBounds.left + _cursorsArray[_cursorIndex]->width;
+	_cursorBounds.bottom = _cursorBounds.top + _cursorsArray[_cursorIndex]->height;
+
+	_cursorsArray[_cursorIndex]->picture->draw(_cursorBounds.left, _cursorBounds.top, 0, 0);
+
+	if (_cursorItemPicture)
+		_cursorItemPicture->draw(_cursorsArray[_cursorIndex]->itemPictureOffsX, _cursorsArray[_cursorIndex]->itemPictureOffsY, 0, 0);
 }
 
 void CInputController::setCursor(int cursorId) {


Commit: 86aaaecc97a2bca872b8f4e7719d932419eca952
    https://github.com/scummvm/scummvm/commit/86aaaecc97a2bca872b8f4e7719d932419eca952
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:19-07:00

Commit Message:
FULLPIPE: Unstubbed couple small functions

Changed paths:
    engines/fullpipe/input.cpp
    engines/fullpipe/input.h
    engines/fullpipe/sound.cpp



diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 767a0d5..03a77ef 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -51,6 +51,12 @@ CInputController::CInputController() {
 	_cursorItemPicture = 0;
 }
 
+CInputController::~CInputController() {
+	removeMessageHandler(126, -1);
+
+	g_fullpipe->_inputController = 0;
+}
+
 void CInputController::setInputDisabled(bool state) {
 	_flag = state;
 	g_fullpipe->_inputDisabled = state;
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
index 6a7ad11..4b32e51 100644
--- a/engines/fullpipe/input.h
+++ b/engines/fullpipe/input.h
@@ -60,12 +60,16 @@ class CInputController {
 
  public:
 	CInputController();
+	~CInputController();
+
 	void setInputDisabled(bool state);
 	void addCursor(CursorInfo *cursor);
 	void setCursorMode(bool mode);
 
 	void drawCursor(int x, int y);
 	void setCursor(int id);
+
+	void setCursorItemPicture(Picture *pic) { _cursorItemPicture = pic; }
 };
 
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index d0ff8dd..442db7a 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -116,7 +116,7 @@ void FullpipeEngine::setSceneMusicParameters(CGameVar *var) {
 }
 
 void FullpipeEngine::startSceneTrack() {
-	warning("STUB: FullpipeEngine::startSceneTrack()");
+	debug(3, "STUB: FullpipeEngine::startSceneTrack()");
 }
 
 void FullpipeEngine::stopAllSounds() {


Commit: 624309b0db913ab15ce58992603ab76c9f53598d
    https://github.com/scummvm/scummvm/commit/624309b0db913ab15ce58992603ab76c9f53598d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:20-07:00

Commit Message:
FULLPIPE: Started implementation of global_messageHandler3()

Changed paths:
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 2916a40..ecbb809 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -903,9 +903,184 @@ int global_messageHandler2(ExCommand *cmd) {
 }
 
 int global_messageHandler3(ExCommand *cmd) {
-	warning("STUB: global_messageHandler3()");
+	result = 0;
 
-	return 0;
+	if (cmd->_messageKind == 17) {
+		switch (cmd->_messageNum) {
+		case 29:
+		case 30:
+		case 31:
+		case 32:
+		case 36:
+			if (g_fullpipe->_inputDisabled)
+				cmd->_messageKind = 0;
+			break;
+		default:
+			break;
+		}
+	}
+
+	switch (cmd->_messageKind) {
+	case 17:
+		switch (cmd->_messageNum) {
+		case 61:
+			return gameLoaderPreloadScene(cmd->_parentId, cmd->_keyCode);
+		case 62:
+			return gameLoaderGotoScene(cmd->_parentId, cmd->_keyCode);
+		case 64:
+			if (g_fullpipe->_currentScene && g_fullpipe->_msgObjectId2
+					&& (!(cmd->_keyCode & 4) || g_fullpipe->_msgObjectId2 != cmd->_field_14 || g_fullpipe->_msgId != cmd->_field_20)) {
+				ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_msgObjectId2, g_fullpipe->_msgId);
+				if (ani) {
+					ani->_flags &= 0xFF7F;
+					ani->_flags &= 0xFEFF;
+					ani->deleteFromGlobalMessageQueue();
+				}
+			}
+			g_fullpipe->_msgX = 0;
+			g_fullpipe->_msgY = 0;
+			g_fullpipe->_msgObjectId2 = 0;
+			g_fullpipe->_msgId = 0;
+			if (cmd->_keyCode & 1 || cmd->_keyCode & 2) {
+				g_fullpipe->_msgX = cmd->_x;
+				g_fullpipe->_msgY = cmd->_y;
+			}
+			if (cmd->_keyCode & 4) {
+				g_fullpipe->_msgObjectId2 = cmd->_field_14;
+				g_fullpipe->_msgId = cmd->_field_20;
+			}
+			return result;
+		case 29:
+			if (g_fullpipe->_gameLoader->interactionController->_flag24 && g_fullpipe->_currentScene) {
+				ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+				ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
+				if (ani) {
+					if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
+						cmd->_messageKind = 0;
+						return result;
+					}
+					if (ani2->canInteractAny(ani, cmd->_keyCode)) {
+						ani2->handleObjectInteraction(ani, cmd->_keyCode);
+						return 1;
+					}
+				} else {
+					ani2 = g_fullpipe->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+					ani = g_fullpipe->_currentScene->getPictureObjectById(ani2, 0);
+					if (ani) {
+						if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
+							cmd->_messageKind = 0;
+							return result;
+						}
+						if (ani2->canInteractAny(ani, cmd->_keyCode)) {
+							if (!ani2 || ani->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))
+								ani2->handleObjectInteraction(ani, cmd->_keyCode);
+							return 1;
+						}
+					}
+				}
+			}
+			if (*((_DWORD *)getCurrSceneSc2MotionController() + 2) && cmd->cmd.msg.keyCode <= 0) {
+				if (g_fullpipe->_msgX != cmd->cmd.msg.sceneClickX || g_fullpipe->_msgY != cmd->cmd.msg.sceneClickY) {
+					v13 = getGameLoaderFieldFA();
+					ani_ = Scene_getStaticANIObject1ById(g_fullpipe->_currentScene, (Objects)(unsigned __int16)v13, -1);
+					v15 = ani_;
+					if (!ani_
+						|| (LOBYTE(v16) = StaticANIObject_isIdle(ani_), v16)
+						&& (v17 = v15->GameObject.flags, !(v17 & 0x80))
+						&& !(v17 & 0x100)) {
+						v18 = cmd->cmd.msg.sceneClickY;
+						v19 = cmd->cmd.msg.sceneClickX;
+						v20 = getGameLoaderFieldFA();
+						result = startWalkTo(v20, -1, v19, v18, 0);
+						if (result) {
+							v21 = (ExCommand *)operator new(sizeof(ExCommand));
+							if (v21) {
+								v22 = getGameLoaderFieldFA();
+								v23 = ExCommand_ctor(v21, v22, 17, 64, 0, 0, 0, 1, 0, 0, 0);
+							} else {
+								v23 = 0;
+							}
+							v24 = v23->excFlags;
+							v23->msg.keyCode = 1;
+							v23->excFlags = v24 | 3;
+							v23->msg.x = cmd->cmd.msg.sceneClickX;
+							v23->msg.y = cmd->cmd.msg.sceneClickY;
+							ExCommand_postMessage(v23);
+						}
+					}
+				} elae {
+					cmd->cmd.msg.messageKind = 0;
+				}
+			}
+			return result;
+		default:
+			return result;
+		}
+	case 58:
+		input_setCursor(cmd->_keyCode);
+		return result;
+	case 59:
+		setInputDisabled(1);
+		return result;
+	case 60:
+		setInputDisabled(0);
+		return result;
+	case 56:
+		if (cmd->_field_2C) {
+			ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+			if (ani) {
+				getGameLoaderInventory()->addItem2(ani);
+				result = 1;
+			}
+		} else {
+			result = 1;
+			getGameLoaderInventory()->addItem(cmd->_parentId, 1);
+		}
+		getGameLoaderInventory()->rebuildItemRects();
+		return result;
+	case 57:
+		if (cmd->_field_2C) {
+			if (!cmd->_field_20) {
+				getGameLoaderInventory()->removeItem2(g_fullpipe->_currentScene, cmd->_parentId, cmd->_x, cmd->_y, cmd->_field_14);
+				getGameLoaderInventory()->rebuildItemRects();
+				return 1;
+			}
+			ani = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
+			if (ani) {
+				getGameLoaderInventory()->removeItem2(g_fullpipe->_currentScene, cmd->_parentId, ani->_ox + cmd->_x, ani->_oy + cmd->_y, ani->_priority + cmd->_field_14);
+				getGameLoaderInventory()->rebuildItemRects();
+				return 1;
+			}
+		} else {
+			getGameLoaderInventory()->removeItem(cmd->_parentId, 1);
+		}
+		getGameLoaderInventory()->rebuildItemRects();
+		return 1;
+	case 55:
+		if (g_fullpipe->_currentScene) {
+			if (cmd->_field_14)
+				ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
+			else
+				ani = g_fullpipe->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
+			g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode)->handleObjectInteraction(ani, cmd->_field_20);
+			result = 1;
+		}
+		return result;
+	case 51:
+		return startWalkTo(cmd->_parentId, cmd->_keyCode, cmd->_x, cmd->_y, cmd->_field_20);
+	case 52:
+		return sub_457F60(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
+	case 53:
+		return sub_457FA0(cmd->_parentId, cmd->_keyCode);
+	case 63:
+		if (CObject::IsKindOf(cmd, &RTCObjstateCommand)) {
+			result = 1;
+			setObjectState((char *)&cmd->objCommandName->m_pchData, cmd->value);
+		}
+		return result;
+	default:
+		return result;
+	}
 }
 
 int global_messageHandler4(ExCommand *cmd) {


Commit: d8bc218ce81ec7d24015bcb9a118e33aa244f225
    https://github.com/scummvm/scummvm/commit/d8bc218ce81ec7d24015bcb9a118e33aa244f225
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:20-07:00

Commit Message:
FULLPIPE: More work on global_messageHandler3()

Changed paths:
    engines/fullpipe/interaction.h
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
index f86e8e9..a0bd54b 100644
--- a/engines/fullpipe/interaction.h
+++ b/engines/fullpipe/interaction.h
@@ -55,6 +55,7 @@ class CInteraction : public CObject {
 };
 
 class CInteractionController : public CObject {
+ public:
 	CObList _interactions;
 	int16 _field_20;
 	bool _flag24;
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 9384cb2..adfbf66 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -25,6 +25,7 @@
 #include "fullpipe/utils.h"
 #include "fullpipe/inventory.h"
 #include "fullpipe/gameloader.h"
+#include "fullpipe/statics.h"
 
 namespace Fullpipe {
 
@@ -101,6 +102,41 @@ void CInventory2::addItem(int itemId, int count) {
 		_inventoryItems.push_back(new InventoryItem(itemId, count));
 }
 
+void CInventory2::addItem2(StaticANIObject *obj) {
+	if (getInventoryPoolItemIndexById(obj->_id) >= 0 && getInventoryPoolItemFieldCById(obj->_id) != 2) {
+		addItem(obj->_id, 1);
+		obj->hide();
+	}
+}
+
+void CInventory2::removeItem(int itemId, int count) {
+	warning("STUB: CInventory2::removeItem(%d, %d)", itemId, count);
+}
+
+void CInventory2::removeItem2(Scene *sceneObj, int itemId, int x, int y, int priority) {
+	warning("STUB: void removeItem2(sc, %d, %d, %d, %d)", itemId, x, y, priority);
+}
+
+int CInventory2::getCountItemsWithId(int itemId) {
+	int res = 0;
+
+	for (uint i = 0; i < _inventoryItems.size(); i++) {
+		if (_inventoryItems[i]->itemId == itemId)
+			res += _inventoryItems[i]->count;
+	}
+
+	return res;
+}
+
+int CInventory2::getInventoryPoolItemFieldCById(int itemId) {
+	for (uint i = 0; i < _itemsPool.size(); i++) {
+		if (_itemsPool[i]->id == itemId)
+			return _itemsPool[i]->field_C;
+	}
+
+	return 0;
+}
+
 void CInventory2::rebuildItemRects() {
 	_scene = g_fullpipe->accessScene(_sceneId);
 
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 902ecff..8d72ffc 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -97,6 +97,13 @@ class CInventory2 : public CInventory {
 	CInventory2();
 	bool loadPartial(MfcArchive &file);
 	void addItem(int itemId, int count);
+	void addItem2(StaticANIObject *obj);
+	void removeItem(int itemId, int count);
+	void removeItem2(Scene *sceneObj, int itemId, int x, int y, int priority);
+
+	int getInventoryPoolItemFieldCById(int itemId);
+	int getCountItemsWithId(int itemId);
+
 	void rebuildItemRects();
 
 	Scene *getScene() { return _scene; }
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index ecbb809..7f9e6bf 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -903,7 +903,7 @@ int global_messageHandler2(ExCommand *cmd) {
 }
 
 int global_messageHandler3(ExCommand *cmd) {
-	result = 0;
+	int result = 0;
 
 	if (cmd->_messageKind == 17) {
 		switch (cmd->_messageNum) {
@@ -920,6 +920,8 @@ int global_messageHandler3(ExCommand *cmd) {
 		}
 	}
 
+	StaticANIObject *ani, *ani2;
+
 	switch (cmd->_messageKind) {
 	case 17:
 		switch (cmd->_messageNum) {
@@ -941,7 +943,7 @@ int global_messageHandler3(ExCommand *cmd) {
 			g_fullpipe->_msgY = 0;
 			g_fullpipe->_msgObjectId2 = 0;
 			g_fullpipe->_msgId = 0;
-			if (cmd->_keyCode & 1 || cmd->_keyCode & 2) {
+			if ((cmd->_keyCode & 1) || (cmd->_keyCode & 2)) {
 				g_fullpipe->_msgX = cmd->_x;
 				g_fullpipe->_msgY = cmd->_y;
 			}
@@ -951,7 +953,7 @@ int global_messageHandler3(ExCommand *cmd) {
 			}
 			return result;
 		case 29:
-			if (g_fullpipe->_gameLoader->interactionController->_flag24 && g_fullpipe->_currentScene) {
+			if (g_fullpipe->_gameLoader->_interactionController->_flag24 && g_fullpipe->_currentScene) {
 				ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
 				ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
 				if (ani) {
@@ -964,8 +966,8 @@ int global_messageHandler3(ExCommand *cmd) {
 						return 1;
 					}
 				} else {
-					ani2 = g_fullpipe->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
-					ani = g_fullpipe->_currentScene->getPictureObjectById(ani2, 0);
+					int id = g_fullpipe->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+					ani = g_fullpipe->_currentScene->getPictureObjectById(id, 0);
 					if (ani) {
 						if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
 							cmd->_messageKind = 0;
@@ -979,37 +981,23 @@ int global_messageHandler3(ExCommand *cmd) {
 					}
 				}
 			}
-			if (*((_DWORD *)getCurrSceneSc2MotionController() + 2) && cmd->cmd.msg.keyCode <= 0) {
-				if (g_fullpipe->_msgX != cmd->cmd.msg.sceneClickX || g_fullpipe->_msgY != cmd->cmd.msg.sceneClickY) {
-					v13 = getGameLoaderFieldFA();
-					ani_ = Scene_getStaticANIObject1ById(g_fullpipe->_currentScene, (Objects)(unsigned __int16)v13, -1);
-					v15 = ani_;
-					if (!ani_
-						|| (LOBYTE(v16) = StaticANIObject_isIdle(ani_), v16)
-						&& (v17 = v15->GameObject.flags, !(v17 & 0x80))
-						&& !(v17 & 0x100)) {
-						v18 = cmd->cmd.msg.sceneClickY;
-						v19 = cmd->cmd.msg.sceneClickX;
-						v20 = getGameLoaderFieldFA();
-						result = startWalkTo(v20, -1, v19, v18, 0);
+			if (getCurrSceneSc2MotionController()->_isEnabled && cmd->_keyCode <= 0) {
+				if (g_fullpipe->_msgX != cmd->_sceneClickX || g_fullpipe->_msgY != cmd->_sceneClickY) {
+					ani = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
+					if (!ani || ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100)) {
+						result = startWalkTo(getGameLoaderFieldFA(), -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
 						if (result) {
-							v21 = (ExCommand *)operator new(sizeof(ExCommand));
-							if (v21) {
-								v22 = getGameLoaderFieldFA();
-								v23 = ExCommand_ctor(v21, v22, 17, 64, 0, 0, 0, 1, 0, 0, 0);
-							} else {
-								v23 = 0;
-							}
-							v24 = v23->excFlags;
-							v23->msg.keyCode = 1;
-							v23->excFlags = v24 | 3;
-							v23->msg.x = cmd->cmd.msg.sceneClickX;
-							v23->msg.y = cmd->cmd.msg.sceneClickY;
-							ExCommand_postMessage(v23);
+							ExCommand *ex = new ExCommand(getGameLoaderFieldFA(), 17, 64, 0, 0, 0, 1, 0, 0, 0);
+
+							ex->_keyCode = 1;
+							ex->_excFlags |= 3;
+							ex->_x = cmd->_sceneClickX;
+							ex->_y = cmd->_sceneClickY;
+							ex->postMessage();
 						}
 					}
-				} elae {
-					cmd->cmd.msg.messageKind = 0;
+				} else {
+					cmd->_messageKind = 0;
 				}
 			}
 			return result;
@@ -1017,7 +1005,7 @@ int global_messageHandler3(ExCommand *cmd) {
 			return result;
 		}
 	case 58:
-		input_setCursor(cmd->_keyCode);
+		g_fullpipe->setCursor(cmd->_keyCode);
 		return result;
 	case 59:
 		setInputDisabled(1);
@@ -1075,7 +1063,7 @@ int global_messageHandler3(ExCommand *cmd) {
 	case 63:
 		if (CObject::IsKindOf(cmd, &RTCObjstateCommand)) {
 			result = 1;
-			setObjectState((char *)&cmd->objCommandName->m_pchData, cmd->value);
+			g_fullpipe->setObjectState(cmd->_objCommandName, cmd->_value);
 		}
 		return result;
 	default:


Commit: 028772d153b79b38e5dfa2d90ba5f01fb287b47e
    https://github.com/scummvm/scummvm/commit/028772d153b79b38e5dfa2d90ba5f01fb287b47e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:20-07:00

Commit Message:
FULLPIPE: Finish global_messageHandler3()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/scene.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 6c22c2a..d700fff 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -321,6 +321,11 @@ void GameObject::renumPictures(CPtrList *lst) {
 	free(buf);
 }
 
+bool GameObject::canInteractAny(GameObject *obj2, int a3) {
+	warning("STUB: GameObject::canInteractAny()");
+	return false;
+}
+
 Picture::Picture() {
 	_x = 0;
 	_y = 0;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index eec3284..59edaf4 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -139,6 +139,8 @@ class GameObject : public CObject {
 	void setFlags(int16 flags) { _flags = flags; }
 	void clearFlags() { _flags = 0; }
 	const char *getName() { return _objectName; }
+
+	bool canInteractAny(GameObject *obj2, int a3);
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index c107933..cc7cd2e 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -177,6 +177,8 @@ CObjstateCommand::CObjstateCommand() {
 bool CObjstateCommand::load(MfcArchive &file) {
 	debug(5, "CObjStateCommand::load()");
 
+	_objtype = kObjTypeObjstateCommand;
+
 	_cmd.load(file);
 
 	_value = file.readUint32LE();
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index d202235..3611ae0 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -83,6 +83,7 @@ class ExCommand2 : public ExCommand {
 };
 
 class CObjstateCommand : public CObject {
+ public:
 	ExCommand _cmd;
 	char *_objCommandName;
 	int _value;
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 3259653..6d07747 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -248,4 +248,20 @@ void CReactPolygonal::createRegion() {
 	}
 }
 
+int startWalkTo(int objId, int objKey, int x, int y, int a5) {
+	warning("STUB: startWalkTo(%d, %d, %d, %d, %d)", objId, objKey, x, y, a5);
+
+	return 0;
+}
+
+int doSomeAnimation(int objId, int objKey, int a3) {
+	warning("STUB: doSomeAnimation(%d, %d, %d)", objId, objKey, a3);
+
+	return 0;
+}
+
+int doSomeAnimation2(int objId, int objKey) {
+	return doSomeAnimation(objId, objKey, 0);
+}
+
 } // End of namespace Fullpipe
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index 28e4297..318a6b3 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -25,7 +25,12 @@
 
 namespace Fullpipe {
 
+int startWalkTo(int objId, int objKey, int x, int y, int a5);
+int doSomeAnimation(int objId, int objKey, int a3);
+int doSomeAnimation2(int objId, int objKey);
+
 class CMotionController : public CObject {
+ public:
 	int _field_4;
 	bool _isEnabled;
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 0a7d035..95d2876 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -488,6 +488,12 @@ PictureObject *Scene::getPictureObjectAtPos(int x, int y) {
 	return 0;
 }
 
+int Scene::getPictureObjectIdAtPos(int x, int y) {
+	warning("STUB: Scene::getPictureObjectIdAtPos(%d, %d)", x, y);
+
+	return 0;
+}
+
 void Scene::update(int counterdiff) {
 	debug(0, "Scene::update(%d)", counterdiff);
 
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index 0f0854b..c1c8d47 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -73,6 +73,7 @@ class Scene : public Background {
 
 	StaticANIObject *getStaticANIObjectAtPos(int x, int y);
 	PictureObject *getPictureObjectAtPos(int x, int y);
+	int getPictureObjectIdAtPos(int x, int y);
 
 	void initObjectCursors(const char *name);
 
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 7f9e6bf..6a8b78a 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -926,9 +926,9 @@ int global_messageHandler3(ExCommand *cmd) {
 	case 17:
 		switch (cmd->_messageNum) {
 		case 61:
-			return gameLoaderPreloadScene(cmd->_parentId, cmd->_keyCode);
+			return g_fullpipe->_gameLoader->preloadScene(cmd->_parentId, cmd->_keyCode);
 		case 62:
-			return gameLoaderGotoScene(cmd->_parentId, cmd->_keyCode);
+			return g_fullpipe->_gameLoader->gotoScene(cmd->_parentId, cmd->_keyCode);
 		case 64:
 			if (g_fullpipe->_currentScene && g_fullpipe->_msgObjectId2
 					&& (!(cmd->_keyCode & 4) || g_fullpipe->_msgObjectId2 != cmd->_field_14 || g_fullpipe->_msgId != cmd->_field_20)) {
@@ -955,39 +955,39 @@ int global_messageHandler3(ExCommand *cmd) {
 		case 29:
 			if (g_fullpipe->_gameLoader->_interactionController->_flag24 && g_fullpipe->_currentScene) {
 				ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
-				ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
+				ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
 				if (ani) {
 					if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
 						cmd->_messageKind = 0;
 						return result;
 					}
 					if (ani2->canInteractAny(ani, cmd->_keyCode)) {
-						ani2->handleObjectInteraction(ani, cmd->_keyCode);
+						handleObjectInteraction(ani2, ani, cmd->_keyCode);
 						return 1;
 					}
 				} else {
 					int id = g_fullpipe->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
-					ani = g_fullpipe->_currentScene->getPictureObjectById(id, 0);
-					if (ani) {
-						if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
+					PictureObject *pic = g_fullpipe->_currentScene->getPictureObjectById(id, 0);
+					if (pic) {
+						if (g_fullpipe->_msgObjectId2 == pic->_id && g_fullpipe->_msgId == pic->_okeyCode) {
 							cmd->_messageKind = 0;
 							return result;
 						}
-						if (ani2->canInteractAny(ani, cmd->_keyCode)) {
-							if (!ani2 || ani->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))
-								ani2->handleObjectInteraction(ani, cmd->_keyCode);
+						if (ani2->canInteractAny(pic, cmd->_keyCode)) {
+							if (!ani2 || ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))
+								handleObjectInteraction(ani2, pic, cmd->_keyCode);
 							return 1;
 						}
 					}
 				}
 			}
-			if (getCurrSceneSc2MotionController()->_isEnabled && cmd->_keyCode <= 0) {
+			if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_isEnabled && cmd->_keyCode <= 0) {
 				if (g_fullpipe->_msgX != cmd->_sceneClickX || g_fullpipe->_msgY != cmd->_sceneClickY) {
-					ani = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
+					ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
 					if (!ani || ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100)) {
-						result = startWalkTo(getGameLoaderFieldFA(), -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
+						result = startWalkTo(g_fullpipe->_gameLoader->_field_FA, -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
 						if (result) {
-							ExCommand *ex = new ExCommand(getGameLoaderFieldFA(), 17, 64, 0, 0, 0, 1, 0, 0, 0);
+							ExCommand *ex = new ExCommand(g_fullpipe->_gameLoader->_field_FA, 17, 64, 0, 0, 0, 1, 0, 0, 0);
 
 							ex->_keyCode = 1;
 							ex->_excFlags |= 3;
@@ -1033,7 +1033,7 @@ int global_messageHandler3(ExCommand *cmd) {
 				getGameLoaderInventory()->rebuildItemRects();
 				return 1;
 			}
-			ani = g_fullpipe->_currentScene->getStaticANIObject1ById(getGameLoaderFieldFA(), -1);
+			ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
 			if (ani) {
 				getGameLoaderInventory()->removeItem2(g_fullpipe->_currentScene, cmd->_parentId, ani->_ox + cmd->_x, ani->_oy + cmd->_y, ani->_priority + cmd->_field_14);
 				getGameLoaderInventory()->rebuildItemRects();
@@ -1046,24 +1046,26 @@ int global_messageHandler3(ExCommand *cmd) {
 		return 1;
 	case 55:
 		if (g_fullpipe->_currentScene) {
+			GameObject *obj;
 			if (cmd->_field_14)
-				ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
+				obj = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
 			else
-				ani = g_fullpipe->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
-			g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode)->handleObjectInteraction(ani, cmd->_field_20);
+				obj = g_fullpipe->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
+			handleObjectInteraction(g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode), obj, cmd->_field_20);
 			result = 1;
 		}
 		return result;
 	case 51:
 		return startWalkTo(cmd->_parentId, cmd->_keyCode, cmd->_x, cmd->_y, cmd->_field_20);
 	case 52:
-		return sub_457F60(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
+		return doSomeAnimation(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
 	case 53:
-		return sub_457FA0(cmd->_parentId, cmd->_keyCode);
+		return doSomeAnimation2(cmd->_parentId, cmd->_keyCode);
 	case 63:
-		if (CObject::IsKindOf(cmd, &RTCObjstateCommand)) {
+		if (cmd->_objtype == kObjTypeObjstateCommand) {
+			CObjstateCommand *c = (CObjstateCommand *)cmd;
 			result = 1;
-			g_fullpipe->setObjectState(cmd->_objCommandName, cmd->_value);
+			g_fullpipe->setObjectState(c->_objCommandName, c->_value);
 		}
 		return result;
 	default:
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 9706a45..53111e8 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -26,6 +26,7 @@
 #include "fullpipe/ngiarchive.h"
 #include "fullpipe/statics.h"
 #include "fullpipe/messages.h"
+#include "fullpipe/interaction.h"
 
 #include "fullpipe/constants.h"
 #include "fullpipe/objectnames.h"
@@ -312,12 +313,6 @@ int StaticANIObject::getMovementIdById(int itemId) {
 	return 0;
 }
 
-bool StaticANIObject::canInteractAny(GameObject *obj2, int a3) {
-	warning("STUB: StaticANIObject::canInteractAny()");
-	return false;
-}
-
-
 Movement *StaticANIObject::getMovementByName(char *name) {
 	for (uint i = 0; i < _movements.size(); i++)
 		if (!strcmp(((Movement *)_movements[i])->_objectName, name))
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index e4e2c1f..9503018 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -230,8 +230,6 @@ class StaticANIObject : public GameObject {
 
 	MessageQueue *changeStatics1(int msgNum);
 	void changeStatics2(int objId);
-
-	bool canInteractAny(GameObject *obj2, int a3);
 };
 
 struct MovTable {
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index cfe9d93..9ebbe88 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -64,8 +64,16 @@ class MfcArchive : public Common::SeekableReadStream {
 	virtual bool seek(int32 offset, int whence = SEEK_SET) { return _stream->seek(offset, whence); }
 };
 
+enum ObjType {
+	kObjTypeDefault,
+	kObjTypeObjstateCommand
+};
+
 class CObject {
  public:
+	ObjType _objtype;
+
+	CObject() : _objtype(kObjTypeDefault) {}
 	virtual bool load(MfcArchive &in) { return true; }
 	virtual ~CObject() {}
 


Commit: b209329a1d2924064ddf47c35be76f0c2361419a
    https://github.com/scummvm/scummvm/commit/b209329a1d2924064ddf47c35be76f0c2361419a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:20-07:00

Commit Message:
FULLPIPE: Implemented several high level *AtPos functions

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index d700fff..ef6a589 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -247,6 +247,19 @@ bool PictureObject::isPointInside(int x, int y) {
 	return res;
 }
 
+bool PictureObject::isPixelHitAtPos(int x, int y) {
+	int oldx = _picture->_x;
+	int oldy = _picture->_y;
+
+	_picture->_x = _ox;
+	_picture->_y = _oy;
+	bool res = _picture->isPixelHitAtPos(x, y);
+	_picture->_x = oldx;
+	_picture->_y = oldy;
+
+	return res;
+}
+
 GameObject::GameObject() {
 	_okeyCode = 0;
 	_flags = 0;
@@ -590,6 +603,25 @@ bool Picture::isPointInside(int x, int y) {
 	return false;
 }
 
+bool Picture::isPixelHitAtPos(int x, int y) {
+	if (x < _x || y < _y || x >= _x + _width || y >= _y + _height)
+		return false;
+
+	if (!_bitmap )
+		init();
+
+	_bitmap->_x = _x;
+	_bitmap->_y = _y;
+
+	return _bitmap->isPixelHitAtPos(x, y);
+}
+
+bool Bitmap::isPixelHitAtPos(int x, int y) {
+	debug(0, "STUB: Bitmap::isPixelHitAtPos(%d, %d)", x, y);
+
+	return false;
+}
+
 void Bitmap::putDib(int x, int y, int32 *palette) {
 	debug(0, "Bitmap::putDib(%d, %d)", x, y);
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 59edaf4..feb560c 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -60,6 +60,8 @@ struct Bitmap {
 
 	void drawShaded(int type, int x, int y, byte *palette);
 	void drawRotated(int x, int y, int angle, byte *palette);
+
+	bool isPixelHitAtPos(int x, int y);
 };
 
 class Picture : public MemoryObject {
@@ -103,6 +105,7 @@ class Picture : public MemoryObject {
 
 	Common::Point *getDimensions(Common::Point *p);
 	bool isPointInside(int x, int y);
+	bool isPixelHitAtPos(int x, int y);
 
 	byte *getPaletteData() { return _paletteData; }
 	void setPaletteData(byte *pal);
@@ -161,6 +164,7 @@ class PictureObject : public GameObject {
 
 	bool setPicAniInfo(PicAniInfo *picAniInfo);
 	bool isPointInside(int x, int y);
+	bool isPixelHitAtPos(int x, int y);
 };
 
 class Background : public CObject {
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 95d2876..25d7077 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -483,15 +483,34 @@ StaticANIObject *Scene::getStaticANIObjectAtPos(int x, int y) {
 }
 
 PictureObject *Scene::getPictureObjectAtPos(int x, int y) {
-	warning("STUB: Scene::getPictureObjectAtPos(%d, %d)", x, y);
+	PictureObject *res = 0;
 
-	return 0;
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		PictureObject *p = (PictureObject *)_picObjList[i];
+		if ((p->_field_8 & 1) && (p->_flags & 4) &&
+				p->isPixelHitAtPos(x, y) &&
+				(!res || res->_priority >= p->_priority))
+			res = p;
+	}
+
+	return res;
 }
 
 int Scene::getPictureObjectIdAtPos(int x, int y) {
-	warning("STUB: Scene::getPictureObjectIdAtPos(%d, %d)", x, y);
+	PictureObject *resp = 0;
+	int res = 0;
 
-	return 0;
+	for (uint i = 0; i < _picObjList.size(); i++) {
+		PictureObject *p = (PictureObject *)_picObjList[i];
+		if ((p->_field_8 & 1) && (p->_flags & 4) &&
+				p->isPixelHitAtPos(x, y) &&
+				(!res || resp->_priority >= p->_priority)) {
+			resp = p;
+			res = p->_id;
+		}
+	}
+
+	return res;
 }
 
 void Scene::update(int counterdiff) {


Commit: f1eb4043c2601f1d5f18aec3841b838942939d8c
    https://github.com/scummvm/scummvm/commit/f1eb4043c2601f1d5f18aec3841b838942939d8c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:20-07:00

Commit Message:
FULLPIPE: Fix couple of Coverity defects

Changed paths:
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 6a8b78a..c3cf810 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -776,16 +776,19 @@ int global_messageHandler1(ExCommand *cmd) {
 				if (!g_fullpipe->_currSelectedInventoryItemId && !g_fullpipe->_aniMan->_movement && 
 					!(g_fullpipe->_aniMan->_flags & 0x100) && g_fullpipe->_aniMan->isIdle()) {
 					int st = g_fullpipe->_aniMan->_statics->_staticsId;
-					ExCommand *newex;
+					ExCommand *newex = 0;
 
 					if (st == ST_MAN_RIGHT) {
 						newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, rMV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
 					} else if (st == (0x4000 | ST_MAN_RIGHT)) {
 						newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, MV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
 					}
-					newex->_keyCode = g_fullpipe->_aniMan->_okeyCode;
-					newex->_excFlags |= 3;
-					newex->postMessage();
+
+					if (newex) {
+						newex->_keyCode = g_fullpipe->_aniMan->_okeyCode;
+						newex->_excFlags |= 3;
+						newex->postMessage();
+					}
 				}
 
 				if (g_fullpipe->_currSelectedInventoryItemId != invItem)
@@ -953,7 +956,10 @@ int global_messageHandler3(ExCommand *cmd) {
 			}
 			return result;
 		case 29:
-			if (g_fullpipe->_gameLoader->_interactionController->_flag24 && g_fullpipe->_currentScene) {
+			if (!g_fullpipe->_currentScene)
+				return result;
+
+			if (g_fullpipe->_gameLoader->_interactionController->_flag24) {
 				ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
 				ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
 				if (ani) {


Commit: 0daaadc604b5ec8ce3be491736b01156c19afca9
    https://github.com/scummvm/scummvm/commit/0daaadc604b5ec8ce3be491736b01156c19afca9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:21-07:00

Commit Message:
FULLPIPE: Fixed off-screen bitmap rendering

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index ef6a589..3384b87 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -783,16 +783,18 @@ void Bitmap::putDibCB(int32 *palette) {
 
 	byte *srcPtr = &_pixels[pitch * (endy - _y)];
 
+	int starty = _y;
+	if (starty < 0) {
+		starty = 0;
+		srcPtr = &_pixels[pitch * (_height + _y)];
+	}
+
 	int startx = _x;
 	if (startx < 0) {
 		srcPtr += bpp * -_x;
 		startx = 0;
 	}
 
-	int starty = _y;
-	if (starty < 0)
-		starty = 0;
-
 	if (_flags & 0x1000000) {
 		for (int y = starty; y < endy; srcPtr -= pitch, y++) {
 			curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(startx, y);


Commit: 7154d1f2cd91e8d1b160bb89ce416edf38679afd
    https://github.com/scummvm/scummvm/commit/7154d1f2cd91e8d1b160bb89ce416edf38679afd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:21-07:00

Commit Message:
FULLPIPE: More *AtPos functions

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/scene.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 3384b87..b43ea97 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -616,6 +616,27 @@ bool Picture::isPixelHitAtPos(int x, int y) {
 	return _bitmap->isPixelHitAtPos(x, y);
 }
 
+int Picture::getPixelAtPos(int x, int y) {
+	return getPixelAtPosEx(x / g_fullpipe->_pictureScale, y / g_fullpipe->_pictureScale);
+
+	return false;
+}
+
+int Picture::getPixelAtPosEx(int x, int y) {
+#if 0
+	if (x < 0 || y < 0)
+		return 0;
+
+	v5 = ictureScale + this->width - 1;
+	if ( x < v5 / g_fullpipe->_pictureScale
+		 && (v6 = g_fullpipe->_pictureScale + this_->height - 1, y < v6 / (unsigned __int16)getPictureScale())
+		 && (v7 = this_->memoryObject2) != 0
+		 && (v8 = v7->rows) != 0 )
+		return = *(_WORD *)&v8[x][2 * y];
+#endif
+	return 0;
+}
+
 bool Bitmap::isPixelHitAtPos(int x, int y) {
 	debug(0, "STUB: Bitmap::isPixelHitAtPos(%d, %d)", x, y);
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index feb560c..640b888 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -106,6 +106,8 @@ class Picture : public MemoryObject {
 	Common::Point *getDimensions(Common::Point *p);
 	bool isPointInside(int x, int y);
 	bool isPixelHitAtPos(int x, int y);
+	int getPixelAtPos(int x, int y);
+	int getPixelAtPosEx(int x, int y);
 
 	byte *getPaletteData() { return _paletteData; }
 	void setPaletteData(byte *pal);
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 25d7077..47a6811 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -477,9 +477,19 @@ void Scene::updateScrolling2() {
 }
 
 StaticANIObject *Scene::getStaticANIObjectAtPos(int x, int y) {
-	warning("STUB: Scene::getStaticANIObjectAtPos(%d, %d)", x, y);
+	StaticANIObject *res = 0;
 
-	return 0;
+	for (uint i = 0; i < _staticANIObjectList1.size(); i++) {
+		StaticANIObject *p = (StaticANIObject *)_staticANIObjectList1[i];
+		int pixel;
+
+		if ((p->_field_8 & 1) && (p->_flags & 4) &&
+				p->getPixelAtPos(x, y, &pixel) &&
+				(!res || res->_priority >= p->_priority))
+			res = p;
+	}
+
+	return res;
 }
 
 PictureObject *Scene::getPictureObjectAtPos(int x, int y) {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 53111e8..7e4c139 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -321,6 +321,65 @@ Movement *StaticANIObject::getMovementByName(char *name) {
 	return 0;
 }
 
+bool StaticANIObject::getPixelAtPos(int x, int y, int *pixel) {
+	bool res = false;
+	Picture *pic;
+
+	if (_movement)
+		pic = _movement->_currDynamicPhase;
+	else
+		pic = _statics;
+
+	if (!pic)
+		return false;
+
+	int ongoing;
+	int xani, yani;
+	int oxani, oyani;
+	Common::Point point;
+
+	if (_movement)
+		ongoing = _movement->_currMovement != 0;
+	else
+		ongoing = _statics->_staticsId & 0x4000;
+
+	if (_movement) {
+		_movement->getCurrDynamicPhaseXY(point);
+		xani = point.x;
+		yani = point.y;
+		oxani = _movement->_ox;
+		oyani = _movement->_oy;
+	} else {
+		_statics->getSomeXY(point);
+		xani = point.x;
+		yani = point.y;
+		oxani = _ox;
+		oyani = _oy;
+	}
+
+	int xtarget = x - (oxani - xani);
+	int ytarget = y - (oyani - yani);
+
+	if (ongoing && _movement)
+		xtarget = pic->getDimensions(&point)->x - xtarget;
+
+	x = pic->_x;
+	y = pic->_y;
+	pic->_x = 0;
+	pic->_y = 0;
+	if (pic->isPixelHitAtPos(xtarget, ytarget)) {
+		*pixel = pic->getPixelAtPos(xtarget, ytarget);
+
+		res = true;
+	} else {
+		res = false;
+	}
+	pic->_x = x;
+	pic->_y = y;
+
+	return res;
+}
+
 void Movement::draw(bool flipFlag, int angle) {
 	debug(3, "Movement::draw(%d, %d)", flipFlag, angle);
 
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 9503018..9393612 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -230,6 +230,8 @@ class StaticANIObject : public GameObject {
 
 	MessageQueue *changeStatics1(int msgNum);
 	void changeStatics2(int objId);
+
+	bool getPixelAtPos(int x, int y, int *pixel);
 };
 
 struct MovTable {


Commit: d8d5e2d67f4caa009918b35cb543ea6ab0a408e0
    https://github.com/scummvm/scummvm/commit/d8d5e2d67f4caa009918b35cb543ea6ab0a408e0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:21-07:00

Commit Message:
FULLPIPE: Finished Picture::getPixelAtPosEx()

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index b43ea97..3f32c27 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -623,17 +623,14 @@ int Picture::getPixelAtPos(int x, int y) {
 }
 
 int Picture::getPixelAtPosEx(int x, int y) {
-#if 0
 	if (x < 0 || y < 0)
 		return 0;
 
-	v5 = ictureScale + this->width - 1;
-	if ( x < v5 / g_fullpipe->_pictureScale
-		 && (v6 = g_fullpipe->_pictureScale + this_->height - 1, y < v6 / (unsigned __int16)getPictureScale())
-		 && (v7 = this_->memoryObject2) != 0
-		 && (v8 = v7->rows) != 0 )
-		return = *(_WORD *)&v8[x][2 * y];
-#endif
+	if (x < (g_fullpipe->_pictureScale + _width - 1) / g_fullpipe->_pictureScale &&
+			y < (g_fullpipe->_pictureScale + _height - 1) / g_fullpipe->_pictureScale &&
+			_memoryObject2 != 0 && _memoryObject2->_rows != 0)
+		return _memoryObject2->_rows[x][2 * y];
+
 	return 0;
 }
 


Commit: cac623a8219e17a84e032a9c3415538741a65d9e
    https://github.com/scummvm/scummvm/commit/cac623a8219e17a84e032a9c3415538741a65d9e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:21-07:00

Commit Message:
FULLPIPE: Bugfixes for StaticANIObject::startAnim()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/messages.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 3f32c27..e368c4b 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -506,7 +506,7 @@ void Picture::draw(int x, int y, int style, int angle) {
 		return;
 
 	if ((_alpha & 0xff) < 0xff) {
-		warning("Picture:draw: alpha = %0x", _alpha);
+		debug(0, "Picture:draw: alpha = %0x", _alpha);
 	}
 
 	byte *pal = _paletteData;
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index cc7cd2e..dcf9a22 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -644,7 +644,6 @@ void clearMessageHandlers() {
 }
 
 void processMessages() {
-	warning("###################### processing");
 	if (!g_fullpipe->_isProcessingMessages) {
 		g_fullpipe->_isProcessingMessages = true;
 
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 47a6811..891b34f 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -469,7 +469,7 @@ void Scene::draw() {
 }
 
 void Scene::updateScrolling() {
-	warning("STUB Scene::updateScrolling()");
+	debug(0, "STUB Scene::updateScrolling()");
 }
 
 void Scene::updateScrolling2() {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 7e4c139..ad51b8f 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -907,26 +907,24 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 	if (_flags & 0x80)
 		return false;
 
-	warning("STUB: StaticANIObject::startAnim(%d, %d, %d)", movementId, messageQueueId, dynPhaseIdx);
+	debug(0, "StaticANIObject::startAnim(%d, %d, %d)", movementId, messageQueueId, dynPhaseIdx);
 
 	if (_messageQueueId) {
 		updateGlobalMessageQueue(messageQueueId, _id);
 		return false;
 	}
 
-	bool found = false;
-	Movement *mov;
+	Movement *mov = 0;
 
 	for (uint i = 0; i < _movements.size(); i++) {
-		mov = (Movement *)_movements[i];
 
-		if (mov->_id != movementId) {
-			found = true;
+		if (((Movement *)_movements[i])->_id == movementId) {
+			mov = (Movement *)_movements[i];
 			break;
 		}
 	}
 
-	if (!found) {
+	if (!mov) {
 		updateGlobalMessageQueue(messageQueueId, _id);
 		return false;
 	}
@@ -935,7 +933,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 		_flags |= 1;
 		_messageQueueId = messageQueueId;
 
-		return 1;
+		return true;
 	}
 
 	int newx = _ox;
@@ -944,6 +942,9 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 
 	if (_movement) {
 		_movement->getCurrDynamicPhaseXY(point);
+
+		newx -= point.x;
+		newy -= point.y;
 	} else if (_statics) {
 		_statics->getSomeXY(point);
 


Commit: 638bd3014ef4fb4f33e6520263aa2e6471b0f70a
    https://github.com/scummvm/scummvm/commit/638bd3014ef4fb4f33e6520263aa2e6471b0f70a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:21-07:00

Commit Message:
FULLPIPE: Fix bugs in Movement::updateCurrDynamicPhase()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index e368c4b..6627e35 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -1054,6 +1054,9 @@ DynamicPhase *Shadows::findSize(int width, int height) {
 	int idx = 0;
 	int min = 1000;
 
+	if (!_items.size())
+		return 0;
+
 	for (uint i = 0; i < _items.size(); i++) {
 		int w = abs(width - _items[i].width);
 		if (w < min) {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index ad51b8f..4d13f29 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -1279,11 +1279,18 @@ void Movement::initStatics(StaticANIObject *ani) {
 }
 
 void Movement::updateCurrDynamicPhase() {
-	if (_dynamicPhases.size() == 0)
-		return;
+	if (_currMovement) {
+		if (_currMovement->_dynamicPhases.size() == 0)
+			return;
+
+		if (_currMovement->_dynamicPhases[_currDynamicPhaseIndex])
+			_currDynamicPhase = (DynamicPhase *)_currMovement->_dynamicPhases[_currDynamicPhaseIndex];
+	} else {
+		if (_dynamicPhases.size() == 0)
+			return;
 
-	if (_dynamicPhases[_currDynamicPhaseIndex]) {
-		_currDynamicPhase = (DynamicPhase *)_dynamicPhases[_currDynamicPhaseIndex];
+		if (_dynamicPhases[_currDynamicPhaseIndex])
+			_currDynamicPhase = (DynamicPhase *)_dynamicPhases[_currDynamicPhaseIndex];
 	}
 }
 


Commit: b559257358742c93dd44ef5d0f23d3024bf61ce5
    https://github.com/scummvm/scummvm/commit/b559257358742c93dd44ef5d0f23d3024bf61ce5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:22-07:00

Commit Message:
FULLPIPE: Implement CInventory2::handleLeftClick()

Changed paths:
    engines/fullpipe/input.cpp
    engines/fullpipe/inventory.cpp
    engines/fullpipe/inventory.h



diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 03a77ef..76cb17b 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -100,7 +100,8 @@ void CInputController::drawCursor(int x, int y) {
 	_cursorsArray[_cursorIndex]->picture->draw(_cursorBounds.left, _cursorBounds.top, 0, 0);
 
 	if (_cursorItemPicture)
-		_cursorItemPicture->draw(_cursorsArray[_cursorIndex]->itemPictureOffsX, _cursorsArray[_cursorIndex]->itemPictureOffsY, 0, 0);
+		_cursorItemPicture->draw(_cursorBounds.left + _cursorsArray[_cursorIndex]->itemPictureOffsX,
+								 _cursorBounds.top + _cursorsArray[_cursorIndex]->itemPictureOffsY, 0, 0);
 }
 
 void CInputController::setCursor(int cursorId) {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index adfbf66..41940f4 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -26,6 +26,7 @@
 #include "fullpipe/inventory.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/input.h"
 
 namespace Fullpipe {
 
@@ -128,6 +129,15 @@ int CInventory2::getCountItemsWithId(int itemId) {
 	return res;
 }
 
+int CInventory2::getInventoryItemIndexById(int itemId) {
+	for (uint i = 0; i < _inventoryItems.size(); i++) {
+		if (_inventoryItems[i]->itemId == itemId)
+			return i;
+	}
+
+	return -1;
+}
+
 int CInventory2::getInventoryPoolItemFieldCById(int itemId) {
 	for (uint i = 0; i < _itemsPool.size(); i++) {
 		if (_itemsPool[i]->id == itemId)
@@ -137,6 +147,15 @@ int CInventory2::getInventoryPoolItemFieldCById(int itemId) {
 	return 0;
 }
 
+int CInventory2::getItemFlags(int itemId) {
+	int idx = getInventoryPoolItemIndexById(itemId);
+
+	if (idx < 0)
+		return 0;
+
+	return _itemsPool[idx]->flags;
+}
+
 void CInventory2::rebuildItemRects() {
 	_scene = g_fullpipe->accessScene(_sceneId);
 
@@ -296,16 +315,72 @@ void CInventory2::slideOut() {
 	ex->postMessage();
 }
 
-int CInventory2::handleLeftClick(ExCommand *cmd) {
-	warning("STUB: CInventory2::handleLeftClick()");
+bool CInventory2::handleLeftClick(ExCommand *cmd) {
+	if (!_isInventoryOut)
+		return false;
 
-	return 0;
+    bool res = false;
+
+	for (uint i = 0; i < _inventoryIcons.size(); i++) {
+		if (cmd->_x >= _inventoryIcons[i]->x1 && cmd->_x <= _inventoryIcons[i]->x2 && 
+			cmd->_y >= _inventoryIcons[i]->y1 && cmd->_y <= _inventoryIcons[i]->y2) {
+			if (getSelectedItemId()) {
+				if (getSelectedItemId() != _inventoryIcons[i]->inventoryItemId)
+					unselectItem(0);
+			}
+			if (getItemFlags(_inventoryIcons[i]->inventoryItemId) & 1) {
+				ExCommand *ex = new ExCommand(0, 17, 65, 0, 0, 0, 1, 0, 0, 0);
+				ex->_field_2C = 11;
+				ex->_field_14 = _inventoryIcons[i]->inventoryItemId;
+				ex->_excFlags |= 3;
+				ex->postMessage();
+			}
+			if (!(getItemFlags(_inventoryIcons[i]->inventoryItemId) & 2)) {
+				selectItem(_inventoryIcons[i]->inventoryItemId);
+				_inventoryIcons[i]->isSelected = true;
+			}
+			res = true;
+		}
+	}
+
+    if (!res)
+		unselectItem(this);
+
+	return res;
 }
 
-int CInventory2::unselectItem(bool flag) {
-	warning("STUB: CInventory2::unselectItem()");
+int CInventory2::selectItem(int itemId) {
+	if (getInventoryItemIndexById(itemId) < 0)
+		return -1;
 
-	return 0;
+	unselectItem(0);
+
+	_selectedId = itemId;
+
+	if (_scene) {
+		int idx = getInventoryPoolItemIndexById(itemId);
+
+		Picture *pic = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectId1, 0)->_picture;
+		g_fullpipe->getGameLoaderInputController()->setCursorItemPicture(pic);
+	}
+
+	return _selectedId;
+}
+
+bool CInventory2::unselectItem(bool flag) {
+	if (_selectedId < 0)
+		return false;
+
+	_selectedId = -1;
+
+	for (uint i = 0; i < _inventoryIcons.size(); i++) {
+		if (_inventoryIcons[i]->isSelected)
+			_inventoryIcons[i]->isSelected = false;
+   }
+
+	g_fullpipe->getGameLoaderInputController()->setCursorItemPicture(0);
+
+	return true;
 }
 
 int CInventory2::getHoveredItem(Common::Point *point) {
@@ -332,9 +407,9 @@ int CInventory2::getHoveredItem(Common::Point *point) {
 			point->x > icn->x2 ||
 			point->y < _topOffset + icn->y1 ||
 			point->y > _topOffset + icn->y2) {
-			icn->isMouseHover = 0;
+			icn->isMouseHover = false;
 		} else {
-			icn->isMouseHover = 1;
+			icn->isMouseHover = true;
 			return icn->inventoryItemId;
 		}
     }
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 8d72ffc..f84d27d 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -76,8 +76,8 @@ struct InventoryIcon {
 	int x2;
 	int y2;
 	int16 inventoryItemId;
-	int isSelected;
-	int isMouseHover;
+	bool isSelected;
+	bool isMouseHover;
 };
 
 typedef Common::Array<InventoryIcon *> InventoryIcons;
@@ -101,8 +101,10 @@ class CInventory2 : public CInventory {
 	void removeItem(int itemId, int count);
 	void removeItem2(Scene *sceneObj, int itemId, int x, int y, int priority);
 
+	int getInventoryItemIndexById(int itemId);
 	int getInventoryPoolItemFieldCById(int itemId);
 	int getCountItemsWithId(int itemId);
+	int getItemFlags(int itemId);
 
 	void rebuildItemRects();
 
@@ -116,8 +118,9 @@ class CInventory2 : public CInventory {
 	void slideIn();
 	void slideOut();
 
-	int handleLeftClick(ExCommand *cmd);
-	int unselectItem(bool flag);
+	bool handleLeftClick(ExCommand *cmd);
+	int selectItem(int itemId);
+	bool unselectItem(bool flag);
 
 	void draw();
 };


Commit: f43b145ad4ca431f6080bff8cfe655703ca0b197
    https://github.com/scummvm/scummvm/commit/f43b145ad4ca431f6080bff8cfe655703ca0b197
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:22-07:00

Commit Message:
FULLPIPE: Fixed several unitialized members as pointed by Coverity

Changed paths:
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 4d13f29..bb67f9f 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -98,6 +98,10 @@ StaticANIObject::StaticANIObject() {
 	_callback2 = 0;
 	_sceneId = -1;
 	_someDynamicPhaseIndex = -1;
+
+	_field_32 = 0;
+	_field_96 = 0;
+	_messageNum = 0;
 }
 
 StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
@@ -106,6 +110,10 @@ StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
 	_field_34 = 1;
 	_initialCounter = 0;
 
+	_field_32 = 0;
+	_field_96 = 0;
+	_messageNum = 0;
+
 	_messageQueueId = 0;
 	_animExFlag = 0;
 	_counter = 0;
@@ -1097,6 +1105,9 @@ Movement::Movement() {
 	_currMovement = 0;
 	_counter = 0;
 	_counterMax = 83;
+
+	_field_24 = 0;
+	_field_28 = 0;
 }
 
 Movement::Movement(Movement *src, StaticANIObject *ani) {
@@ -1542,12 +1553,14 @@ DynamicPhase::DynamicPhase() {
 	_someX = 0;
 	_rect = 0;
 	_field_7C = 0;
+	_field_7E = 0;
 	_dynFlags = 0;
 	_someY = 0;
 }
 
 DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
 	_field_7C = src->_field_7C;
+	_field_7E = 0;
 	_rect = new Common::Rect();
 
 	if (reverse) {
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 9393612..03b8570 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -83,7 +83,6 @@ class DynamicPhase : public StaticPhase {
 class Statics : public DynamicPhase {
  public:
  	int16 _staticsId;
-	int16 _field_86;
 	char *_staticsName;
 	Picture *_picture;
 


Commit: 11cfbe4bc5c97ff6e8568126f22261f834a3943e
    https://github.com/scummvm/scummvm/commit/11cfbe4bc5c97ff6e8568126f22261f834a3943e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:22-07:00

Commit Message:
FULLPIPE: Fixe few warnings

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/input.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 79ef86e..6bfb400 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -153,7 +153,7 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, B
 		uint runPercent = 0;
 		for (int i = 0; i < bhe->_itemsCount; i++) {
 			if (!(bhe->_items[i]->_flags & 1) && bhe->_items[i]->_percent) {
-				if (rnd >= runPercent && rnd <= runPercent + bhe->_items[i]->_percent || i == bhe->_itemsCount - 1) {
+				if ((rnd >= runPercent && rnd <= runPercent + bhe->_items[i]->_percent) || i == bhe->_itemsCount - 1) {
 					mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
 					break;
 				}
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 49abbab..5c1d19b 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -347,7 +347,7 @@ void FullpipeEngine::updateScreen() {
 	//if (inputArFlag)
 	//	updateGame_inputArFlag();
 
-	if (_modalObject || _flgGameIsRunning && (_gameLoader->updateSystems(42), _modalObject != 0)) {
+	if (_modalObject || (_flgGameIsRunning && (_gameLoader->updateSystems(42), _modalObject != 0))) {
 		if (_flgGameIsRunning) {
 			if (_modalObject->init(42)) {
 				_modalObject->update();
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 76cb17b..9a25dc6 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -152,7 +152,7 @@ void FullpipeEngine::updateCursorsCommon() {
 	GameObject *ani = _currentScene->getStaticANIObjectAtPos(_mouseVirtX, _mouseVirtY);
 
 	GameObject *pic = _currentScene->getPictureObjectAtPos(_mouseVirtX, _mouseVirtY);
-	if (!ani || pic && pic->_priority < ani->_priority )
+	if (!ani || (pic && pic->_priority < ani->_priority))
 		ani = pic;
 
 	int selId = getGameLoaderInventory()->getSelectedItemId();
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 891b34f..b92b66d 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -337,7 +337,7 @@ PictureObject *Scene::getPictureObjectById(int objId, int flags) {
 
 PictureObject *Scene::getPictureObjectByName(const char *objName, int flags) {
 	for (uint i = 0; i < _picObjList.size(); i++) {
-		if (!strcmp(((PictureObject *)_picObjList[i])->_objectName, objName) && ((PictureObject *)_picObjList[i])->_okeyCode == flags || flags == -1)
+		if (!strcmp(((PictureObject *)_picObjList[i])->_objectName, objName) && (((PictureObject *)_picObjList[i])->_okeyCode == flags || flags == -1))
 			return (PictureObject *)_picObjList[i];
 	}
 
@@ -587,8 +587,6 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 		int bgPosX = g_fullpipe->_sceneRect.left - bgOffsetX;
 
 		if (bgPosX < g_fullpipe->_sceneRect.right - 1) {
-			int v24 = height * bgNumY;
-			int v51 = height * bgNumY;
 			while (1) {
 				int v25 = bgNumY;
 				for (int y = g_fullpipe->_sceneRect.top - bgOffsetY; y < g_fullpipe->_sceneRect.bottom - 1;) {
@@ -615,7 +613,6 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
 				}
 				if (v32 >= g_fullpipe->_sceneRect.right - 1)
 					break;
-				v24 = v51;
 			}
 		}
     }
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index c3cf810..9054c4c 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -980,7 +980,7 @@ int global_messageHandler3(ExCommand *cmd) {
 							return result;
 						}
 						if (ani2->canInteractAny(pic, cmd->_keyCode)) {
-							if (!ani2 || ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100))
+							if (!ani2 || (ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100)))
 								handleObjectInteraction(ani2, pic, cmd->_keyCode);
 							return 1;
 						}
@@ -990,7 +990,7 @@ int global_messageHandler3(ExCommand *cmd) {
 			if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_isEnabled && cmd->_keyCode <= 0) {
 				if (g_fullpipe->_msgX != cmd->_sceneClickX || g_fullpipe->_msgY != cmd->_sceneClickY) {
 					ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
-					if (!ani || ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100)) {
+					if (!ani || (ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100))) {
 						result = startWalkTo(g_fullpipe->_gameLoader->_field_FA, -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
 						if (result) {
 							ExCommand *ex = new ExCommand(g_fullpipe->_gameLoader->_field_FA, 17, 64, 0, 0, 0, 1, 0, 0, 0);


Commit: d6309755fc8b67e2ade20008e6f9d1fc911095c9
    https://github.com/scummvm/scummvm/commit/d6309755fc8b67e2ade20008e6f9d1fc911095c9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:22-07:00

Commit Message:
FULLPIPE: Bugfixes to StaticANIObject::update()

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index bb67f9f..0d56125 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -639,7 +639,7 @@ void StaticANIObject::update(int counterdiff) {
 			if (dyn->_initialCountdown == dyn->_countdown) {
 
 				ex = dyn->getExCommand();
-				if (ex && ex->_messageKind == 35) {
+				if (ex && ex->_messageKind != 35) {
 					newex = new ExCommand(ex);
 					newex->_excFlags |= 2;
 					if (newex->_messageKind == 17) {
@@ -651,42 +651,42 @@ void StaticANIObject::update(int counterdiff) {
 					if (!_movement)
 						return;
 				}
+			}
 
-				if (dyn->_initialCountdown == dyn->_countdown && dyn->_field_68 == 0) {
-					newex = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0);
-					newex->_excFlags = 2;
-					newex->_keyCode = _okeyCode;
-					newex->sendMessage();
+			if (dyn->_initialCountdown != dyn->_countdown || dyn->_field_68 == 0) {
+				newex = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0);
+				newex->_excFlags = 2;
+				newex->_keyCode = _okeyCode;
+				newex->sendMessage();
 
-					if (!_movement)
-						return;
-				}
+				if (!_movement)
+					return;
+			}
 
-				if (!_movement->gotoNextFrame(_callback1, _callback2)) {
-						stopAnim_maybe();
-				} else {
-					setOXY(_movement->_ox, _movement->_oy);
-					_counter = _initialCounter;
-
-					if (dyn->_initialCountdown == dyn->_countdown) {
-						ex = dyn->getExCommand();
-						if (ex) {
-							if (ex->_messageKind == 35) {
-								newex = new ExCommand(ex);
-								newex->_excFlags |= 2;
-								newex->sendMessage();
-							}
+			if (!_movement->gotoNextFrame(_callback1, _callback2)) {
+				stopAnim_maybe();
+			} else {
+				setOXY(_movement->_ox, _movement->_oy);
+				_counter = _initialCounter;
+
+				if (dyn->_initialCountdown == dyn->_countdown) {
+					ex = dyn->getExCommand();
+					if (ex) {
+						if (ex->_messageKind == 35) {
+							newex = new ExCommand(ex);
+							newex->_excFlags |= 2;
+							newex->sendMessage();
 						}
 					}
-					if (!_movement)
-						return;
-
-					_stepArray.getCurrPoint(&point);
-					setOXY(point.x + _ox, point.y + _oy);
-					_stepArray.gotoNextPoint();
-					if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
-						adjustSomeXY();
 				}
+				if (!_movement)
+					return;
+
+				_stepArray.getCurrPoint(&point);
+				setOXY(point.x + _ox, point.y + _oy);
+				_stepArray.gotoNextPoint();
+				if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
+					adjustSomeXY();
 			}
 		} else if (_flags & 0x20) {
 			_flags ^= 0x20;
@@ -696,8 +696,8 @@ void StaticANIObject::update(int counterdiff) {
 
 			Common::Point pointS;
 			_statics->getSomeXY(pointS);
-			setOXY(_ox + point.x + _movement->_mx - pointS.x,
-				   _oy + point.y + _movement->_my - pointS.y);
+			_movement->setOXY(_ox + point.x + _movement->_mx - pointS.x,
+							  _oy + point.y + _movement->_my - pointS.y);
 		}
 	} else {
 		if (_statics) {
@@ -1265,6 +1265,8 @@ void Movement::initStatics(StaticANIObject *ani) {
 	if (!_currMovement)
 		return;
 
+	debug(7, "Movement::initStatics()");
+
 	_staticsObj2 = ani->addReverseStatics(_currMovement->_staticsObj2);
 	_staticsObj1 = ani->addReverseStatics(_currMovement->_staticsObj1);
 	
@@ -1290,6 +1292,8 @@ void Movement::initStatics(StaticANIObject *ani) {
 }
 
 void Movement::updateCurrDynamicPhase() {
+	debug(7, "Movement::updateCurrDynamicPhase()");
+
 	if (_currMovement) {
 		if (_currMovement->_dynamicPhases.size() == 0)
 			return;
@@ -1306,6 +1310,7 @@ void Movement::updateCurrDynamicPhase() {
 }
 
 void Movement::setDynamicPhaseIndex(int index) {
+	debug(7, "Movement::setDynamicPhaseIndex(%d)", index);
 	while (_currDynamicPhaseIndex < index)
 		gotoNextFrame(0, 0);
 


Commit: 9abf4f6f890ae8b93c940e8191f5461e500a1c6a
    https://github.com/scummvm/scummvm/commit/9abf4f6f890ae8b93c940e8191f5461e500a1c6a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:22-07:00

Commit Message:
FULLPIPE: Added more debug output

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 5c1d19b..6bd8c82 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -341,6 +341,8 @@ void FullpipeEngine::cleanup() {
 }
 
 void FullpipeEngine::updateScreen() {
+	debug(4, "FullpipeEngine::updateScreen()");
+
 	_mouseVirtX = _mouseScreenPos.x + _sceneRect.left;
 	_mouseVirtY = _mouseScreenPos.y + _sceneRect.top;
 
@@ -361,7 +363,6 @@ void FullpipeEngine::updateScreen() {
 			}
 		}
 	} else if (_currentScene) {
-		//_currentScene->update(42);  // HACK. FIXME
 		_currentScene->draw();
 
 		if (_inventoryScene)
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 9054c4c..4f2f7c3 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -667,6 +667,8 @@ void global_messageHandler_KickMetal() {
 }
 
 int global_messageHandler1(ExCommand *cmd) {
+	debug(0, "global_messageHandler1: %d %d", cmd->_messageKind, cmd->_messageNum);
+
 	if (cmd->_excFlags & 0x10000) {
 		if (cmd->_messageNum == MV_MAN_TOLADDER)
 			cmd->_messageNum = MV_MAN_TOLADDER2;
@@ -837,8 +839,6 @@ void staticANIObjectCallback(int *arg) {
 }
 
 int global_messageHandler2(ExCommand *cmd) {
-	debug(0, "global_messageHandler2()");
-
 	if (cmd->_messageKind != 17)
 		return 0;
 
@@ -1082,7 +1082,6 @@ int global_messageHandler3(ExCommand *cmd) {
 int global_messageHandler4(ExCommand *cmd) {
 	StaticANIObject *ani = 0;
 
-	debug(0, "global_messageHandler4: %d %d", cmd->_messageKind, cmd->_messageNum);
 	switch (cmd->_messageKind) {
 	case 18: {
 		MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(cmd->_messageNum), cmd->_parId, 0);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 0d56125..5369042 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -467,7 +467,7 @@ void StaticANIObject::draw() {
 	Common::Point point;
 	Common::Rect rect;
 
-	debug(0, "StaticANIObject::draw() (%s) [%d]", transCyrillic((byte *)_objectName), _id);
+	debug(0, "StaticANIObject::draw() (%s) [%d] [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy);
 
 	if (_shadowsOn && g_fullpipe->_currentScene && g_fullpipe->_currentScene->_shadows
 		&& (getCurrDimensions(point)->x != 1 || getCurrDimensions(point)->y != 1)) {
@@ -527,7 +527,7 @@ void StaticANIObject::draw() {
 }
 
 void StaticANIObject::draw2() {
-	debug(0, "StatciANIObject::draw2()");
+	debug(0, "StatciANIObject::draw2(): id: (%s) %d [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy);
 
 	if ((_flags & 4) && (_flags & 0x10)) {
 		if (_movement) {
@@ -602,7 +602,7 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
 void StaticANIObject::update(int counterdiff) {
 	int mqid;
 
-	debug(0, "StaticANIObject::update() (%x)", _flags);
+	debug(0, "StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
 
 	if (_flags & 2) {
 		_messageNum--;
@@ -712,6 +712,8 @@ void StaticANIObject::update(int counterdiff) {
 			}
 		}
 	}
+
+	debug(0, "   StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
 }
 
 void StaticANIObject::stopAnim_maybe() {
@@ -915,7 +917,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 	if (_flags & 0x80)
 		return false;
 
-	debug(0, "StaticANIObject::startAnim(%d, %d, %d)", movementId, messageQueueId, dynPhaseIdx);
+	debug(0, "StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy);
 
 	if (_messageQueueId) {
 		updateGlobalMessageQueue(messageQueueId, _id);
@@ -948,16 +950,20 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 	int newy = _oy;
 	Common::Point point;
 
+	debug(0, "0 %d %d", newx, newy);
 	if (_movement) {
 		_movement->getCurrDynamicPhaseXY(point);
 
 		newx -= point.x;
 		newy -= point.y;
+
+		debug(0, "1 %d %d", newx, newy);
 	} else if (_statics) {
 		_statics->getSomeXY(point);
 
 		newx -= point.x;
 		newy -= point.y;
+		debug(0, "2 %d %d", newx, newy);
 	}
 
 	_movement = mov;
@@ -975,6 +981,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 			newx += point.x + _movement->_mx;
 			newy += point.y + _movement->_my;
 
+			debug(0, "3 %d %d", newx, newy);
 			_stepArray.gotoNextPoint();
 
 			ExCommand *ex = _movement->_currDynamicPhase->getExCommand();
@@ -988,9 +995,12 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 		}
 	}
 
+	debug(0, "4 %d %d", newx, newy);
 	_movement->getCurrDynamicPhaseXY(point);
 	setOXY(point.x + newx, point.y + newy);
 
+	debug(0, "   StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy);
+
 	if (_movement->_staticsObj2->_staticsId & 0x4000)
 		_flags |= 8;
 	else
@@ -1568,6 +1578,8 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
 	_field_7E = 0;
 	_rect = new Common::Rect();
 
+	debug(0, "DynamicPhase::DynamicPhase(src, %d)", reverse);
+
 	if (reverse) {
 		if (!src->_bitmap)
 			src->init();


Commit: b457771b7d6645791a4ae1f44be8e42b9f3cf7eb
    https://github.com/scummvm/scummvm/commit/b457771b7d6645791a4ae1f44be8e42b9f3cf7eb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:22-07:00

Commit Message:
FULLPIPE: Implemented setAlpha() functions

Changed paths:
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 5369042..efc5c24 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -572,6 +572,14 @@ void StaticANIObject::setSpeed(int speed) {
 	warning("STUB: StaticANIObject::setSpeed(%d)", speed);
 }
 
+void StaticANIObject::setAlpha(int alpha) {
+	for (uint i = 0; i < _movements.size(); i++)
+		((Movement *)_movements[i])->setAlpha(alpha);
+	
+	for (uint i = 0; i < _staticsList.size(); i++)
+		((Statics *)_staticsList[i])->setAlpha(alpha);
+}
+
 void StaticANIObject::initMovements() {
 	for (uint i = 0; i < _movements.size(); i++)
 		((Movement *)_movements[i])->removeFirstPhase();
@@ -684,6 +692,7 @@ void StaticANIObject::update(int counterdiff) {
 
 				_stepArray.getCurrPoint(&point);
 				setOXY(point.x + _ox, point.y + _oy);
+				warning("%d %d %d %d", _ox, point.x, _oy, point.y);
 				_stepArray.gotoNextPoint();
 				if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
 					adjustSomeXY();
@@ -963,7 +972,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 
 		newx -= point.x;
 		newy -= point.y;
-		debug(0, "2 %d %d", newx, newy);
+		debug(0, "2 %d %d - %d %d assa", newx, newy, point.x, point.y);
 	}
 
 	_movement = mov;
@@ -1160,6 +1169,7 @@ bool Movement::load(MfcArchive &file) {
 	warning("STUB: Movement::load");
 	return true;
 }
+
 bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
 	GameObject::load(file);
 
@@ -1249,6 +1259,17 @@ Common::Point *Movement::getCurrDynamicPhaseXY(Common::Point &p) {
 	return &p;
 }
 
+void Movement::setAlpha(int alpha) {
+	if (_currMovement)
+		for (uint i = 0; i < _currMovement->_dynamicPhases.size(); i++) {
+			((DynamicPhase *)_currMovement->_dynamicPhases[i])->setAlpha(alpha);
+		}
+	else
+		for (uint i = 0; i < _dynamicPhases.size(); i++) {
+			((DynamicPhase *)_dynamicPhases[i])->setAlpha(alpha);
+		}
+}
+
 Common::Point *Movement::getDimensionsOfPhase(Common::Point *p, int phaseIndex) {
 	int idx = phaseIndex;
 
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 03b8570..5ae4a1c 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -140,6 +140,8 @@ class Movement : public GameObject {
 	void initStatics(StaticANIObject *ani);
 	void updateCurrDynamicPhase();
 
+	void setAlpha(int alpha);
+
 	void setDynamicPhaseIndex(int index);
 
 	void removeFirstPhase();
@@ -194,6 +196,7 @@ class StaticANIObject : public GameObject {
 	void clearFlags();
 	void setFlags40(bool state);
 	bool isIdle();
+	void setAlpha(int alpha);
 
 	void deleteFromGlobalMessageQueue();
 	void queueMessageQueue(MessageQueue *msg);


Commit: 7c3640b2b7017389e23a81f2f06a3ea9161b8ea2
    https://github.com/scummvm/scummvm/commit/7c3640b2b7017389e23a81f2f06a3ea9161b8ea2
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:23-07:00

Commit Message:
FULLPIPE: Some WIP debugging

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 6bd8c82..4645768 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -204,6 +204,8 @@ Common::Error FullpipeEngine::run() {
 		_system->delayMillis(10);
 		_system->updateScreen();
 
+		_system->delayMillis(300); // HACK
+
 	}
 
 	freeGameLoader();
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 6627e35..6ccf661 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -312,6 +312,8 @@ bool GameObject::load(MfcArchive &file) {
 }
 
 void GameObject::setOXY(int x, int y) {
+	warning("GameObject::setOXY(%d, %d)  %s", x, y, transCyrillic((byte *)_objectName));
+
 	_ox = x;
 	_oy = y;
 }
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index efc5c24..cb4ca75 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -184,6 +184,7 @@ bool StaticANIObject::load(MfcArchive &file) {
 		pt.x = pt.y = 100;
 	}
 
+	warning("%s %d", __FILE__, __LINE__);
 	setOXY(pt.x, pt.y);
 
 	return true;
@@ -193,8 +194,10 @@ void StaticANIObject::setOXY(int x, int y) {
 	_ox = x;
 	_oy = y;
 	
-	if (_movement)
+	if (_movement) {
+		warning("%s %d", __FILE__, __LINE__);
 		_movement->setOXY(x, y);
+	}
 }
 
 void StaticANIObject::clearFlags() {
@@ -674,6 +677,7 @@ void StaticANIObject::update(int counterdiff) {
 			if (!_movement->gotoNextFrame(_callback1, _callback2)) {
 				stopAnim_maybe();
 			} else {
+				warning("%s %d", __FILE__, __LINE__);
 				setOXY(_movement->_ox, _movement->_oy);
 				_counter = _initialCounter;
 
@@ -691,8 +695,8 @@ void StaticANIObject::update(int counterdiff) {
 					return;
 
 				_stepArray.getCurrPoint(&point);
+				warning("%s %d", __FILE__, __LINE__);
 				setOXY(point.x + _ox, point.y + _oy);
-				warning("%d %d %d %d", _ox, point.x, _oy, point.y);
 				_stepArray.gotoNextPoint();
 				if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
 					adjustSomeXY();
@@ -705,6 +709,7 @@ void StaticANIObject::update(int counterdiff) {
 
 			Common::Point pointS;
 			_statics->getSomeXY(pointS);
+			warning("%s %d", __FILE__, __LINE__);
 			_movement->setOXY(_ox + point.x + _movement->_mx - pointS.x,
 							  _oy + point.y + _movement->_my - pointS.y);
 		}
@@ -738,6 +743,7 @@ void StaticANIObject::stopAnim_maybe() {
 	Common::Point point;
 
 	if (_movement) {
+		warning("%s %d", __FILE__, __LINE__);
 		setOXY(_movement->_ox, _movement->_oy);
 
 		if (_flags & 0x40) {
@@ -806,6 +812,7 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	debug(0, "StaticANIObject::setPicAniInfo() (%s [%d]) type: %d, statid: %d, movid: %d", transCyrillic((byte *)_objectName), _id, picAniInfo->type, picAniInfo->staticsId, picAniInfo->movementId);
 
 	if (picAniInfo->type & 3) {
+		warning("%s %d", __FILE__, __LINE__);
 		setOXY(picAniInfo->ox, picAniInfo->oy);
 		_priority = picAniInfo->priority;
 		_okeyCode = picAniInfo->field_8;
@@ -861,8 +868,10 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
 
 	if (movId == -1) {
 		_flags |= 4u;
-		if (x != -1 && y != -1)
+		if (x != -1 && y != -1) {
+			warning("%s %d", __FILE__, __LINE__);
 			setOXY(x, y);
+		}
 
 		return;
 	}
@@ -871,8 +880,10 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
 	if (!mov)
 		return;
 
-	if (x != -1 && y != -1)
+	if (x != -1 && y != -1) {
+		warning("%s %d", __FILE__, __LINE__);
 		setOXY(x, y);
+	}
 
 	_statics = mov->_staticsObj1;
 
@@ -1006,6 +1017,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 
 	debug(0, "4 %d %d", newx, newy);
 	_movement->getCurrDynamicPhaseXY(point);
+	warning("%s %d", __FILE__, __LINE__);
 	setOXY(point.x + newx, point.y + newy);
 
 	debug(0, "   StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy);


Commit: 0dc4914cc4305174102936dc94d27fd192414837
    https://github.com/scummvm/scummvm/commit/0dc4914cc4305174102936dc94d27fd192414837
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:23-07:00

Commit Message:
FULLPIPE: Remove redundant debug info

Changed paths:
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 4645768..bc8a4ae 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -203,9 +203,6 @@ Common::Error FullpipeEngine::run() {
 
 		_system->delayMillis(10);
 		_system->updateScreen();
-
-		_system->delayMillis(300); // HACK
-
 	}
 
 	freeGameLoader();
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 6ccf661..6627e35 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -312,8 +312,6 @@ bool GameObject::load(MfcArchive &file) {
 }
 
 void GameObject::setOXY(int x, int y) {
-	warning("GameObject::setOXY(%d, %d)  %s", x, y, transCyrillic((byte *)_objectName));
-
 	_ox = x;
 	_oy = y;
 }
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 640b888..6818fe6 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -65,12 +65,7 @@ struct Bitmap {
 };
 
 class Picture : public MemoryObject {
-	friend class Movement;
-	friend class DynamicPhase;
-	friend class PictureObject;
-	friend class CInputController;
-	friend class StaticANIObject;
-
+ public:
 	Common::Rect _rect;
 	Bitmap *_convertedBitmap;
 	int _x;
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index cb4ca75..db15ee4 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -184,7 +184,6 @@ bool StaticANIObject::load(MfcArchive &file) {
 		pt.x = pt.y = 100;
 	}
 
-	warning("%s %d", __FILE__, __LINE__);
 	setOXY(pt.x, pt.y);
 
 	return true;
@@ -194,10 +193,8 @@ void StaticANIObject::setOXY(int x, int y) {
 	_ox = x;
 	_oy = y;
 	
-	if (_movement) {
-		warning("%s %d", __FILE__, __LINE__);
+	if (_movement)
 		_movement->setOXY(x, y);
-	}
 }
 
 void StaticANIObject::clearFlags() {
@@ -677,7 +674,6 @@ void StaticANIObject::update(int counterdiff) {
 			if (!_movement->gotoNextFrame(_callback1, _callback2)) {
 				stopAnim_maybe();
 			} else {
-				warning("%s %d", __FILE__, __LINE__);
 				setOXY(_movement->_ox, _movement->_oy);
 				_counter = _initialCounter;
 
@@ -695,7 +691,6 @@ void StaticANIObject::update(int counterdiff) {
 					return;
 
 				_stepArray.getCurrPoint(&point);
-				warning("%s %d", __FILE__, __LINE__);
 				setOXY(point.x + _ox, point.y + _oy);
 				_stepArray.gotoNextPoint();
 				if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex)
@@ -709,7 +704,6 @@ void StaticANIObject::update(int counterdiff) {
 
 			Common::Point pointS;
 			_statics->getSomeXY(pointS);
-			warning("%s %d", __FILE__, __LINE__);
 			_movement->setOXY(_ox + point.x + _movement->_mx - pointS.x,
 							  _oy + point.y + _movement->_my - pointS.y);
 		}
@@ -743,7 +737,6 @@ void StaticANIObject::stopAnim_maybe() {
 	Common::Point point;
 
 	if (_movement) {
-		warning("%s %d", __FILE__, __LINE__);
 		setOXY(_movement->_ox, _movement->_oy);
 
 		if (_flags & 0x40) {
@@ -812,7 +805,6 @@ bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
 	debug(0, "StaticANIObject::setPicAniInfo() (%s [%d]) type: %d, statid: %d, movid: %d", transCyrillic((byte *)_objectName), _id, picAniInfo->type, picAniInfo->staticsId, picAniInfo->movementId);
 
 	if (picAniInfo->type & 3) {
-		warning("%s %d", __FILE__, __LINE__);
 		setOXY(picAniInfo->ox, picAniInfo->oy);
 		_priority = picAniInfo->priority;
 		_okeyCode = picAniInfo->field_8;
@@ -869,7 +861,6 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
 	if (movId == -1) {
 		_flags |= 4u;
 		if (x != -1 && y != -1) {
-			warning("%s %d", __FILE__, __LINE__);
 			setOXY(x, y);
 		}
 
@@ -881,7 +872,6 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
 		return;
 
 	if (x != -1 && y != -1) {
-		warning("%s %d", __FILE__, __LINE__);
 		setOXY(x, y);
 	}
 
@@ -1015,13 +1005,9 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 		}
 	}
 
-	debug(0, "4 %d %d", newx, newy);
 	_movement->getCurrDynamicPhaseXY(point);
-	warning("%s %d", __FILE__, __LINE__);
 	setOXY(point.x + newx, point.y + newy);
 
-	debug(0, "   StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy);
-
 	if (_movement->_staticsObj2->_staticsId & 0x4000)
 		_flags |= 8;
 	else
@@ -1338,13 +1324,13 @@ void Movement::updateCurrDynamicPhase() {
 	debug(7, "Movement::updateCurrDynamicPhase()");
 
 	if (_currMovement) {
-		if (_currMovement->_dynamicPhases.size() == 0)
+		if (_currMovement->_dynamicPhases.size() == 0 || (uint)_currDynamicPhaseIndex >= _currMovement->_dynamicPhases.size())
 			return;
 
 		if (_currMovement->_dynamicPhases[_currDynamicPhaseIndex])
 			_currDynamicPhase = (DynamicPhase *)_currMovement->_dynamicPhases[_currDynamicPhaseIndex];
 	} else {
-		if (_dynamicPhases.size() == 0)
+		if (_dynamicPhases.size() == 0 || (uint)_currDynamicPhaseIndex >= _dynamicPhases.size())
 			return;
 
 		if (_dynamicPhases[_currDynamicPhaseIndex])


Commit: 5c759da7a3476ad0bf6af09887b7ded248950cbd
    https://github.com/scummvm/scummvm/commit/5c759da7a3476ad0bf6af09887b7ded248950cbd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:23-07:00

Commit Message:
FULLPIPE: Fix long standing bug with animation

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index db15ee4..cb23b60 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -1251,8 +1251,8 @@ bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
 }
 
 Common::Point *Movement::getCurrDynamicPhaseXY(Common::Point &p) {
-	p.x = _currDynamicPhase->_x;
-	p.y = _currDynamicPhase->_y;
+	p.x = _currDynamicPhase->_someX;
+	p.y = _currDynamicPhase->_someY;
 
 	return &p;
 }


Commit: a522f5bc157e250cfb2bfb0093afd26a4de7fbcf
    https://github.com/scummvm/scummvm/commit/a522f5bc157e250cfb2bfb0093afd26a4de7fbcf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:23-07:00

Commit Message:
FULLPIPE: WIP debug output

Changed paths:
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 4f2f7c3..0c06e03 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -1370,10 +1370,10 @@ void scene01_initScene(Scene *sc, int entrance) {
 			pic->_flags &= 0xFFFB;
 	}
 
-	if (entrance != TrubaLeft ) {
+	if (entrance != TrubaLeft) {
 		StaticANIObject *bootAnim = sc->getStaticANIObject1ById(ANI_BOOT_1, -1);
 		if (bootAnim)
-			bootAnim->_flags &= 0xFFFB;
+			bootAnim->_flags &= ~0x04;
 	}
 
 	setElevatorButton(sO_Level2, ST_LBN_2N);
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index cb23b60..8fe119e 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -217,6 +217,7 @@ void StaticANIObject::setFlags40(bool state) {
 		if (_flags & 0x40)
 			_flags ^= 0x40;
 	}
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 }
 
 void StaticANIObject::deleteFromGlobalMessageQueue() {
@@ -239,6 +240,7 @@ void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
 		_messageNum = 0;
 		if (_flags & 2) {
 			_flags ^= 2;
+			if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 		}
 		if (mq) {
 			_animExFlag = 0;
@@ -266,6 +268,7 @@ bool StaticANIObject::trySetMessageQueue(int msgNum, int qId) {
 	}
 
 	_flags |= 2;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 	_messageNum = msgNum;
 	_messageQueueId = qId;
 
@@ -611,6 +614,7 @@ void StaticANIObject::update(int counterdiff) {
 	int mqid;
 
 	debug(0, "StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
+	if (_id == 322 && _oy != 100) warning("StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
 
 	if (_flags & 2) {
 		_messageNum--;
@@ -620,6 +624,7 @@ void StaticANIObject::update(int counterdiff) {
 		mqid = _messageQueueId;
 		_messageQueueId = 0;
 		_flags ^= 2;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 		updateGlobalMessageQueue(mqid, _id);
 		return;
@@ -699,6 +704,7 @@ void StaticANIObject::update(int counterdiff) {
 		} else if (_flags & 0x20) {
 			_flags ^= 0x20;
 			_flags |= 1;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 			_movement->gotoFirstFrame();
 			_movement->getCurrDynamicPhaseXY(point);
 
@@ -722,6 +728,8 @@ void StaticANIObject::update(int counterdiff) {
 	}
 
 	debug(0, "   StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
+	if (_id == 322 && _oy != 100)
+	warning("   StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
 }
 
 void StaticANIObject::stopAnim_maybe() {
@@ -731,6 +739,7 @@ void StaticANIObject::stopAnim_maybe() {
 		return;
 
 	_flags ^= 1;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 	int oid = 0;
 	int oldmqid = _messageQueueId;
@@ -897,6 +906,7 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
 
 	if (_flags & 1)
 		_flags ^= 1;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 	_messageQueueId = mqId;
 }
@@ -951,6 +961,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 
 	if (mov == _movement) {
 		_flags |= 1;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 		_messageQueueId = messageQueueId;
 
 		return true;
@@ -1014,6 +1025,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 		_flags &= 0xFFF7;
 
 	_flags |= 1;
+	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 	_messageQueueId = messageQueueId;
 	_movement->_currDynamicPhase->_countdown = _movement->_currDynamicPhase->_initialCountdown;


Commit: 0b4318267424f6220948c122d0db73e93deef39e
    https://github.com/scummvm/scummvm/commit/0b4318267424f6220948c122d0db73e93deef39e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:23-07:00

Commit Message:
FULLPIPE: Remove rdundant debug output

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 8fe119e..c4ceaf2 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -217,7 +217,6 @@ void StaticANIObject::setFlags40(bool state) {
 		if (_flags & 0x40)
 			_flags ^= 0x40;
 	}
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 }
 
 void StaticANIObject::deleteFromGlobalMessageQueue() {
@@ -238,10 +237,10 @@ void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
 		deleteFromGlobalMessageQueue();
 		_messageQueueId = 0;
 		_messageNum = 0;
-		if (_flags & 2) {
+
+		if (_flags & 2)
 			_flags ^= 2;
-			if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
-		}
+
 		if (mq) {
 			_animExFlag = 0;
 			if (_movement)
@@ -268,7 +267,7 @@ bool StaticANIObject::trySetMessageQueue(int msgNum, int qId) {
 	}
 
 	_flags |= 2;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
+
 	_messageNum = msgNum;
 	_messageQueueId = qId;
 
@@ -613,8 +612,7 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
 void StaticANIObject::update(int counterdiff) {
 	int mqid;
 
-	debug(0, "StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
-	if (_id == 322 && _oy != 100) warning("StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
+	debug(6, "StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
 
 	if (_flags & 2) {
 		_messageNum--;
@@ -624,7 +622,6 @@ void StaticANIObject::update(int counterdiff) {
 		mqid = _messageQueueId;
 		_messageQueueId = 0;
 		_flags ^= 2;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 		updateGlobalMessageQueue(mqid, _id);
 		return;
@@ -704,7 +701,7 @@ void StaticANIObject::update(int counterdiff) {
 		} else if (_flags & 0x20) {
 			_flags ^= 0x20;
 			_flags |= 1;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
+
 			_movement->gotoFirstFrame();
 			_movement->getCurrDynamicPhaseXY(point);
 
@@ -726,20 +723,15 @@ void StaticANIObject::update(int counterdiff) {
 			}
 		}
 	}
-
-	debug(0, "   StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
-	if (_id == 322 && _oy != 100)
-	warning("   StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags);
 }
 
 void StaticANIObject::stopAnim_maybe() {
-	debug(0, "StaticANIObject::stopAnim_maybe()");
+	debug(6, "StaticANIObject::stopAnim_maybe()");
 
 	if (!(_flags & 1))
 		return;
 
 	_flags ^= 1;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 	int oid = 0;
 	int oldmqid = _messageQueueId;
@@ -906,7 +898,6 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
 
 	if (_flags & 1)
 		_flags ^= 1;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 	_messageQueueId = mqId;
 }
@@ -961,7 +952,6 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 
 	if (mov == _movement) {
 		_flags |= 1;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 		_messageQueueId = messageQueueId;
 
 		return true;
@@ -1025,7 +1015,6 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
 		_flags &= 0xFFF7;
 
 	_flags |= 1;
-	if (_id == 322) warning("%d [%d, %d] fl: %x", __LINE__, _ox, _oy, _flags);
 
 	_messageQueueId = messageQueueId;
 	_movement->_currDynamicPhase->_countdown = _movement->_currDynamicPhase->_initialCountdown;


Commit: 0bc0aa16581a251a628c93125f3209aa8fcd1ddb
    https://github.com/scummvm/scummvm/commit/0bc0aa16581a251a628c93125f3209aa8fcd1ddb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:24-07:00

Commit Message:
FULLPIPE: Implement GlobalMessageQueueList::compact()

Changed paths:
    engines/fullpipe/messages.cpp



diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index dcf9a22..96ed389 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -465,9 +465,16 @@ void GlobalMessageQueueList::disableQueueById(int id) {
 }
 
 int GlobalMessageQueueList::compact() {
-	warning("STUB: GlobalMessageQueueList::compact()");
+	for (uint i = 0; i < size();) {
+		if (((MessageQueue *)((*this).operator[](i)))->_isFinished) {
+			disableQueueById(((MessageQueue *)((*this).operator[](i)))->_id);
+			remove_at(i);
+		} else {
+			i++;
+		}
+	}
 
-	return 0;
+	return size() + 1;
 }
 
 void GlobalMessageQueueList::addMessageQueue(MessageQueue *msg) {


Commit: 1b057ba3465ac27a1ec855d2ddfbbd730edfa9f0
    https://github.com/scummvm/scummvm/commit/1b057ba3465ac27a1ec855d2ddfbbd730edfa9f0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:24-07:00

Commit Message:
FULLPIPE: Implement MessageQueue::finish()

Changed paths:
    engines/fullpipe/messages.cpp



diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 96ed389..c24dee4 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -414,7 +414,25 @@ bool MessageQueue::checkGlobalExCommandList2() {
 }
 
 void MessageQueue::finish() {
-	warning("STUB: MessageQueue::finish()");
+	if (!_parId)
+		return;
+
+	MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_parId);
+
+	_parId = 0;
+
+	if (!mq)
+		return;
+
+	if (!_flag1) {
+		mq->update();
+		return;
+	}
+
+	mq->_counter--;
+
+	if (!mq->_counter && !mq->_exCommands.size())
+		mq->update();
 }
 
 void MessageQueue::replaceKeyCode(int key1, int key2) {


Commit: eea48b4f12f819a2bd595f3750a23998e96ee560
    https://github.com/scummvm/scummvm/commit/eea48b4f12f819a2bd595f3750a23998e96ee560
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:24-07:00

Commit Message:
FULLPIPE: Implement Shadows::initMovement()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 6627e35..d680d32 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -1047,7 +1047,29 @@ void Shadows::init() {
 }
 
 void Shadows::initMovement(Movement *mov) {
-	warning("STUB: Shadows::initMovement()");
+	uint num;
+
+	if (mov->_currMovement)
+		num = mov->_currMovement->_dynamicPhases.size();
+	else
+		num = mov->_dynamicPhases.size();
+
+	_items.clear();
+	_items.resize(num);
+
+	Common::Point point;
+
+	_items[0].dynPhase = (DynamicPhase *)mov->_staticsObj1;
+	_items[0].dynPhase->getDimensions(&point);
+	_items[0].width = point.x;
+	_items[0].height = point.y;
+
+	for (uint i = 1; i < num; i++) {
+		_items[i].dynPhase = mov->getDynamicPhaseByIndex(i);
+		_items[i].dynPhase->getDimensions(&point);
+		_items[i].width = point.x;
+		_items[i].height = point.y;
+	}
 }
 
 DynamicPhase *Shadows::findSize(int width, int height) {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index c4ceaf2..46d48d5 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -1348,6 +1348,22 @@ void Movement::setDynamicPhaseIndex(int index) {
 		gotoPrevFrame();
 }
 
+DynamicPhase *Movement::getDynamicPhaseByIndex(int idx) {
+	debug(7, "Movement::updateCurrDynamicPhase()");
+
+	if (_currMovement) {
+		if (_currMovement->_dynamicPhases.size() == 0 || (uint)idx >= _currMovement->_dynamicPhases.size())
+			return 0;
+
+		return (DynamicPhase *)_currMovement->_dynamicPhases[idx];
+	} else {
+		if (_dynamicPhases.size() == 0 || (uint)idx >= _dynamicPhases.size())
+			return 0;
+
+		return (DynamicPhase *)_dynamicPhases[idx];
+	}
+}
+
 void Movement::loadPixelData() {
 	Movement *mov = this;
 	for (Movement *i = _currMovement; i; i = i->_currMovement)
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 5ae4a1c..295da9b 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -143,6 +143,7 @@ class Movement : public GameObject {
 	void setAlpha(int alpha);
 
 	void setDynamicPhaseIndex(int index);
+	DynamicPhase *getDynamicPhaseByIndex(int idx);
 
 	void removeFirstPhase();
 	bool gotoNextFrame(int callback1, void (*callback2)(int *));


Commit: 8ffbbccbfc70ed0ce17e594b25c5b9efae248013
    https://github.com/scummvm/scummvm/commit/8ffbbccbfc70ed0ce17e594b25c5b9efae248013
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:24-07:00

Commit Message:
FULLPIPE: Bugfix shadow drawing

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index d680d32..131396c 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -1065,7 +1065,7 @@ void Shadows::initMovement(Movement *mov) {
 	_items[0].height = point.y;
 
 	for (uint i = 1; i < num; i++) {
-		_items[i].dynPhase = mov->getDynamicPhaseByIndex(i);
+		_items[i].dynPhase = mov->getDynamicPhaseByIndex(i - 1);
 		_items[i].dynPhase->getDimensions(&point);
 		_items[i].width = point.x;
 		_items[i].height = point.y;
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 46d48d5..a44093b 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -492,18 +492,18 @@ void StaticANIObject::draw() {
 			DynamicPhase *shd = g_fullpipe->_currentScene->_shadows->findSize(rect.width(), rect.height());
 			if (shd) {
 				shd->getDimensions(&point);
-				int midx = _ox - shd->_x / 2 - dyn->_someX;
-				int midy = _oy - shd->_y / 2 - dyn->_someY + rect.bottom - 3;
-				int shdy =  shd->_y;
+				int midx = _ox - point.x / 2 - dyn->_someX;
+				int midy = _oy - point.y / 2 - dyn->_someY + rect.bottom - 3;
+				int shdw =  point.y;
 
 				int px;
-				if (!_movement || _flags & 0x20 )
+				if (!_movement || (_flags & 0x20))
 					px = _statics->getCenter(&point)->x;
 				else
 					px = _movement->getCenter(&point)->x;
 
 				if (_shadowsOn != 1)
-					midy = _shadowsOn - shdy / 2;
+					midy = _shadowsOn - shdw / 2;
 
 				shd->draw(px + midx, midy, 0, 0);
 			}
@@ -1589,7 +1589,7 @@ Common::Point *Movement::getCenter(Common::Point *p) {
 	if (_currMovement) {
 		Common::Point point;
 
-		getDimensionsOfPhase(&point, _currDynamicPhaseIndex);
+		_currMovement->getDimensionsOfPhase(&point, _currDynamicPhaseIndex);
 
 		rect.moveTo(point.x - _currDynamicPhase->_rect->right, _currDynamicPhase->_rect->top);
 	}


Commit: b3abc58675001313f809bcd5f7a3f86488f67e7d
    https://github.com/scummvm/scummvm/commit/b3abc58675001313f809bcd5f7a3f86488f67e7d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:24-07:00

Commit Message:
FULLPIPE: Hid noisy stub message

Changed paths:
    engines/fullpipe/sound.cpp



diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 442db7a..7f34412 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -132,7 +132,7 @@ void FullpipeEngine::playSound(int id, int flag) {
 }
 
 void global_messageHandler_handleSound(ExCommand *cmd) {
-	warning("STUB: global_messageHandler_handleSound()");
+	debug(0, "STUB: global_messageHandler_handleSound()");
 }
 
 


Commit: 0814826f12960a03f0c9a32316c9449982bd14cb
    https://github.com/scummvm/scummvm/commit/0814826f12960a03f0c9a32316c9449982bd14cb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:24-07:00

Commit Message:
FULLPIPE: Implement StaticANIObject::setSpeed()

Changed paths:
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index a44093b..c54c6df 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -571,7 +571,24 @@ MovTable *StaticANIObject::countMovements() {
 }
 
 void StaticANIObject::setSpeed(int speed) {
-	warning("STUB: StaticANIObject::setSpeed(%d)", speed);
+	CGameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("SpeedUp");
+
+	if (!var)
+		return;
+
+	for (var = var->_subVars; var; var = var->_nextVarObj) {
+		Movement *mov = getMovementById(var->_value.intValue);
+
+		if (mov) {
+			if (speed) {
+				if (mov->_counterMax == 83)
+					mov->_counterMax = 41;
+			} else if (mov->_counterMax == 41) {
+				mov->_counterMax = 83;
+			}
+		}
+	}
+
 }
 
 void StaticANIObject::setAlpha(int alpha) {


Commit: ff9cd54fd15c07db4c31f81bff318db26a47297f
    https://github.com/scummvm/scummvm/commit/ff9cd54fd15c07db4c31f81bff318db26a47297f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:25-07:00

Commit Message:
FULLPIPE: Fix default cursor

Changed paths:
    engines/fullpipe/input.cpp



diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 9a25dc6..eb528f0 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -208,7 +208,7 @@ void FullpipeEngine::updateCursorsCommon() {
 		}
 	}
 
-	_cursorId = PIC_CSR_DEFAULT_INV;
+	_cursorId = PIC_CSR_DEFAULT;
 }
 
 } // End of namespace Fullpipe


Commit: d0484467688e896937f232766e9104bbd3377144
    https://github.com/scummvm/scummvm/commit/d0484467688e896937f232766e9104bbd3377144
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:25-07:00

Commit Message:
FULLPIPE: Implement Bitmap::isPixelHitAtPos()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 131396c..629e8e5 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -53,6 +53,11 @@ Bitmap::Bitmap(Bitmap *src) {
 	_pixels = src->_pixels;
 }
 
+Bitmap::~Bitmap() {
+	if (_pixels)
+		free(_pixels);
+}
+
 void Bitmap::load(Common::ReadStream *s) {
 	debug(5, "Bitmap::load()");
 
@@ -635,7 +640,44 @@ int Picture::getPixelAtPosEx(int x, int y) {
 }
 
 bool Bitmap::isPixelHitAtPos(int x, int y) {
-	debug(0, "STUB: Bitmap::isPixelHitAtPos(%d, %d)", x, y);
+	if (x < _x || x >= _width + _x || y < _y || y >= _y + _height)
+		return false;
+
+	int off;
+
+	if (_type == 'CB\x05e')
+		off = 2 * ((_width + 1) / 2);
+	else
+		off = 4 * ((_width + 3) / 4);
+
+	off = x + off * (_y + _height - y - 1) - _x;
+
+	if (_flags & 0x1000000) {
+		switch (_type) {
+		case 'CB\0\0':
+			if (_pixels[off] == _flags & 0xff)
+				return false;
+			break;
+		case 'CB\x05e':
+			if (!*(int16 *)&_pixels[2 * off])
+				return false;
+			break;
+		case 'RB\0\0':
+			{
+				Bitmap bmp;
+
+				if (decompressRle2(&bmp))
+					return bmp._pixels[off] != bmp._flags;
+
+				return false;
+			}
+		}
+	}
+	return true;
+}
+
+bool Bitmap::decompressRle2(Bitmap *res) {
+	warning("STUB: Bitmap::decompressRle2()");
 
 	return false;
 }
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 6818fe6..ccfc72f 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -41,6 +41,7 @@ struct Bitmap {
 
 	Bitmap();
 	Bitmap(Bitmap *src);
+	~Bitmap();
 
 	void load(Common::ReadStream *s);
 	void putDib(int x, int y, int32 *palette);
@@ -62,6 +63,7 @@ struct Bitmap {
 	void drawRotated(int x, int y, int angle, byte *palette);
 
 	bool isPixelHitAtPos(int x, int y);
+	bool decompressRle2(Bitmap *res);
 };
 
 class Picture : public MemoryObject {


Commit: 8ea65ec40f5ab3422a415be8c1e08185ea60ed05
    https://github.com/scummvm/scummvm/commit/8ea65ec40f5ab3422a415be8c1e08185ea60ed05
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:25-07:00

Commit Message:
FULLPIPE: Fix *AtPos() functions

Changed paths:
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index b92b66d..66e5ee3 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -483,7 +483,7 @@ StaticANIObject *Scene::getStaticANIObjectAtPos(int x, int y) {
 		StaticANIObject *p = (StaticANIObject *)_staticANIObjectList1[i];
 		int pixel;
 
-		if ((p->_field_8 & 1) && (p->_flags & 4) &&
+		if ((p->_field_8 & 0x100) && (p->_flags & 4) &&
 				p->getPixelAtPos(x, y, &pixel) &&
 				(!res || res->_priority >= p->_priority))
 			res = p;
@@ -497,7 +497,7 @@ PictureObject *Scene::getPictureObjectAtPos(int x, int y) {
 
 	for (uint i = 0; i < _picObjList.size(); i++) {
 		PictureObject *p = (PictureObject *)_picObjList[i];
-		if ((p->_field_8 & 1) && (p->_flags & 4) &&
+		if ((p->_field_8 & 0x100) && (p->_flags & 4) &&
 				p->isPixelHitAtPos(x, y) &&
 				(!res || res->_priority >= p->_priority))
 			res = p;
@@ -512,7 +512,7 @@ int Scene::getPictureObjectIdAtPos(int x, int y) {
 
 	for (uint i = 0; i < _picObjList.size(); i++) {
 		PictureObject *p = (PictureObject *)_picObjList[i];
-		if ((p->_field_8 & 1) && (p->_flags & 4) &&
+		if ((p->_field_8 & 0x100) && (p->_flags & 4) &&
 				p->isPixelHitAtPos(x, y) &&
 				(!res || resp->_priority >= p->_priority)) {
 			resp = p;


Commit: f61b77e07e032b8ec672eb4daabe625b59d9292f
    https://github.com/scummvm/scummvm/commit/f61b77e07e032b8ec672eb4daabe625b59d9292f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:25-07:00

Commit Message:
FULLPIPE: Implement Bitmap::isPixelHitAtPos()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 629e8e5..a382033 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -663,23 +663,23 @@ bool Bitmap::isPixelHitAtPos(int x, int y) {
 				return false;
 			break;
 		case 'RB\0\0':
-			{
-				Bitmap bmp;
-
-				if (decompressRle2(&bmp))
-					return bmp._pixels[off] != bmp._flags;
-
-				return false;
-			}
+			return isPixelAtHitPosRB(x, y);
 		}
 	}
 	return true;
 }
 
-bool Bitmap::decompressRle2(Bitmap *res) {
-	warning("STUB: Bitmap::decompressRle2()");
+bool Bitmap::isPixelAtHitPosRB(int x, int y) {
+	int ox = _x;
+	int oy = _y;
 
-	return false;
+	_x = _y = 0;
+
+	bool res = putDibRB(0, x, y);
+	_x = ox;
+	_y = oy;
+
+	return res;
 }
 
 void Bitmap::putDib(int x, int y, int32 *palette) {
@@ -694,7 +694,7 @@ void Bitmap::putDib(int x, int y, int32 *palette) {
 		putDibCB(palette);
 }
 
-void Bitmap::putDibRB(int32 *palette) {
+bool Bitmap::putDibRB(int32 *palette, int pX, int pY) {
 	uint16 *curDestPtr;
 	int endy;
 	int x;
@@ -706,7 +706,7 @@ void Bitmap::putDibRB(int32 *palette) {
 	uint16 *srcPtr2;
 	uint16 *srcPtr;
 
-	if (!palette)
+	if (!palette && pX == -1)
 		error("Bitmap::putDibRB(): Both global and local palettes are empty");
 
 	debug(8, "Bitmap::putDibRB()");
@@ -715,13 +715,15 @@ void Bitmap::putDibRB(int32 *palette) {
 	endy = _height + _y - 1;
 
 	if (_x > 799 || endx < 0 || _y > 599 || endy < 0)
-		return;
+		return false;
 
-	if (endy > 599)
-		endy = 599;
+	if (pX == -1) {
+		if (endy > 599)
+			endy = 599;
 
-	if (endx > 799)
-		endx = 799;
+		if (endx > 799)
+			endx = 799;
+	}
 
 	int startx = _x;
 	if (startx < 0)
@@ -773,10 +775,14 @@ void Bitmap::putDibRB(int32 *palette) {
 				if (fillLen > 0 || start1 >= 0) {
 					if (x <= 799 + 1 || (fillLen += 799 - x + 1, fillLen > 0)) {
 						if (y <= endy) {
-							curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
-
-							int bgcolor = palette[(pixel >> 8) & 0xff];
-							colorFill(curDestPtr, fillLen, bgcolor);
+							if (pX == -1) {
+								int bgcolor = palette[(pixel >> 8) & 0xff];
+								curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
+								colorFill(curDestPtr, fillLen, bgcolor);
+							} else {
+								if (y == pY && pX >= start1 && pX < start1 + fillLen)
+									return true;
+							}
 						}
 					}
 				}
@@ -801,14 +807,22 @@ void Bitmap::putDibRB(int32 *palette) {
 				}
 
 				if (y <= endy) {
-					curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
-					paletteFill(curDestPtr, (byte *)srcPtr2, fillLen, (int32 *)palette);
+					if (pX == -1) {
+						curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
+						paletteFill(curDestPtr, (byte *)srcPtr2, fillLen, (int32 *)palette);
+					} else {
+						if (y == pY && pX >= start1 && pX < start1 + fillLen)
+							return true;
+					}
 				}
 			}
 		}
 	}
 
-	g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
+	if (pX == -1)
+		g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
+
+	return false;
 }
 
 void Bitmap::putDibCB(int32 *palette) {
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index ccfc72f..f4b13d6 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -45,7 +45,7 @@ struct Bitmap {
 
 	void load(Common::ReadStream *s);
 	void putDib(int x, int y, int32 *palette);
-	void putDibRB(int32 *palette);
+	bool putDibRB(int32 *palette, int x = -1, int y = -1);
 	void putDibCB(int32 *palette);
 
 	void colorFill(uint16 *dest, int len, int color);
@@ -63,7 +63,7 @@ struct Bitmap {
 	void drawRotated(int x, int y, int angle, byte *palette);
 
 	bool isPixelHitAtPos(int x, int y);
-	bool decompressRle2(Bitmap *res);
+	bool isPixelAtHitPosRB(int x, int y);
 };
 
 class Picture : public MemoryObject {


Commit: 6b242c0f9f02332697d36c6706df86cd674408ed
    https://github.com/scummvm/scummvm/commit/6b242c0f9f02332697d36c6706df86cd674408ed
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:25-07:00

Commit Message:
FULLPIPE: Implement GameObject::canInteractAny()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/interaction.cpp
    engines/fullpipe/interaction.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/utils.cpp
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index a382033..1cb6b85 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -26,6 +26,8 @@
 #include "fullpipe/gfx.h"
 #include "fullpipe/statics.h"
 #include "fullpipe/scene.h"
+#include "fullpipe/interaction.h"
+#include "fullpipe/gameloader.h"
 
 #include "common/memstream.h"
 
@@ -147,6 +149,7 @@ PictureObject::PictureObject() {
 	_ox2 = 0;
 	_oy2 = 0;
 	_pictureObject2List = 0;
+	_objtype = kObjTypePictureObject;
 }
 
 PictureObject::PictureObject(PictureObject *src) : GameObject(src) {
@@ -154,6 +157,7 @@ PictureObject::PictureObject(PictureObject *src) : GameObject(src) {
 	_ox2 = _ox;
 	_oy2 = _oy;
 	_pictureObject2List = src->_pictureObject2List;
+	_objtype = kObjTypePictureObject;
 }
 
 bool PictureObject::load(MfcArchive &file, bool bigPicture) {
@@ -339,8 +343,25 @@ void GameObject::renumPictures(CPtrList *lst) {
 	free(buf);
 }
 
-bool GameObject::canInteractAny(GameObject *obj2, int a3) {
-	warning("STUB: GameObject::canInteractAny()");
+bool GameObject::canInteractAny(GameObject *obj2, int invId) {
+	int sceneId = 0;
+
+	if (g_fullpipe->_currentScene)
+		sceneId = g_fullpipe->_currentScene->_sceneId;
+
+	CInteractionController *intC = getGameLoaderInteractionController();
+	for (CObList::iterator i = intC->_interactions.begin(); i != intC->_interactions.end(); ++i) {
+		CInteraction *intr = (CInteraction *)*i;
+
+		if (intr->_sceneId > 0 && intr->_sceneId != sceneId)
+			break;
+
+		if (invId == -3) {
+			invId = getGameLoaderInventory()->getSelectedItemId();
+		}
+		if (intr->canInteract(this, obj2, invId))
+			return true;
+	}
 	return false;
 }
 
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index f4b13d6..d09a589 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -142,7 +142,7 @@ class GameObject : public CObject {
 	void clearFlags() { _flags = 0; }
 	const char *getName() { return _objectName; }
 
-	bool canInteractAny(GameObject *obj2, int a3);
+	bool canInteractAny(GameObject *obj2, int invId);
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index b25a209..53dc50f 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -37,8 +37,42 @@ bool CInteractionController::load(MfcArchive &file) {
 	return _interactions.load(file);
 }
 
+int static_compSceneId = 0;
+
+bool CInteractionController::compareInteractions(const void *p1, const void *p2) {
+	CInteraction *i1 = (CInteraction *)p1;
+	CInteraction *i2 = (CInteraction *)p2;
+
+	if ( i2->_sceneId < i1->_sceneId) {
+		if ( i1->_sceneId != static_compSceneId)
+			return false;
+	}
+	if (i2->_sceneId != i1->_sceneId) {
+		if (i1->_sceneId > 0 && i2->_sceneId == static_compSceneId)
+			return false;
+		if (i2->_sceneId != i1->_sceneId)
+			return true;
+	}
+	if (i2->_objectId3 == -1)
+		goto LABEL_17;
+	if (i2->_objectId3 == -2)
+		goto LABEL_18;
+	if (i1->_objectId3 != -1 && i1->_objectId3 != -2) {
+LABEL_17:
+		if (i2->_objectId3 != -2 )
+			return true;
+LABEL_18:
+		if (i1->_objectId3 != -1)
+			return true;
+	}
+
+	return false;
+}
+
 void CInteractionController::sortInteractions(int sceneId) {
-	warning("STUB: CInteractionController::sortInteractions(%d)", sceneId);
+	static_compSceneId = sceneId;
+
+	Common::sort(_interactions.begin(), _interactions.end(), CInteractionController::compareInteractions);
 }
 
 int CInteractionController::handleInteraction(GameObject *subject, GameObject *object, int invId) {
@@ -85,6 +119,11 @@ bool CInteraction::load(MfcArchive &file) {
 	return true;
 }
 
+bool CInteraction::canInteract(GameObject *obj1, GameObject *obj2, int invId) {
+	warning("STUB: CInteraction::canInteract()");
+	return true;
+}
+
 bool EntranceInfo::load(MfcArchive &file) {
 	debug(5, "EntranceInfo::load()");
 
diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
index a0bd54b..b336641 100644
--- a/engines/fullpipe/interaction.h
+++ b/engines/fullpipe/interaction.h
@@ -34,6 +34,7 @@ class StaticANIObject;
 int handleObjectInteraction(GameObject *subject, GameObject *object, int invId);
 
 class CInteraction : public CObject {
+ public:
 	int16 _objectId1;
 	int16 _objectId2;
 	int16 _objectId3;
@@ -52,6 +53,7 @@ class CInteraction : public CObject {
  public:
 	CInteraction();
 	virtual bool load(MfcArchive &file);
+	bool canInteract(GameObject *obj1, GameObject *obj2, int invId);
 };
 
 class CInteractionController : public CObject {
@@ -60,6 +62,9 @@ class CInteractionController : public CObject {
 	int16 _field_20;
 	bool _flag24;
 
+ private:
+	static bool compareInteractions(const void *p1, const void *p2);
+
  public:
 	CInteractionController() : _field_20(0), _flag24(true) {}
 
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index c54c6df..08e8482 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -102,6 +102,7 @@ StaticANIObject::StaticANIObject() {
 	_field_32 = 0;
 	_field_96 = 0;
 	_messageNum = 0;
+	_objtype = kObjTypeStaticANIObject;
 }
 
 StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
@@ -121,6 +122,7 @@ StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
 	_sceneId = src->_sceneId;
 	_callback1 = src->_callback1;
 	_callback2 = src->_callback2;
+	_objtype = kObjTypeStaticANIObject;
 
 	for (uint i = 0; i < src->_staticsList.size(); i++)
 		_staticsList.push_back(new Statics((Statics *)src->_staticsList[i], 0));
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index fb777cc..ee73aea 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -54,7 +54,7 @@ bool CObList::load(MfcArchive &file) {
 		debug(9, "CObList::[%d]", i);
 		CObject *t = file.readClass();
 
-		push_back(*t);
+		push_back(t);
 	}
 
 	return true;
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 9ebbe88..f828a21 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -66,7 +66,9 @@ class MfcArchive : public Common::SeekableReadStream {
 
 enum ObjType {
 	kObjTypeDefault,
-	kObjTypeObjstateCommand
+	kObjTypeObjstateCommand,
+	kObjTypeStaticANIObject,
+	kObjTypePictureObject
 };
 
 class CObject {
@@ -80,7 +82,7 @@ class CObject {
 	bool loadFile(const char *fname);
 };
 
-class CObList : public Common::List<CObject>, public CObject {
+class CObList : public Common::List<CObject *>, public CObject {
  public:
 	virtual bool load(MfcArchive &file);
 };


Commit: 39e126f3c42b6326cb7b42759dc60289f7d2ff97
    https://github.com/scummvm/scummvm/commit/39e126f3c42b6326cb7b42759dc60289f7d2ff97
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:51:26-07:00

Commit Message:
FULLPIPE: Implement CInteraction::canInteract()

Changed paths:
    engines/fullpipe/interaction.cpp



diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index 53dc50f..b3cdeba 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -24,6 +24,7 @@
 
 #include "fullpipe/interaction.h"
 #include "fullpipe/gameloader.h"
+#include "fullpipe/statics.h"
 
 namespace Fullpipe {
 
@@ -120,7 +121,58 @@ bool CInteraction::load(MfcArchive &file) {
 }
 
 bool CInteraction::canInteract(GameObject *obj1, GameObject *obj2, int invId) {
-	warning("STUB: CInteraction::canInteract()");
+	if (_sceneId > 0 && g_fullpipe->_currentScene && g_fullpipe->_currentScene->_sceneId != _sceneId)
+		return false;
+
+	if (_flags & 0x20000)
+		return false;
+
+	if (!obj2)
+		return false;
+	if (obj2->_id != _objectId1)
+		return false;
+
+	if ((_flags & 8) && (_flags & 1)) {
+		if (!obj2->_objtype != kObjTypeStaticANIObject)
+			return false;
+
+		StaticANIObject *st = (StaticANIObject *)obj2;
+
+		if (!st->_statics)
+			return false;
+
+		if (st->_statics->_staticsId != _staticsId1) {
+			if (_staticsId1)
+				return false;
+		}
+	}
+
+	if ((_objectId3 != invId && _objectId3 != -1 && _objectId3 != -2) || (!invId && _objectId3 == -2))
+		return false;
+
+	if (_objectState1) {
+		if (_flags & 0x10) {
+			if ((g_fullpipe->getObjectState(obj1->getName()) & _objectState1) == 0)
+				return false;
+		} else {
+			if (g_fullpipe->getObjectState(obj1->getName()) != _objectState1)
+				return false;
+		}
+	}
+
+	if (_objectState2) {
+		if (_flags & 0x10) {
+			if ((g_fullpipe->getObjectState(obj2->getName()) & _objectState2) == 0)
+				return false;
+		} else {
+			if (g_fullpipe->getObjectState(obj2->getName()) != _objectState2)
+				return false;
+		}
+	}
+
+	if (_objectId2 && (!obj1 || _objectId2 != obj1->_id))
+		return false;
+
 	return true;
 }
 


Commit: 8b885d4c7e662699e7377e0cadb48ebf7f177d0d
    https://github.com/scummvm/scummvm/commit/8b885d4c7e662699e7377e0cadb48ebf7f177d0d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:56:29-07:00

Commit Message:
FULLPIPE: Make engine conditionally compilable as dynamic plugin

Changed paths:
    engines/fullpipe/module.mk



diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 41ed3e3..380f582 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -23,7 +23,7 @@ MODULE_OBJS = \
 	utils.o
 
 # This module can be built as a plugin
-ifdef BUILD_PLUGINS
+ifeq ($(ENABLE_FULLPIPE), DYNAMIC_PLUGIN)
 PLUGIN := 1
 endif
 


Commit: 0f1cc868966bc6f6bcd135a3b0b79fbab0d4edbe
    https://github.com/scummvm/scummvm/commit/0f1cc868966bc6f6bcd135a3b0b79fbab0d4edbe
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T04:57:49-07:00

Commit Message:
FULLPIPE: Use consistent include guard

Changed paths:
    engines/fullpipe/fullpipe.h



diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 5b0ea44..5d9bdcc 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -20,8 +20,8 @@
  *
  */
 
-#ifndef FULLPIPE_H
-#define FULLPIPE_H
+#ifndef FULLPIPE_FULLPIPE_H
+#define FULLPIPE_FULLPIPE_H
 
 #include "common/scummsys.h"
 #include "common/events.h"
@@ -238,4 +238,4 @@ extern Vars *g_vars;
 
 } // End of namespace Fullpipe
 
-#endif /* FULLPIPE_H */
+#endif /* FULLPIPE_FULLPIPE_H */


Commit: 7c8570d4990b4ac56048399df31b116e9fe14808
    https://github.com/scummvm/scummvm/commit/7c8570d4990b4ac56048399df31b116e9fe14808
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:25:53-07:00

Commit Message:
FULLPIPE: Remove unused class

Changed paths:
    engines/fullpipe/utils.h



diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index f828a21..76a1ae9 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -144,12 +144,6 @@ class CDWordArray : public Common::Array<int32>, public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-struct CNode {
-	CNode *pNext;
-	CNode *pPrev;
-	void *data;
-};
-
 typedef Common::Array<void *> CPtrList;
 
 char *genFileName(int superId, int sceneId, const char *ext);


Commit: 1ed2069f86ce94e91232962fa6958d0bc5ba70c9
    https://github.com/scummvm/scummvm/commit/1ed2069f86ce94e91232962fa6958d0bc5ba70c9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:36:02-07:00

Commit Message:
FULLPIPE: Inherit GlobalMessageQueueList from Common::Array

Changed paths:
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h



diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index c24dee4..e4dfcf5 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -446,9 +446,9 @@ void MessageQueue::replaceKeyCode(int key1, int key2) {
 }
 
 MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
-	for (CPtrList::iterator s = begin(); s != end(); ++s) {
-		if (((MessageQueue *)*s)->_id == id)
-			return (MessageQueue *)*s;
+	for (Common::Array<MessageQueue *>::iterator s = begin(); s != end(); ++s) {
+		if ((*s)->_id == id)
+			return *s;
 	}
 
 	return 0;
@@ -456,7 +456,7 @@ MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
 
 void GlobalMessageQueueList::deleteQueueById(int id) {
 	for (uint i = 0; i < size(); i++)
-		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
+		if (_storage[i]->_id == id) {
 			remove_at(i);
 
 			disableQueueById(id);
@@ -466,8 +466,8 @@ void GlobalMessageQueueList::deleteQueueById(int id) {
 
 void GlobalMessageQueueList::removeQueueById(int id) {
 	for (uint i = 0; i < size(); i++)
-		if (((MessageQueue *)((*this).operator[](i)))->_id == id) {
-			((MessageQueue *)((*this).operator[](i)))->_flags &= 0xFD; // It is quite pointless
+		if (_storage[i]->_id == id) {
+			_storage[i]->_flags &= 0xFD; // It is quite pointless
 			remove_at(i);
 
 			disableQueueById(id);
@@ -476,16 +476,16 @@ void GlobalMessageQueueList::removeQueueById(int id) {
 }
 
 void GlobalMessageQueueList::disableQueueById(int id) {
-	for (CPtrList::iterator s = begin(); s != end(); ++s) {
-		if (((MessageQueue *)*s)->_parId == id)
-			((MessageQueue *)*s)->_parId = 0;
+	for (Common::Array<MessageQueue *>::iterator s = begin(); s != end(); ++s) {
+		if ((*s)->_parId == id)
+			(*s)->_parId = 0;
 	}
 }
 
 int GlobalMessageQueueList::compact() {
 	for (uint i = 0; i < size();) {
-		if (((MessageQueue *)((*this).operator[](i)))->_isFinished) {
-			disableQueueById(((MessageQueue *)((*this).operator[](i)))->_id);
+		if (((MessageQueue *)_storage[i])->_isFinished) {
+			disableQueueById(_storage[i]->_id);
 			remove_at(i);
 		} else {
 			i++;
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 3611ae0..6764325 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -135,7 +135,7 @@ class MessageQueue : public CObject {
 	bool checkGlobalExCommandList2();
 };
 
-class GlobalMessageQueueList : public CPtrList {
+class GlobalMessageQueueList : public Common::Array<MessageQueue *> {
   public:
 	MessageQueue *getMessageQueueById(int id);
 	void deleteQueueById(int id);


Commit: e672452462efed37c244b38210a958858ca156cd
    https://github.com/scummvm/scummvm/commit/e672452462efed37c244b38210a958858ca156cd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:37:57-07:00

Commit Message:
FULLPIPE: Added guard #define

Changed paths:
    engines/fullpipe/objectnames.h



diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
index 3eaaf70..015df72 100644
--- a/engines/fullpipe/objectnames.h
+++ b/engines/fullpipe/objectnames.h
@@ -22,6 +22,11 @@
 
 // This file is used in order to avoid usage of constants in Russian accross the code
 
+#ifndef FULLPIPE_OBJECTNAMES_H
+#define FULLPIPE_OBJECTNAMES_H
+
+namespace Fullpipe {
+
 #define sO_Grandma "\xc1\xe0\xe1\xf3\xeb\xff"	// "Бабуля"
 #define sO_Jar_4 "\xc1\xe0\xed\xea\xe0_4"	// "Банка_4"
 #define sO_Pool "\xc1\xe0\xf1\xf1\xe5\xe9\xed"	// "Бассейн"
@@ -239,3 +244,7 @@
 #define sO_Egg1 "\xdf\xe9\xf6\xee\x31"	// "Яйцо1"
 #define sO_Egg2 "\xdf\xe9\xf6\xee\x32"	// "Яйцо2"
 #define sO_Egg3 "\xdf\xe9\xf6\xee\x33"	// "Яйцо3"
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_OBJECTNAMES_H */


Commit: f7d10b5b8f08d2b13db0c1db8263ac4f67433c86
    https://github.com/scummvm/scummvm/commit/f7d10b5b8f08d2b13db0c1db8263ac4f67433c86
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:40:41-07:00

Commit Message:
FULLPIPE: Turn Sc2Array into typedef

Changed paths:
    engines/fullpipe/objects.h



diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index dd1545f..55686ac 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -86,8 +86,7 @@ class Sc2 : public CObject {
 	virtual bool load(MfcArchive &file);
 };
 
-class Sc2Array : public Common::Array<Sc2> {
-};
+typedef Common::Array<Sc2> Sc2Array;
 
 union VarValue {
 	float floatValue;


Commit: a5800dfe1a34f040d6cef9d0b7a8d7213ebafe5e
    https://github.com/scummvm/scummvm/commit/a5800dfe1a34f040d6cef9d0b7a8d7213ebafe5e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:49:13-07:00

Commit Message:
FULLPIPE: Fixed compiler warning

Changed paths:
    engines/fullpipe/gfx.cpp



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 1cb6b85..5f77f76 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -676,7 +676,7 @@ bool Bitmap::isPixelHitAtPos(int x, int y) {
 	if (_flags & 0x1000000) {
 		switch (_type) {
 		case 'CB\0\0':
-			if (_pixels[off] == _flags & 0xff)
+			if (_pixels[off] == (_flags & 0xff))
 				return false;
 			break;
 		case 'CB\x05e':


Commit: 0b88635ef44998d6594b70f71163adb6f950ed76
    https://github.com/scummvm/scummvm/commit/0b88635ef44998d6594b70f71163adb6f950ed76
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:50:49-07:00

Commit Message:
FULLPIPE: Fix const'ness

Changed paths:
    engines/fullpipe/interaction.cpp



diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index b3cdeba..9b480df 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -41,8 +41,8 @@ bool CInteractionController::load(MfcArchive &file) {
 int static_compSceneId = 0;
 
 bool CInteractionController::compareInteractions(const void *p1, const void *p2) {
-	CInteraction *i1 = (CInteraction *)p1;
-	CInteraction *i2 = (CInteraction *)p2;
+	const CInteraction *i1 = (const CInteraction *)p1;
+	const CInteraction *i2 = (const CInteraction *)p2;
 
 	if ( i2->_sceneId < i1->_sceneId) {
 		if ( i1->_sceneId != static_compSceneId)


Commit: c55862a378f3c8d76fcfafaad1c2e993e663da46
    https://github.com/scummvm/scummvm/commit/c55862a378f3c8d76fcfafaad1c2e993e663da46
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:51:36-07:00

Commit Message:
FULLPIPE: Fix const'ness

Changed paths:
    engines/fullpipe/scene.cpp



diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index 66e5ee3..18d6a88 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -435,7 +435,7 @@ void Scene::initObjectCursors(const char *varname) {
 }
 
 bool Scene::compareObjPriority(const void *p1, const void *p2) {
-	if (((StaticANIObject *)p1)->_priority > ((StaticANIObject *)p2)->_priority)
+	if (((const StaticANIObject *)p1)->_priority > ((const StaticANIObject *)p2)->_priority)
 		return true;
 
 	return false;


Commit: af91d2a5ce61f395b207854e589ae917c623818f
    https://github.com/scummvm/scummvm/commit/af91d2a5ce61f395b207854e589ae917c623818f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T05:58:05-07:00

Commit Message:
FULLPIPE: Whitespace fix

Changed paths:
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/input.cpp
    engines/fullpipe/interaction.cpp
    engines/fullpipe/inventory.cpp
    engines/fullpipe/modal.cpp
    engines/fullpipe/statics.cpp



diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index a91065f..f48c407 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -170,7 +170,7 @@ bool CGameLoader::gotoScene(int sceneId, int entranceId) {
 		return true;
 	}
 
-	if (_sc2array[sc2idx]._entranceDataCount <= 0 )
+	if (_sc2array[sc2idx]._entranceDataCount <= 0)
 		return false;
 
 	int entranceIdx;
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 5f77f76..c46bdfa 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -633,7 +633,7 @@ bool Picture::isPixelHitAtPos(int x, int y) {
 	if (x < _x || y < _y || x >= _x + _width || y >= _y + _height)
 		return false;
 
-	if (!_bitmap )
+	if (!_bitmap)
 		init();
 
 	_bitmap->_x = _x;
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index eb528f0..f71a524 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -202,7 +202,7 @@ void FullpipeEngine::updateCursorsCommon() {
 			_cursorId = PIC_CSR_GOFAR_R;
 			return;
 		}
-		if (_mouseVirtX - _sceneRect.left < 47 && _sceneRect.left > 0 ) {
+		if (_mouseVirtX - _sceneRect.left < 47 && _sceneRect.left > 0) {
 			_cursorId = PIC_CSR_GOFAR_L;
 			return;
 		}
diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index 9b480df..a5977c0 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -44,8 +44,8 @@ bool CInteractionController::compareInteractions(const void *p1, const void *p2)
 	const CInteraction *i1 = (const CInteraction *)p1;
 	const CInteraction *i2 = (const CInteraction *)p2;
 
-	if ( i2->_sceneId < i1->_sceneId) {
-		if ( i1->_sceneId != static_compSceneId)
+	if (i2->_sceneId < i1->_sceneId) {
+		if (i1->_sceneId != static_compSceneId)
 			return false;
 	}
 	if (i2->_sceneId != i1->_sceneId) {
@@ -60,7 +60,7 @@ bool CInteractionController::compareInteractions(const void *p1, const void *p2)
 		goto LABEL_18;
 	if (i1->_objectId3 != -1 && i1->_objectId3 != -2) {
 LABEL_17:
-		if (i2->_objectId3 != -2 )
+		if (i2->_objectId3 != -2)
 			return true;
 LABEL_18:
 		if (i1->_objectId3 != -1)
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 41940f4..1abd369 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -386,7 +386,7 @@ bool CInventory2::unselectItem(bool flag) {
 int CInventory2::getHoveredItem(Common::Point *point) {
 	int selId = getSelectedItemId();
 
-	if (point->y <= 20 && !_isInventoryOut && !_isLocked )
+	if (point->y <= 20 && !_isInventoryOut && !_isLocked)
 		slideOut();
 
 	if (!selId && point->y >= 55) {
diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp
index f7bc633..6f1bc0c 100644
--- a/engines/fullpipe/modal.cpp
+++ b/engines/fullpipe/modal.cpp
@@ -75,7 +75,7 @@ bool CModalIntro::handleMessage(ExCommand *message) {
 	if (message->_messageNum != 36)
 		return false;
 
-	if (message->_keyCode != 13 && message->_keyCode != 27 && message->_keyCode != 32 )
+	if (message->_keyCode != 13 && message->_keyCode != 27 && message->_keyCode != 32)
 		return false;
 
 	if (_needRedraw) {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 08e8482..7f08310 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -256,7 +256,7 @@ void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
 }
 
 MessageQueue *StaticANIObject::getMessageQueue() {
-	if (this->_messageQueueId <= 0 )
+	if (this->_messageQueueId <= 0)
 		return 0;
 
 	return g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
@@ -1389,7 +1389,7 @@ void Movement::loadPixelData() {
 		mov = i;
 
 	for (uint i = 0; i < _dynamicPhases.size(); i++) {
-		if ((Statics *)_dynamicPhases[i] != mov->_staticsObj2 || !(mov->_staticsObj2->_staticsId & 0x4000) )
+		if ((Statics *)_dynamicPhases[i] != mov->_staticsObj2 || !(mov->_staticsObj2->_staticsId & 0x4000))
 			((Statics *)_dynamicPhases[i])->getPixelData();
 	}
 


Commit: 6226b5862d2d3800a88985ed83946ea9e941a556
    https://github.com/scummvm/scummvm/commit/6226b5862d2d3800a88985ed83946ea9e941a556
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T06:17:37-07:00

Commit Message:
FULLPIPE: Replace goto usage

Changed paths:
    engines/fullpipe/interaction.cpp



diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index a5977c0..231fe57 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -55,19 +55,15 @@ bool CInteractionController::compareInteractions(const void *p1, const void *p2)
 			return true;
 	}
 	if (i2->_objectId3 == -1)
-		goto LABEL_17;
-	if (i2->_objectId3 == -2)
-		goto LABEL_18;
-	if (i1->_objectId3 != -1 && i1->_objectId3 != -2) {
-LABEL_17:
-		if (i2->_objectId3 != -2)
-			return true;
-LABEL_18:
-		if (i1->_objectId3 != -1)
-			return true;
-	}
+		return true;
+
+	if (i1->_objectId3 == i2->_objectId3)
+		return true;
 
-	return false;
+	if (i1->_objectId3 == -1 || i1->_objectId3 == -2)
+		return false;
+
+	return true;
 }
 
 void CInteractionController::sortInteractions(int sceneId) {


Commit: ec650efb477d9b5df159d37a6b16d628166bab9c
    https://github.com/scummvm/scummvm/commit/ec650efb477d9b5df159d37a6b16d628166bab9c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-06T11:40:02-07:00

Commit Message:
FULLPIPE: Fix mouse event handling

Changed paths:
    engines/fullpipe/fullpipe.cpp



diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index bc8a4ae..11808e9 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -279,7 +279,7 @@ void FullpipeEngine::updateEvents() {
 			break;
 		case Common::EVENT_MOUSEMOVE:
 			if (_recordEvents) {
-				ex = new ExCommand(0, 17, 31, event.mouse.x, event.mouse.x, 0, 1, 0, 0, 0);
+				ex = new ExCommand(0, 17, 31, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0);
 				ex->_excFlags |= 3;
 				ex->handle();
 			}
@@ -291,7 +291,7 @@ void FullpipeEngine::updateEvents() {
 			break;
 			case Common::EVENT_RBUTTONDOWN:
 			if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) {
-				ex = new ExCommand(0, 17, 107, event.mouse.x, event.mouse.x, 0, 1, 0, 0, 0);
+				ex = new ExCommand(0, 17, 107, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0);
 				ex->_excFlags |= 3;
 				_lastInputTicks = _updateTicks;
 				ex->handle();
@@ -299,7 +299,7 @@ void FullpipeEngine::updateEvents() {
 			break;
 		case Common::EVENT_LBUTTONDOWN:
 			if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) {
-				ex = new ExCommand(0, 17, 29, event.mouse.x, event.mouse.x, 0, 1, 0, 0, 0);
+				ex = new ExCommand(0, 17, 29, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0);
 
 				ex->_sceneClickX = _sceneRect.left + ex->_x;
 				ex->_sceneClickY = _sceneRect.top + ex->_y;


Commit: 940c686858d9a0bf92c1473b9a81653a9937b88a
    https://github.com/scummvm/scummvm/commit/940c686858d9a0bf92c1473b9a81653a9937b88a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-07T12:57:56-07:00

Commit Message:
FULLPIPE: Implement CInteraction::isOverlapping()

Changed paths:
    engines/fullpipe/interaction.cpp
    engines/fullpipe/interaction.h



diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index 231fe57..f9ea41b 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -72,10 +72,8 @@ void CInteractionController::sortInteractions(int sceneId) {
 	Common::sort(_interactions.begin(), _interactions.end(), CInteractionController::compareInteractions);
 }
 
-int CInteractionController::handleInteraction(GameObject *subject, GameObject *object, int invId) {
-	warning("STUB: CInteractionController::handleInteraction()");
-
-	return 0;
+bool CInteractionController::handleInteraction(GameObject *subj, GameObject *obj, int invId) {
+	return true;
 }
 
 CInteraction::CInteraction() {
@@ -172,6 +170,17 @@ bool CInteraction::canInteract(GameObject *obj1, GameObject *obj2, int invId) {
 	return true;
 }
 
+bool CInteraction::isOverlapping(StaticANIObject *subj, StaticANIObject *obj) {
+	if (abs(_xOffs + obj->_ox - subj->_ox) <= 1
+		&& abs(obj->_oy + _yOffs - subj->_oy) <= 1) {
+		if (!this->_staticsId2 || subj->_statics != 0 && subj->_statics->_staticsId == _staticsId2) {
+			if (!_staticsId1 || !(_flags & 1) || obj->_statics != 0 && obj->_statics->_staticsId == _staticsId1)
+				return true;
+		}
+	}
+	return false;
+}
+
 bool EntranceInfo::load(MfcArchive &file) {
 	debug(5, "EntranceInfo::load()");
 
diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
index b336641..d5ea5ea 100644
--- a/engines/fullpipe/interaction.h
+++ b/engines/fullpipe/interaction.h
@@ -54,6 +54,7 @@ class CInteraction : public CObject {
 	CInteraction();
 	virtual bool load(MfcArchive &file);
 	bool canInteract(GameObject *obj1, GameObject *obj2, int invId);
+	bool isOverlapping(StaticANIObject *subj, StaticANIObject *obj);
 };
 
 class CInteractionController : public CObject {
@@ -75,7 +76,7 @@ class CInteractionController : public CObject {
 
 	void sortInteractions(int sceneId);
 
-	int handleInteraction(GameObject *subject, GameObject *object, int invId);
+	bool handleInteraction(GameObject *subj, GameObject *obj, int invId);
 };
 
 struct EntranceInfo {


Commit: 747e70a38ebd08450714fdb01dd45139ac9504a1
    https://github.com/scummvm/scummvm/commit/747e70a38ebd08450714fdb01dd45139ac9504a1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-08T13:56:04-07:00

Commit Message:
FULLPIPE: Implement CInteractionController::handleInteraction()

Changed paths:
    engines/fullpipe/gfx.cpp
    engines/fullpipe/gfx.h
    engines/fullpipe/interaction.cpp
    engines/fullpipe/interaction.h
    engines/fullpipe/messages.cpp
    engines/fullpipe/messages.h
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h



diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index c46bdfa..c6024d1 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -365,6 +365,95 @@ bool GameObject::canInteractAny(GameObject *obj2, int invId) {
 	return false;
 }
 
+bool GameObject::getPicAniInfo(PicAniInfo *info) {
+	if (_objtype == kObjTypePictureObject) {
+		info->type = 2;
+		info->objectId = _id;
+		info->sceneId = 0;
+		info->field_8 = _okeyCode;
+		info->flags = _flags;
+		info->field_24 = _field_8;
+		info->ox = _ox;
+		info->oy = _oy;
+		info->priority = _priority;
+
+		return true;
+	}
+
+	if (_objtype == kObjTypeStaticANIObject) {
+		StaticANIObject *ani = (StaticANIObject *)this;
+
+		info->type = (ani->_messageQueueId << 16) | 1;
+		info->objectId = ani->_id;
+		info->field_8 = ani->_okeyCode;
+		info->sceneId = ani->_sceneId;
+		info->flags = ani->_flags;
+		info->field_24 = ani->_field_8;
+		if (ani->_movement) {
+			info->ox = ani->_movement->_ox;
+			info->oy = ani->_movement->_oy;
+		} else {
+			info->ox = ani->_ox;
+			info->oy = ani->_oy;
+		}
+		info->priority = ani->_priority;
+
+		if (ani->_statics)
+			info->staticsId = ani->_statics->_staticsId;
+
+		if (ani->_movement) {
+			info->movementId = ani->_movement->_id;
+			info->dynamicPhaseIndex = ani->_movement->_currDynamicPhaseIndex;
+		}
+
+		info->someDynamicPhaseIndex = ani->_someDynamicPhaseIndex;
+
+		return true;
+	}
+
+	return false;
+}
+
+bool GameObject::setPicAniInfo(PicAniInfo *picAniInfo) {
+	if (!(picAniInfo->type & 3)) {
+		warning("StaticANIObject::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
+
+		return false;
+	}
+
+	if (picAniInfo->type & 3) {
+		setOXY(picAniInfo->ox, picAniInfo->oy);
+		_priority = picAniInfo->priority;
+		_okeyCode = picAniInfo->field_8;
+		setFlags(picAniInfo->flags);
+		_field_8 = picAniInfo->field_24;
+	}
+
+	if (picAniInfo->type & 1) {
+		StaticANIObject *ani = (StaticANIObject *)this;
+
+		ani->_messageQueueId = (picAniInfo->type >> 16) & 0xffff;
+
+		if (picAniInfo->staticsId) {
+			ani->_statics = ani->getStaticsById(picAniInfo->staticsId);
+		} else {
+			ani->_statics = 0;
+		}
+
+		if (picAniInfo->movementId) {
+			ani->_movement = ani->getMovementById(picAniInfo->movementId);
+			if (ani->_movement)
+				ani->_movement->setDynamicPhaseIndex(picAniInfo->dynamicPhaseIndex);
+		} else {
+			ani->_movement = 0;
+		}
+
+		ani->setSomeDynamicPhaseIndex(picAniInfo->someDynamicPhaseIndex);
+	}
+
+	return true;
+}
+
 Picture::Picture() {
 	_x = 0;
 	_y = 0;
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index d09a589..10b82ef 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -143,6 +143,8 @@ class GameObject : public CObject {
 	const char *getName() { return _objectName; }
 
 	bool canInteractAny(GameObject *obj2, int invId);
+	bool getPicAniInfo(PicAniInfo *info);
+	bool setPicAniInfo(PicAniInfo *info);
 };
 
 class PictureObject : public GameObject {
diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index f9ea41b..4153724 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -25,10 +25,11 @@
 #include "fullpipe/interaction.h"
 #include "fullpipe/gameloader.h"
 #include "fullpipe/statics.h"
+#include "fullpipe/motion.h"
 
 namespace Fullpipe {
 
-int handleObjectInteraction(GameObject *subject, GameObject *object, int invId) {
+int handleObjectInteraction(StaticANIObject *subject, GameObject *object, int invId) {
 	return getGameLoaderInteractionController()->handleInteraction(subject, object, invId);
 }
 
@@ -72,7 +73,303 @@ void CInteractionController::sortInteractions(int sceneId) {
 	Common::sort(_interactions.begin(), _interactions.end(), CInteractionController::compareInteractions);
 }
 
-bool CInteractionController::handleInteraction(GameObject *subj, GameObject *obj, int invId) {
+bool CInteractionController::handleInteraction(StaticANIObject *subj, GameObject *obj, int invId) {
+	if (subj) {
+		if (!subj->isIdle() || (subj->_flags & 0x100))
+			return false;
+	}
+
+	if (!_interactions.size())
+		return false;
+
+	CInteraction *inter = 0;
+	CInteraction *previnter = 0;
+	int dur = 0;
+	int mindur = 0xFFFF;
+
+	MessageQueue *mq;
+	ExCommand *ex;
+
+	for (CObList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) {
+		CInteraction *cinter = (CInteraction *)*i;
+
+		if (!cinter->canInteract(subj, obj, invId))
+			continue;
+
+		if ((inter || cinter->_objectId2) && (!obj || cinter->_objectId3 != obj->_id)) {
+			if (cinter->_messageQueue)
+				cinter->_messageQueue->calcDuration(subj);
+
+			PicAniInfo aniInfo;
+
+			obj->getPicAniInfo(&aniInfo);
+
+			if (cinter->_staticsId1) {
+				StaticANIObject *ani = (StaticANIObject *)obj;
+				ani->_messageQueueId = 0;
+				ani->changeStatics2(cinter->_staticsId1);
+			}
+			int xpos = cinter->_xOffs + obj->_ox;
+			int ypos = cinter->_yOffs + obj->_oy;
+
+			obj->setPicAniInfo(&aniInfo);
+
+			if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1) {
+				mq = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->method4C(subj, xpos, ypos, 1, cinter->_staticsId2);
+				if (mq) {
+					dur = mq->calcDuration(subj);
+					delete mq;
+				} else {
+					dur = 0x10000;
+				}
+				inter = previnter;
+			} else {
+				dur = 0;
+			}
+			if (dur < mindur) {
+				inter = cinter;
+				mindur = dur;
+				previnter = cinter;
+			}
+		} else {
+			inter = cinter;
+			break;
+		}
+	}
+
+	if (!inter)
+		return false;
+
+	if (!inter->_objectId2) {
+		StaticANIObject *ani = (StaticANIObject *)obj;
+
+		if (!ani->isIdle())
+			return false;
+
+		if (ani->_flags & 0x100)
+			return false;
+
+		if (!inter->_staticsId1 || !(inter->_flags & 1))
+			goto LABEL_38;
+
+		if (ani->_movement || ani->_statics == 0 || ani->_statics->_staticsId != inter->_staticsId1) {
+			mq = ani->changeStatics1(inter->_staticsId1);
+			if (!mq)
+				return false;
+
+			ex = new ExCommand((subj ? subj->_id : 0), 55, 0, 0, 0, 0, 1, 0, 0, 0);
+			ex->_x = obj->_id;
+			ex->_y = obj->_okeyCode;
+			ex->_keyCode = subj ? subj->_okeyCode : 0;
+			ex->_excFlags = 3;
+			ex->_field_14 = (obj->_objtype != kObjTypePictureObject);
+			ex->_field_20 = invId;
+			mq->_exCommands.push_back(ex);
+
+			if (mq->_isFinished) {
+				mq->_isFinished = 0;
+				ani->queueMessageQueue(mq);
+			}
+		} else {
+			if (ani->getMessageQueue())
+				ani->queueMessageQueue(0);
+LABEL_38:
+			if (inter->_messageQueue) {
+				mq = new MessageQueue(inter->_messageQueue, 0, 1);
+				mq->changeParam28ForObjectId(ani->_id, -1, ani->_okeyCode);
+
+				if (!mq->chain(0))
+					return false;
+			}
+		}
+		return true;
+	}
+
+	if (obj && !subj)
+		return true;
+
+	if (!obj || inter->_objectId3 == obj->_id) {
+		if (subj) {
+			if (inter->_messageQueue) {
+				if (subj->isIdle()) {
+					mq = new MessageQueue(inter->_messageQueue, 0, 1);
+
+					if (!mq->chain(subj)) {
+						if (mq)
+							delete mq;
+
+						return false;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	if (inter->isOverlapping(subj, obj)) {
+		if (obj->_objtype == kObjTypeStaticANIObject) {
+			StaticANIObject *ani = (StaticANIObject *)obj;
+
+			ani->queueMessageQueue(0);
+
+			if (inter->_staticsId1)
+				ani->changeStatics2(inter->_staticsId1);
+
+			if (!(inter->_flags & 0x10000))
+				obj->_flags |= 0x80;
+		}
+
+		if (!inter->_messageQueue)
+			return false;
+
+		subj->setOXY(inter->_xOffs + obj->_ox, inter->_yOffs + obj->_oy);
+
+		mq = new MessageQueue(inter->_messageQueue, 0, 1);
+		mq->changeParam28ForObjectId(obj->_id, -1, obj->_okeyCode);
+		mq->_flags |= 1;
+
+		if (!(inter->_flags & 0x10000)) {
+			ex = new ExCommand(obj->_id, 34, 0x80, 0, 0, 0, 1, 0, 0, 0);
+			ex->_keyCode = obj->_okeyCode;
+			ex->_field_14 = 0x100;
+			ex->_messageNum = 0;
+			ex->_excFlags = 3;
+			mq->_exCommands.push_back(ex);
+		}
+
+		ex = new ExCommand(obj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0);
+		ex->_keyCode = obj->_okeyCode;
+		ex->_field_14 = 0x100;
+		ex->_messageNum = 0;
+		ex->_excFlags = 3;
+		mq->_exCommands.push_back(ex);
+
+		ex = new ExCommand(subj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0);
+		ex->_keyCode = subj->_okeyCode;
+		ex->_field_14 = 0x100;
+		ex->_messageNum = 0;
+		ex->_excFlags = 3;
+		mq->_exCommands.push_back(ex);
+
+		ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0);
+		ex->_excFlags |= 3;
+		ex->_keyCode = 0;
+		mq->_exCommands.push_back(ex);
+
+		if (!mq->chain(subj)) {
+			delete mq;
+
+			return false;
+		}
+
+		subj->_flags |= 1;
+		obj->_flags |= 1;
+	} else {
+		bool someFlag = false;
+		PicAniInfo aniInfo;
+
+		obj->getPicAniInfo(&aniInfo);
+
+		if (obj->_objtype == kObjTypeStaticANIObject && inter->_staticsId1) {
+			StaticANIObject *ani = (StaticANIObject *)obj;
+
+			ani->_messageQueueId = 0;
+			ani->changeStatics2(inter->_staticsId1);
+		}
+
+		int xpos = inter->_yOffs + obj->_ox;
+		int ypos = inter->_yOffs + obj->_oy;
+
+		obj->setPicAniInfo(&aniInfo);
+
+		if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1
+				|| (inter->_staticsId2 != 0 && (subj->_statics == 0 || subj->_statics->_staticsId != inter->_staticsId2))) {
+			mq = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->method34(subj, xpos, ypos, 1, inter->_staticsId2);
+
+			if (!mq)
+				return false;
+
+			ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0);
+			ex->_x = obj->_id;
+			ex->_y = obj->_okeyCode;
+			ex->_keyCode = subj->_okeyCode;
+			ex->_excFlags = 3;
+			ex->_field_20 = invId;
+			ex->_field_14 = (obj->_objtype != kObjTypePictureObject);
+			mq->_exCommands.push_back(ex);
+
+			someFlag = true;
+
+			ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0);
+			ex->_x = xpos;
+			ex->_y = ypos;
+			ex->_excFlags |= 3;
+			ex->_keyCode = 6;
+			ex->_field_14 = obj->_id;
+			ex->_field_20 = obj->_okeyCode;
+			ex->postMessage();
+		}
+
+		if (!inter->_staticsId1 || !(inter->_flags & 1))
+			return true;
+
+		StaticANIObject *ani = (StaticANIObject *)obj;
+
+		if (!ani->isIdle())
+			return false;
+
+		if (ani->getMessageQueue())
+			ani->queueMessageQueue(0);
+
+		if (!ani->_statics || ani->_statics->_staticsId != inter->_staticsId1 || ani->_movement) {
+			mq = ani->changeStatics1(inter->_staticsId1);
+
+			if (!mq)
+				return false;
+
+			if (someFlag) {
+				if (!(inter->_flags & 0x10000)) {
+					if (mq->_isFinished) {
+						ani->_flags |= 0x80u;
+					} else {
+						ex = new ExCommand(ani->_id, 34, 0x80, 0, 0, 0, 1, 0, 0, 0);
+						ex->_field_14 = 0x80;
+						ex->_keyCode = ani->_okeyCode;
+						ex->_excFlags = 3;
+						mq->_exCommands.push_back(ex);
+					}
+				}
+				ex = new ExCommand(ani->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0);
+				ex->_keyCode = ani->_okeyCode;
+				ex->_field_14 = 0x100;
+				ex->_excFlags = 3;
+				mq->_exCommands.push_back(ex);
+			} else {
+				ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0);
+				ex->_x = ani->_id;
+				ex->_y = ani->_okeyCode;
+				ex->_keyCode = subj->_okeyCode;
+				ex->_excFlags = 2;
+				ex->_field_14 = (obj->_objtype != kObjTypePictureObject);
+				ex->_field_20 = invId;
+				mq->_exCommands.push_back(ex);
+
+				if (!mq->_isFinished)
+					return true;
+
+				mq->_isFinished = 0;
+				ani->queueMessageQueue(mq);
+			}
+		} else {
+			obj->_flags |= 1;
+
+			if (inter->_flags & 0x10000)
+				return true;
+
+			obj->_flags |= 0x80;
+		}
+	}
+
 	return true;
 }
 
@@ -170,11 +467,13 @@ bool CInteraction::canInteract(GameObject *obj1, GameObject *obj2, int invId) {
 	return true;
 }
 
-bool CInteraction::isOverlapping(StaticANIObject *subj, StaticANIObject *obj) {
+bool CInteraction::isOverlapping(StaticANIObject *subj, GameObject *obj) {
+	StaticANIObject *ani = (StaticANIObject *)obj;
+
 	if (abs(_xOffs + obj->_ox - subj->_ox) <= 1
 		&& abs(obj->_oy + _yOffs - subj->_oy) <= 1) {
-		if (!this->_staticsId2 || subj->_statics != 0 && subj->_statics->_staticsId == _staticsId2) {
-			if (!_staticsId1 || !(_flags & 1) || obj->_statics != 0 && obj->_statics->_staticsId == _staticsId1)
+		if (!_staticsId2 || subj->_statics != 0 && subj->_statics->_staticsId == _staticsId2) {
+			if (!_staticsId1 || !(_flags & 1) || ani->_statics != 0 && ani->_statics->_staticsId == _staticsId1)
 				return true;
 		}
 	}
diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
index d5ea5ea..e309033 100644
--- a/engines/fullpipe/interaction.h
+++ b/engines/fullpipe/interaction.h
@@ -31,7 +31,7 @@ class GameObject;
 class MessageQueue;
 class StaticANIObject;
 
-int handleObjectInteraction(GameObject *subject, GameObject *object, int invId);
+int handleObjectInteraction(StaticANIObject *subject, GameObject *object, int invId);
 
 class CInteraction : public CObject {
  public:
@@ -54,7 +54,7 @@ class CInteraction : public CObject {
 	CInteraction();
 	virtual bool load(MfcArchive &file);
 	bool canInteract(GameObject *obj1, GameObject *obj2, int invId);
-	bool isOverlapping(StaticANIObject *subj, StaticANIObject *obj);
+	bool isOverlapping(StaticANIObject *subj, GameObject *obj);
 };
 
 class CInteractionController : public CObject {
@@ -76,7 +76,7 @@ class CInteractionController : public CObject {
 
 	void sortInteractions(int sceneId);
 
-	bool handleInteraction(GameObject *subj, GameObject *obj, int invId);
+	bool handleInteraction(StaticANIObject *subj, GameObject *obj, int invId);
 };
 
 struct EntranceInfo {
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index e4dfcf5..acf44f5 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -445,6 +445,38 @@ void MessageQueue::replaceKeyCode(int key1, int key2) {
     }
 }
 
+int MessageQueue::calcDuration(StaticANIObject *obj) {
+	int res;
+	ExCommand *ex;
+	Movement *mov;
+
+	for (uint i = 0; (ex = getExCommandByIndex(i)); i++)
+		if (ex->_parentId == obj->_id) {
+			if (ex->_messageKind == 1 || ex->_messageKind == 20) {
+				if ((mov = obj->getMovementById(ex->_messageNum)) != 0) {
+					if (ex->_field_14 >= 1)
+						res += ex->_field_14;
+					else
+						res += mov->calcDuration();
+				}
+			}
+		}
+
+	return res;
+}
+
+void MessageQueue::changeParam28ForObjectId(int objId, int oldParam28, int newParam28) {
+	for (uint i = 0; i < _exCommands.size(); i++) {
+		ExCommand *ex = getExCommandByIndex(i);
+		int k = ex->_messageKind;
+
+		if ((k == 1 || k == 20 || k == 5 || k == 6 || k == 2 || k == 18 || k == 19 || k == 22 || k == 55)
+			 && ex->_keyCode == oldParam28
+			 && ex->_parentId == objId)
+			ex->_keyCode = newParam28;
+    }
+}
+
 MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
 	for (Common::Array<MessageQueue *>::iterator s = begin(); s != end(); ++s) {
 		if ((*s)->_id == id)
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index 6764325..960e184 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -133,6 +133,9 @@ class MessageQueue : public CObject {
 
 	bool checkGlobalExCommandList1();
 	bool checkGlobalExCommandList2();
+
+	int calcDuration(StaticANIObject *obj);
+	void changeParam28ForObjectId(int objId, int oldParam28, int newParam28);
 };
 
 class GlobalMessageQueueList : public Common::Array<MessageQueue *> {
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 6d07747..4ba03f1 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -76,10 +76,22 @@ void CMctlCompound::addObject(StaticANIObject *obj) {
 	warning("STUB: CMctlCompound::addObject()");
 }
 
-	void CMctlCompound::initMovGraph2() {
+void CMctlCompound::initMovGraph2() {
 	warning("STUB: CMctlCompound::initMovGraph2()");
 }
 
+MessageQueue *CMctlCompound::method34(StaticANIObject *subj, int xpos, int ypos, int flag, int staticsId) {
+	warning("STUB: CMctlCompound::method34()");
+
+	return 0;
+}
+
+MessageQueue *CMctlCompound::method4C(StaticANIObject *subj, int xpos, int ypos, int flag, int staticsId) {
+	warning("STUB: CMctlCompound::method4C()");
+
+	return 0;
+}
+
 bool CMctlCompoundArray::load(MfcArchive &file) {
 	debug(5, "CMctlCompoundArray::load()");
 
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index 318a6b3..f110ac3 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -62,6 +62,9 @@ class CMctlCompound : public CMotionController {
 
 	virtual void addObject(StaticANIObject *obj);
 	void initMovGraph2();
+
+	MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int flag, int staticsId);
+	MessageQueue *method4C(StaticANIObject *subj, int xpos, int ypos, int flag, int staticsId);
 };
 
 class Unk2 : public CObject {
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 7f08310..1fd02f8 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -815,46 +815,6 @@ void StaticANIObject::adjustSomeXY() {
 	warning("STUB: StaticANIObject::adjustSomeXY()");
 }
 
-bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) {
-	if (!(picAniInfo->type & 3)) {
-		warning("StaticANIObject::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
-
-		return false;
-	}
-
-	debug(0, "StaticANIObject::setPicAniInfo() (%s [%d]) type: %d, statid: %d, movid: %d", transCyrillic((byte *)_objectName), _id, picAniInfo->type, picAniInfo->staticsId, picAniInfo->movementId);
-
-	if (picAniInfo->type & 3) {
-		setOXY(picAniInfo->ox, picAniInfo->oy);
-		_priority = picAniInfo->priority;
-		_okeyCode = picAniInfo->field_8;
-		setFlags(picAniInfo->flags);
-		_field_8 = picAniInfo->field_24;
-	}
-
-	if (picAniInfo->type & 1) {
-		_messageQueueId = (picAniInfo->type >> 16) & 0xffff;
-
-		if (picAniInfo->staticsId) {
-			_statics = getStaticsById(picAniInfo->staticsId);
-		} else {
-			_statics = 0;
-		}
-
-		if (picAniInfo->movementId) {
-			_movement = getMovementById(picAniInfo->movementId);
-			if (_movement)
-				_movement->setDynamicPhaseIndex(picAniInfo->dynamicPhaseIndex);
-		} else {
-			_movement = 0;
-		}
-
-		setSomeDynamicPhaseIndex(picAniInfo->someDynamicPhaseIndex);
-	}
-
-	return true;
-}
-
 MessageQueue *StaticANIObject::changeStatics1(int msgNum) {
 	warning("STUB: StaticANIObject::changeStatics1(%d)", msgNum);
 
@@ -1358,6 +1318,21 @@ void Movement::updateCurrDynamicPhase() {
 	}
 }
 
+int Movement::calcDuration() {
+	int res = 0;
+
+	if (_currMovement)
+		for (uint i = 0; i < _currMovement->_dynamicPhases.size(); i++) {
+			res += ((DynamicPhase *)_currMovement->_dynamicPhases[i])->_initialCountdown;
+		}
+	else
+		for (uint i = 0; i < _dynamicPhases.size(); i++) {
+			res += ((DynamicPhase *)_dynamicPhases[i])->_initialCountdown;
+		}
+
+	return res;
+}
+
 void Movement::setDynamicPhaseIndex(int index) {
 	debug(7, "Movement::setDynamicPhaseIndex(%d)", index);
 	while (_currDynamicPhaseIndex < index)
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 295da9b..3d45ac6 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -145,6 +145,8 @@ class Movement : public GameObject {
 	void setDynamicPhaseIndex(int index);
 	DynamicPhase *getDynamicPhaseByIndex(int idx);
 
+	int calcDuration();
+
 	void removeFirstPhase();
 	bool gotoNextFrame(int callback1, void (*callback2)(int *));
 	bool gotoPrevFrame();
@@ -207,8 +209,6 @@ class StaticANIObject : public GameObject {
 	void initMovements();
 	void loadMovementsPixelData();
 
-	bool setPicAniInfo(PicAniInfo *picAniInfo);
-
 	void setSomeDynamicPhaseIndex(int val) { _someDynamicPhaseIndex = val; }
 	void adjustSomeXY();
 


Commit: 55e88c9e43d854fc2b5082d33db57147ca4fd913
    https://github.com/scummvm/scummvm/commit/55e88c9e43d854fc2b5082d33db57147ca4fd913
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-09-08T14:00:33-07:00

Commit Message:
Merge pull request #388 from sev-/fullpipe

FULLPIPE: Merge The Full Pipe engine

Changed paths:
  A engines/fullpipe/behavior.cpp
  A engines/fullpipe/behavior.h
  A engines/fullpipe/constants.h
  A engines/fullpipe/detection.cpp
  A engines/fullpipe/fullpipe.cpp
  A engines/fullpipe/fullpipe.h
  A engines/fullpipe/gameloader.cpp
  A engines/fullpipe/gameloader.h
  A engines/fullpipe/gfx.cpp
  A engines/fullpipe/gfx.h
  A engines/fullpipe/init.cpp
  A engines/fullpipe/input.cpp
  A engines/fullpipe/input.h
  A engines/fullpipe/interaction.cpp
  A engines/fullpipe/interaction.h
  A engines/fullpipe/inventory.cpp
  A engines/fullpipe/inventory.h
  A engines/fullpipe/lift.cpp
  A engines/fullpipe/messages.cpp
  A engines/fullpipe/messages.h
  A engines/fullpipe/modal.cpp
  A engines/fullpipe/modal.h
  A engines/fullpipe/module.mk
  A engines/fullpipe/motion.cpp
  A engines/fullpipe/motion.h
  A engines/fullpipe/ngiarchive.cpp
  A engines/fullpipe/ngiarchive.h
  A engines/fullpipe/objectnames.h
  A engines/fullpipe/objects.h
  A engines/fullpipe/scene.cpp
  A engines/fullpipe/scene.h
  A engines/fullpipe/scenes.cpp
  A engines/fullpipe/scenes.h
  A engines/fullpipe/sound.cpp
  A engines/fullpipe/sound.h
  A engines/fullpipe/stateloader.cpp
  A engines/fullpipe/statics.cpp
  A engines/fullpipe/statics.h
  A engines/fullpipe/utils.cpp
  A engines/fullpipe/utils.h
    engines/configure.engines
    engines/engines.mk
    engines/plugins_table.h









More information about the Scummvm-git-logs mailing list