📜 ⬆️ ⬇️

How we ported the good old Russian quest

My name is Svetlana, I am developing in the company of Buka. I want to share with you a story about how we ported the game.

How it all began


image Many probably remember the golden era of quests, which occurred in the 90s of the last century. And some of those who are older, even found the best representatives of the genre: King's Quest, Space Quest, Myst, Broken Sword, Grim Fandango, Monkey Island.

Russian game devs did not sit on their hands either: the boxes with the games of the Pilot Brothers and Petka and Vasily Ivanovich series were snapped up from the store shelves like hotcakes!
')
Old games do not get worse with age, but it is becoming more difficult to start them every year. Therefore, like many other publishers, we decided to port one of our best games to modern devices. And they chose the classic quest “Petka and Vasily Ivanovich: Saving the Galaxy” as a sample of the pen.

Briefly about the game


This is a point-and-click animated humorous adventure game released in 1998. It tells the story of 3 heroes of the Red Army. The action takes place in the village "Gadyukino", where ordinary Peter and the divisional commander Vasily Ivanovich Chapaev begin to search for the missing red flag. Meanwhile, aliens are trying to conquer the world.

The original game was not very simple control, sharpened to use the mouse. The player has a wide range of actions: watch, walk, use, take, talk, use an item from the inventory (suitcase) and a separate action by the second assistant character (Chapaev). Just like in life.

The main goal of the porting is to fully adapt the favorite classic game to modern operating systems and widescreen monitors. Fans are not the first year asking us to release the first part of “Petka” on Steam, and then, finally, in the summer of 2015, we set to work.

Heritage


As often happens, for many years that have passed since the release of the original “Petka”, most of the original materials of the game disappeared without a trace. Therefore, we have begun to extract resources from the existing disk version. As a result, the following materials appeared on our hands:


In general, this is 1.8 GB of content, or about 10 hours of playing time. But we did not have the main thing - the source code. I had to write it from scratch.

The first steps


We faced the question of choosing a tool on which we will work. Since the port must be cross-platform, we focused on finding the engine that meets our requirements. As a result, we stopped at Unity3D due to its prevalence, availability of good documentation and support.

And since the game consisted of a lot of scripted scenes, using Unity3D, we began to design a framework that would speed up our work and allow us to quickly assemble a 2D point-and-click quest.

At the same time they prepared documentation on scenes and materials for porting. Original backgrounds and animations with a resolution of 640px at 480px and a 4: 3 aspect ratio were manually drawn by artists to a ratio of 16: 9.

image

Little about management


We decided to add a convenient modern management, since the original game had a high threshold of entry. Now the player can switch between them at any time directly in the settings menu.

In simplified control, there is one kind of pointer that highlights active objects for interaction on the scenes. So the player will be able to immediately see all the hidden objects in the location.

When you click on an object, the player will see only those actions that can be applied to this object. If an item appears in the inventory (for example, a Key), when you click on the Lock in possible actions, the player will see this Key. As a result, the need to enter inventory too often will disappear. Now it will need to be done only to work with the items themselves.

In addition, we added visual pointers at the places of possible transitions between scenes and thought about situations when the player no longer knows what to do. In the suitcase in the simplified management, an element of Tips was added, which hints where the user needs to go further.

image

More about the framework


The game scene of our animated 2D quest includes the following components:

- General information about the scene:


image

- Scale: place the scale points on the stage. Each point has a weight (percentage of the GG scale) relative to which the scale of the GG is calculated.

image

- Objects:


image


image

In addition to the graphic content of the scene, there is also a functional component, where each scene is a XAML document. It uses a small self-written scripting language. The document describes all the objects of the scene and those actions that can be performed with the object.

Sample document:

Xaml scene
<?xml version="1.0" encoding="utf-8"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <StartScenario> <item> define ONE_ENTER76 </item> </StartScenario> <DefaultScenario> ifdef THREE_ENTER76 setAnimation ANIMATIONSET 3-TEHNIK undef THREE_ENTER76 endif ifdef TWO_ENTER76 setAnimation ANIMATIONSET 2-DOGBAR define THREE_ENTER76 undef TWO_ENTER76 endif ifdef ONE_ENTER76 floating 0 waitAnimation ALI ALI-OG setAnimation ALI BAR-ALI waitAnimation ANIMATIONSET 11BOTLLE toggle 1-BUTL 1 waitAnimation ANIMATIONSET 12BOTLLE define TWO_ENTER76 undef ONE_ENTER76 floating 1 endif </DefaultScenario> <ObjectsScene> <DelineationObject> <name>STOLIK</name> <toWatch> <item> speakBegin petka waitSpeak petka 31301801 // -   . waitSpeak petka 31301901 //     ... speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31306201 // . speakEnd petka </item> </toUse> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31307701 //    . speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>PULT-DU</name> <toWatch> <item> speakBegin petka waitSpeak petka 31302001 //   ,    ,     "  "... waitSpeak petka 31302101 //        . speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31306301 // . speakEnd petka </item> </toUse> <toTake> <item> if ALI setAnimation ALI BAR-ALI2 waitSpeak ALI 35809601 // . . setAnimation ALI BAR-ALI else closeHint hintPartFour_takePult //     .   ?    ,   . waitMove petka PULT-DU waitAnimation petka G_FLME audio TAKE addToInventory iDEWOO toggle PULT-DU 0 waitAnimation petka G_FLMER endif </item> <item> if ALI setAnimation ALI BAR-ALI2 waitSpeak ALI 35809901 // .  . setAnimation ALI BAR-ALI else closeHint hintPartFour_takePult //     .   ?    ,   . waitMove petka PULT-DU waitAnimation petka G_FLME audio TAKE addToInventory iDEWOO toggle PULT-DU 0 waitAnimation petka G_FLMER endif </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31307801 //   . speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>VODKA</name> <toSpeak> <item> speakBegin vasly waitSpeak vasly 31304501 // , ! speakEnd vasly </item> <item> speakBegin vasly waitSpeak vasly 31304502 // , !    ? speakEnd vasly </item> <item> speakBegin vasly waitSpeak vasly 31304503 //       !    ! speakEnd vasly </item> <item> speakBegin vasly waitSpeak vasly 31304504 //      ? speakEnd vasly </item> <item> speakBegin vasly waitSpeak vasly 31304505 // ,  -! speakEnd vasly </item> </toSpeak> <toWatch> <item> speakBegin petka waitSpeak petka 31302201 // ,   ! waitSpeak petka 31302301 //    ,  ! waitSpeak petka 31302401 //      ,     ... speakEnd petka speakBegin vasly waitSpeak vasly 31302501 // , ,  . speakEnd vasly </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31306401 //      . speakEnd petka </item> </toUse> <toGive> <item> speakBegin petka waitSpeak petka 31310201 //   ,  ,  ,     ! speakEnd petka </item> </toGive> <toTake> <item> speakBegin petka waitSpeak petka 31304801 //   ?     . speakEnd petka </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31307901 //     ... speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>DVERI</name> <toWatch> <item> speakBegin petka waitSpeak petka 31302601 //  . waitSpeak petka 31302701 //   . speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31306501 //  . speakEnd petka </item> </toUse> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31308001 // ,   . speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>DINAMIKI</name> <toWatch> <item> speakBegin petka waitSpeak petka 31302801 //   . speakEnd petka </item> </toWatch> <toTake> <item> speakBegin petka waitSpeak petka 31304901 //   ,  . speakEnd petka </item> </toTake> <toUse> <item> speakBegin petka waitSpeak petka 31306601 //      . speakEnd petka speakBegin vasly waitSpeak vasly 31306701 //   , ? waitSpeak vasly 31306801 //     -      . speakEnd vasly speakBegin petka waitSpeak petka 31306901 //     ... speakEnd petka </item> </toUse> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31308101 //    . speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>TAZ</name> <toWatch> <item> speakBegin petka waitSpeak petka 31302901 // -,     . speakEnd petka speakBegin vasly waitSpeak vasly 31303001 //   , . waitSpeak vasly 31303101 //   ,  . speakEnd vasly </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31307001 // , , ,   -    ! speakEnd petka </item> </toUse> <toGive> <item> speakBegin petka waitSpeak petka 31310301 //  . speakEnd petka </item> <item> speakBegin petka waitSpeak petka 31310302 //      -  ,  ?      ... speakEnd petka </item> </toGive> <toTake> <item> speakBegin petka waitSpeak petka 31305001 //      . speakEnd petka </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31308201 //    .  ! speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>BAR</name> <toWatch> <item> speakBegin petka waitSpeak petka 31303201 //     . waitSpeak petka 31303301 //      . speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31307101 // -        . speakEnd petka </item> </toUse> <toGive> <item> speakBegin petka waitSpeak petka 31310401 //      . speakEnd petka </item> <item> speakBegin petka waitSpeak petka 31310402 //     . speakEnd petka </item> </toGive> <toTake> <item> speakBegin petka waitSpeak petka 31305101 //     . speakEnd petka </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31308301 // -     . speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>ALI</name> <toSpeak> <item> waitMove petka ALI runDialog ALI </item> </toSpeak> <toWatch> <item> speakBegin petka waitSpeak petka 31303401 //    -     . speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31307201 //    ,       ... speakEnd petka </item> </toUse> <toGive> <item> speakBegin petka waitSpeak petka 31310501 //    . speakEnd petka </item> <item> speakBegin petka waitSpeak petka 31310502 //   ? speakEnd petka </item> <item> speakBegin petka waitSpeak petka 31310503 // ,      . speakEnd petka </item> </toGive> <toTake> <item> speakBegin petka waitSpeak petka 31305201 //      ...  . waitSpeak petka 31305301 // ! speakEnd petka </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31308401 //       . waitSpeak vasly 31308501 //     - ,   ... speakEnd vasly speakBegin petka waitSpeak petka 31308601 //       ? speakEnd petka speakBegin vasly waitSpeak vasly 31308701 // ,   ! speakEnd vasly speakBegin petka waitSpeak petka 31308801 //    ? speakEnd petka speakBegin vasly waitSpeak vasly 31308901 //    ... speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>STRANGE-MACHINE</name> <toWatch> <item> speakBegin vasly waitSpeak vasly 31303501 //    ,    . waitSpeak vasly 31303601 // ,  -   . speakEnd vasly </item> </toWatch> <toGive> <item> speakBegin petka waitSpeak petka 31310601 //      . speakEnd petka </item> </toGive> <toTake> <item> speakBegin petka waitSpeak petka 31305401 //       . speakEnd petka </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31309001 // , ,  . speakEnd vasly </item> <item> speakBegin vasly waitSpeak vasly 31309002 //  ,    - . speakEnd vasly </item> </toAction> </ToObject> <ToObject> <name>iBUTLPUST</name> <toAction> <item> closeHint hintPartFour_giveBottlesOne //        . , ? if 2-BUTL waitMove petka STRANGE-MACHINE waitAnimation petka G_FLME setAnimation petka G_FLMER waitAnimation ANIMATION PROGLOT toggle 3-BUTL 1 toggle 2-BUTL 0 toggle BUTLS 1 setAnimation BUTLS START waitAnimation ANIMATION PRILET toggle PR-BT 1 setAnimation ANIMATION none endif if 1-BUTL waitMove petka STRANGE-MACHINE waitAnimation petka G_FLME setAnimation petka G_FLMER waitAnimation ANIMATION PROGLOT toggle 2-BUTL 1 toggle 1-BUTL 0 audio 3-BUTL2 setAnimation ANIMATION none endif removeFromInventory iBUTLPUST </item> </toAction> </ToObject> <ToObject> <name>iBUTLPUST1</name> <toAction> <item> closeHint hintPartFour_giveBottlesTwo //        . , ? if 2-BUTL waitMove petka STRANGE-MACHINE waitAnimation petka G_FLME setAnimation petka G_FLMER waitAnimation ANIMATION PROGLOT toggle 3-BUTL 1 toggle 2-BUTL 0 toggle BUTLS 1 setAnimation BUTLS START waitAnimation ANIMATION PRILET toggle PR-BT 1 setAnimation ANIMATION none endif if 1-BUTL waitMove petka STRANGE-MACHINE waitAnimation petka G_FLME setAnimation petka G_FLMER waitAnimation ANIMATION PROGLOT toggle 2-BUTL 1 toggle 1-BUTL 0 audio 3-BUTL2 setAnimation ANIMATION none endif removeFromInventory iBUTLPUST1 </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>PR-BT</name> <toTake> <item> closeHint hintPartFour_takePepC // ,     .     . waitMove petka STRANGE-MACHINE waitAnimation petka G_FLME audio TAKE toggle BUTLS 0 toggle 3-BUTL 0 addToInventory iBUTLPOLN toggle PR-BT 0 waitAnimation petka G_FLMER </item> </toTake> </DelineationObject> <DelineationObject> <name>PLAZMA</name> <toWatch> <item> speakBegin petka waitSpeak petka 31303701 //   . speakEnd petka speakBegin vasly waitSpeak vasly 31303801 //    ,  , . speakEnd vasly </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31307301 //     . speakEnd petka </item> </toUse> <toTake> <item> speakBegin petka waitSpeak petka 31305501 //     . speakEnd petka speakBegin vasly waitSpeak vasly 31305601 //  . speakEnd vasly </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31309101 //     . waitSpeak vasly 31309201 //     ... speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>TRA</name> <toWatch> <item> speakBegin petka waitSpeak petka 31303901 //   . waitSpeak petka 31304001 //  ,       ... waitSpeak petka 31304101 //  ,     - . speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31307401 //          ,     ... speakEnd petka </item> </toUse> <toTake> <item> closeHint hintPartFour_takeTrash //       -. waitMove petka TRA speakBegin petka waitSpeak petka 31305701 //  ,     ... speakEnd petka waitAnimation petka G_FLME audio TAKE addToInventory iTRYAPKA toggle TRA 0 waitAnimation petka G_FLMER </item> </toTake> <toObjects> <ToObject> <name>vasly</name> <toAction> <item> speakBegin vasly waitSpeak vasly 31309301 //     . speakEnd vasly </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>TEL-OKO1</name> <toWatch> <item> speakBegin petka waitSpeak petka 31304201 //     ?      ? speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31012701 //  ,  ? speakEnd petka speakBegin vasly waitSpeak vasly 31012801 //  ? speakEnd vasly speakBegin petka waitSpeak petka 31012901 //  ! speakEnd petka </item> </toUse> <toObjects> <ToObject> <name>iAXE</name> <toAction> <item> waitMove petka TEL-OKO1 if ALI toggle PULT-DU 0 waitAnimation ALI ALI-TV waitAnimation TV PEREKL2 toggle AUDIOTV 1 setAnimation TV DIKTOR setAnimation ALI ALI-T toggle PULT-DU 1 toggle petka 0 waitAnimation ANIMATION UDAROK1 setAnimation TEL-OKO1 TELOKO4 waitAnimation ANIMATION UDAR-O2X toggle TEL-OKO1 0 toggle petka 1 jump petka PETKAJUMP setAnimation ANIMATION none else closeHint hintPartFour_giveAxe //   . -    … ! toggle petka 0 waitAnimation ANIMATION UDAROK1 toggle TEL-OKO1 0 toggle TEL-OKO2 1 setAnimation TEL-OKO2 TEL-OKO1 waitAnimation ANIMATION UDAROK2 toggle petka 1 setAnimation ANIMATION none define OKOCRASH endif </item> </toAction> </ToObject> </toObjects> </DelineationObject> <DelineationObject> <name>TEL-OKO2</name> <toWatch> <item> speakBegin petka waitSpeak petka 31304201 //     ?      ? speakEnd petka </item> </toWatch> <toUse> <item> speakBegin petka waitSpeak petka 31012701 //  ,  ? speakEnd petka speakBegin vasly waitSpeak vasly 31012801 //  ? speakEnd vasly speakBegin petka waitSpeak petka 31012901 //  ! speakEnd petka </item> </toUse> <toTake> <item> waitAnimation petka G_FLME audio TAKE addToInventory iOKO2 toggle TEL-OKO2 0 waitAnimation petka G_FLMER </item> </toTake> </DelineationObject> <DelineationObject> <name>TV</name> <toWatch> <item> speakBegin petka waitSpeak petka 31350101 //  ,  . speakEnd petka speakBegin vasly waitSpeak vasly 31350102 //  , ,  . speakEnd vasly </item> </toWatch> <toObjects> <ToObject> <name>iDEWOO</name> <toAction> <item> closeHint hintPartFour_givePult // -      . ifn AUDIOTV waitMove petka TV toggle petka 0 waitAnimation ANIMATION P-DU0 ifndef OKOCRASH setAnimation TEL-OKO1 TELOKO4 endif setAnimation TV PEREKL2 waitAnimation ANIMATION P-DU1 toggle AUDIOTV 1 setAnimation TV DIKTOR toggle petka 1 setAnimation ANIMATION none ifndef OKOCRASH toggle TEL-OKO1 0 endif else waitMove petka TV toggle petka 0 ifndef OKOCRASH toggle TEL-OKO1 1 endif waitAnimation ANIMATION P-DU0 ifndef OKOCRASH setAnimation TEL-OKO1 TELOKO1 endif setAnimation TV PEREKL1 toggle AUDIOTV 0 waitAnimation ANIMATION P-DU1 setAnimation TV PORNO-B toggle petka 1 setAnimation ANIMATION none ifndef OKOCRASH setAnimation TEL-OKO1 TELOKO2 endif endif </item> </toAction> </ToObject> </toObjects> </DelineationObject> </ObjectsScene> <Dialogs> <DialogItem> <NameDialog>ALI</NameDialog> <DialogNodes> <DialogNode> <NameNode>A</NameNode> <DialogNodeItems> <DialogNodeItem> <!-- ?--> <Text>35801401</Text> <Scenario> speakBegin petka waitSpeak petka 35801401 //  ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35802401 //    -  ,  . waitSpeak ALI 35802501 //  ... setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35802601 // ,     ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35802701 //  ?   -   ? setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35802801 // ? ...   -  ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35802901 // ,  . waitSpeak ALI 35803001 //   ,   ,      . waitSpeak ALI 35803101 // ,  ,  - -. waitSpeak ALI 35803201 //  ,    -    ,       ... setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35803301 // .     ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35803401 // ?   ? waitSpeak ALI 35803501 //     ,      ! setAnimation ALI BAR-ALI speakBegin petka waitSpeak petka 35803601 //     , .    ,  . speakEnd petka </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode /> </DialogNodeItem> <DialogNodeItem> <!--      ?--> <Text>35801501</Text> <Scenario> speakBegin petka waitSpeak petka 35801501 //       ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35804101 // ?  ? waitSpeak ALI 35804201 // -! !  .      . waitSpeak ALI 35804301 //  ,   ,         ... waitSpeak ALI 35804401 //        ,        . waitSpeak ALI 35804501 //  ,   ,     ... setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35804601 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35804701 //   , ... setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35804801 //   ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35804901 //    "  ". waitSpeak ALI 35805001 //  ,       . setAnimation ALI BAR-ALI1 speakBegin petka waitSpeak petka 35805101 //  ! speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35805201 // .   ,     . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35805301 // ? waitSpeak petka 35805401 // -.  .  . waitSpeak petka 35805501 //        ?  ,   ... speakEnd petka toggle PULT-DU 0 waitAnimation ALI ALI-TV toggle AUDIOTV 0 waitAnimation TV PEREKL1 setAnimation TV PORNO-B waitAnimation ALI ALI-T setAnimation ALI BAR-ALI toggle PULT-DU 1 ifndef OKOCRASH toggle TEL-OKO1 1 waitAnimation TEL-OKO1 TELOKO1 setAnimation TEL-OKO1 TELOKO2 endif toggleDialogItem ALI A PULT1 1 </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode /> </DialogNodeItem> <DialogNodeItem> <!--      ?--> <Text>35801601</Text> <Scenario> speakBegin petka waitSpeak petka 35801601 //       ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35805901 //    . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35806001 // ?     . speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35806101 //     160-. setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35806201 //     ,   ? , ,  175!  . speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35806301 // .      - 1175!!! setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35806401 // ?     ! speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35806501 // .     . waitSpeak ALI 35806601 // ,     ? setAnimation ALI BAR-ALI </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode>B</TransitionToNode> </DialogNodeItem> <DialogNodeItem> <!--    ?--> <Text>35801701</Text> <Scenario> speakBegin petka waitSpeak petka 35801701 //     ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35808301 //      . waitSpeak ALI 35808401 //       - Pep-C++,    . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35808501 // ... waitSpeak petka 35808601 //   ,    -  ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35808701 //  .   . waitSpeak ALI 35808801 //      . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35808901 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35809001 //           . setAnimation ALI BAR-ALI </Scenario> <TransitionToNode /> </DialogNodeItem> <DialogNodeItem> <!--         ?--> <Text>35801801</Text> <nameItem>PULT1</nameItem> <Enable>false</Enable> <Scenario> speakBegin petka waitSpeak petka 35801801 //          ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35809301 //  -    . waitSpeak ALI 35809401 //      ,  , , , ... setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35809501 //    ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35809601 // . . setAnimation ALI BAR-ALI toggleDialogItem ALI A PULT2 1 </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode /> </DialogNodeItem> <DialogNodeItem> <!--,  -    ?--> <Text>35801901</Text> <nameItem>PULT2</nameItem> <Enable>false</Enable> <Scenario> speakBegin petka waitSpeak petka 35801901 // ,  -    ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35809901 // .  . setAnimation ALI BAR-ALI </Scenario> <TransitionToNode /> </DialogNodeItem> <DialogNodeItem> <!--       .--> <Text>35802001</Text> <nameItem>TOMAT</nameItem> <Enable>false</Enable> <Scenario> speakBegin petka waitSpeak petka 35802001 //        . speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35810201 // ? -   . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35810301 //  ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35810401 //  . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35810501 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35810601 // . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35810701 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35810801 // . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35810901 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35811001 // . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35811101 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35811201 // . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35811301 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35811401 // . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35811501 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35811601 // . setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35811701 // ? speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35811801 // ?!? -...  . waitSpeak ALI 35811901 //  . , ... waitAnimation ALI ALI-GO closeHint hintPartFour_speakBar // ,      ? toggle ALI 0 </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode /> </DialogNodeItem> <DialogNodeItem> <!--.--> <Text>35802101</Text> <Scenario> speakBegin petka waitSpeak petka 35802101 // . speakEnd petka </Scenario> <TransitionToNode /> </DialogNodeItem> </DialogNodeItems> </DialogNode> <DialogNode> <NameNode>B</NameNode> <DialogNodeItems> <DialogNodeItem> <!--      .--> <Text>35806801</Text> <Scenario> speakBegin petka waitSpeak petka 35806801 //       . speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35806901 // ?     !     !!! setAnimation ALI BAR-ALI </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode>B</TransitionToNode> </DialogNodeItem> <DialogNodeItem> <!--    ...--> <Text>35807101</Text> <Scenario> speakBegin petka waitSpeak petka 35807101 //     ... speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35807201 //      -      . waitSpeak ALI 35807301 //           . waitSpeak ALI 35807401 // -   . setAnimation ALI BAR-ALI </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode>B</TransitionToNode> </DialogNodeItem> <DialogNodeItem> <!--     .--> <Text>35807601</Text> <Scenario> speakBegin petka waitSpeak petka 35807601 //      . speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35807701 //     ? setAnimation ALI ALI-SM speakBegin petka waitSpeak petka 35807801 // !        . speakEnd petka setAnimation ALI BAR-ALI2 waitSpeak ALI 35807901 //  .  ,    . waitSpeak ALI 35808001 //     -  .   ,  ... setAnimation ALI BAR-ALI toggleDialogItem ALI A TOMAT 1 </Scenario> <RemoveSelfAfterPlay>true</RemoveSelfAfterPlay> <TransitionToNode /> </DialogNodeItem> </DialogNodeItems> </DialogNode> </DialogNodes> </DialogItem> </Dialogs> </Root> 


As a result, we received a “modernized” game, actually assembled from scratch on a new engine, but at the same time preserving the original graphics and sound effects. To demonstrate the process of complete assembly of one of the game scenes, we made a special video:



Perhaps one of you will use our example to create your 2D quest. And of course, I will be glad to answer your questions!

Source: https://habr.com/ru/post/276945/


All Articles