home *** CD-ROM | disk | FTP | other *** search
/ hobbes.nmsu.edu 2008 / 2008-06-02_hobbes.nmsu.edu.zip / new / scummc-0.2.0-os2.zip / ScummC / examples / openquest / actors.scc next >
Encoding:
Text File  |  2008-04-06  |  13.9 KB  |  403 lines

  1. /* ScummC
  2.  * Copyright (C) 2007  Alban Bedel, Gerrit Karius
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17.  *
  18.  */
  19.  
  20. #include <scummVars6.s>
  21. #include "common.sch"
  22. #include "actors.sch"
  23. #include "dialog.sch"
  24. #include "inventoryitems.sch"
  25. #include "officeroom.sch"
  26. #include "secretroom.sch"
  27.  
  28. #include "zif_anim.sch"
  29.  
  30. // 2-dim array used like a struct array
  31. nibble *roaming;
  32.  
  33. #define RM_STATE        0
  34. #define RM_MIN_X        1
  35. #define RM_MAX_X        2
  36. #define RM_MIN_Y        3
  37. #define RM_MAX_Y        4
  38. #define RM_NUM_FIELD    5
  39.  
  40. // Roaming state
  41. #define RM_STOPPED      0
  42. #define RM_PAUSED       1
  43. #define RM_RUNNING      2
  44.  
  45. room Actors {
  46.  
  47.     // the costumes for our actors
  48.     cost ensignZobCost = "zob.cost";
  49.     cost commanderZifCost = "zif.cost";
  50.     cost carolCost = "carol.cost";
  51.  
  52.     cost bluecupCost = "bluecup.cost";
  53.     cost cubeCost = "cube.cost";
  54.  
  55.     object commanderZifObj;
  56.     object ensignZobObj;
  57.     
  58.     
  59.     script setZifOnThePhone() {
  60.         setCurrentActor(commanderZif);
  61.         setActorStandFrame( zif_anim_standWithPhone );
  62.         setActorInitFrame( zif_anim_standWithPhone );
  63.         setActorTalkFrame( zif_anim_talkToPhoneStart,
  64.                            zif_anim_standWithPhone  );
  65.         setActorStanding();
  66.         setCurrentActor(VAR_EGO);
  67.     }
  68.  
  69.     
  70.     script setZifOffThePhone() {
  71.         setCurrentActor(commanderZif);
  72.         setActorStandFrame( zif_anim_stand );
  73.         setActorInitFrame( zif_anim_init );
  74.         setActorTalkFrame( zif_anim_talkStart, zif_anim_talkStop );
  75.         setActorStanding();
  76.         setCurrentActor(VAR_EGO);
  77.     }
  78.  
  79.     script roam(int a) {
  80.         int event, dstX, dstY, paused;
  81.         dbgPrint("Roaming script for %n{a} started");
  82.         while(roaming[a,RM_STATE] > RM_STOPPED) {
  83.             // Debug stuff
  84.             paused = 0;
  85.             until(VAR_EGO != a && roaming[a,RM_STATE] > RM_PAUSED) {
  86.                 unless(paused) {
  87.                     paused = 1;
  88.                     dbgPrint("Roaming script for %n{a} paused");
  89.                 }
  90.                 breakScript();
  91.             }
  92.             if(paused) dbgPrint("Roaming script for %n{a} resumed");
  93.             // Select a new state
  94.             event = getRandomNumber(1);
  95.             switch(event) {
  96.             case 1: // go somewhere else
  97.                 do {
  98.                     breakScript();
  99.                     dstX = getRandomNumberRange(roaming[a,RM_MIN_X],
  100.                                                 roaming[a,RM_MAX_X]);
  101.                     dstY = getRandomNumberRange(roaming[a,RM_MIN_Y],
  102.                                                 roaming[a,RM_MAX_Y]);
  103.                 } while(getActorRoom(a) == VAR_ROOM && getActorAt(dstX,dstY));
  104.                 dbgPrint("%n{a} roam to %i{dstX}x%i{dstY}");
  105.                 walkActorTo(a,dstX,dstY);
  106.                 break;
  107.                 // TODO: add more stuff. For that we probably want
  108.                 //       to call the actor object to know how many extra
  109.                 //       event the actor support, and to execute them.
  110.             }
  111.             delay(getRandomNumberRange(50,200));
  112.         }
  113.         dbgPrint("Roaming script for %n{a} finished");
  114.     }
  115.  
  116.     script startRoaming(int a, int x_min, int x_max, int y_min, int y_max) {
  117.         unless(a < 0xF) {
  118.             dbgPrint("Invalid actor id (%i{a}), can't make it roam.");
  119.             return;
  120.         }
  121.         dbgPrint("Starting roam script for %n{a}");
  122.         unless(roaming) dimNibble2(roaming,0xF,RM_NUM_FIELD);
  123.         roaming[a,RM_MIN_X] = x_min; roaming[a,RM_MAX_X] = x_max;
  124.         roaming[a,RM_MIN_Y] = y_min; roaming[a,RM_MAX_Y] = y_max;
  125.         if(roaming[a,RM_STATE] > RM_STOPPED)
  126.             roaming[a,RM_STATE] = RM_RUNNING;
  127.         else {
  128.             roaming[a,RM_STATE] = RM_RUNNING;
  129.             startScript(1,roam,[a]);
  130.         }
  131.     }
  132.  
  133.     script pauseRoaming(int a) {
  134.         unless(a < 0xF && roaming) return;
  135.         unless(roaming[a,RM_STATE] > RM_STOPPED) return;
  136.         dbgPrint("Pausing roam script for %n{a}");
  137.         setCurrentActor(a);
  138.         setActorStanding();
  139.         roaming[a,RM_STATE] = RM_PAUSED;
  140.     }
  141.  
  142.     script resumeRoaming(int a) {
  143.         unless(a < 0xF && roaming) return;
  144.         unless(roaming[a,RM_STATE] > RM_STOPPED) return;
  145.         dbgPrint("Resuming roam script for %n{a}");
  146.         roaming[a,RM_STATE] = RM_RUNNING;
  147.     }
  148.  
  149.     script stopRoaming(int a) {
  150.         unless(a < 0xF && roaming) return;
  151.         unless(roaming[a,RM_STATE] > RM_STOPPED) return;
  152.         dbgPrint("Stoping roam script for %n{a}");
  153.         setCurrentActor(a);
  154.         setActorStanding();
  155.         roaming[a,RM_STATE] = RM_STOPPED;
  156.     }
  157.     
  158.     // set the actor costume, etc
  159.     script setupActors() {
  160.         dbgPrint("setupActors()");
  161.         
  162.         // initialize ensignZob
  163.         setCurrentActor(ensignZob);
  164.         initActor();
  165.         setActorCostume(ensignZobCost);
  166.         setActorName("Ensign Zob");
  167.         setActorWalkSpeed(2,1);
  168.         setActorTalkColor(ZOB_COLOR);
  169.         setActorWidth(20);
  170.         setActorAnimSpeed(4);
  171.         setObjectClass(ensignZob, [ 0x80 + Person ]);
  172.         actorObject[ensignZob] = ensignZobObj;
  173.  
  174.  
  175.         // set VAR_EGO so we can use the *Ego* functions
  176.         VAR_EGO = ensignZob;
  177.         
  178.         // initialize commanderZif
  179.         setCurrentActor(commanderZif);
  180.         initActor();
  181.         setActorCostume(commanderZifCost);
  182.         setActorName("Commander Zif");
  183.         setActorWalkSpeed(2,1);
  184.         setActorTalkColor(ZIF_COLOR);
  185.         setActorWidth(20);
  186.         setActorAnimSpeed(4);
  187.         setObjectClass(commanderZif, [ 0x80 + Person ]);
  188.         actorObject[commanderZif] = commanderZifObj;
  189.         
  190.         setCurrentActor(carol);
  191.         initActor();
  192.         setActorCostume(carolCost);
  193.         setActorName("indigenous lifeform");
  194.         setActorWidth(20);
  195.         setActorIgnoreBoxes();
  196.         setActorAnimSpeed( 7 );
  197.         setActorTalkColor(CAROL_COLOR);
  198.         setObjectClass(carol, [ 0x80 + Person ]);
  199.         actorObject[carol] = OfficeRoom::carolObj;
  200.  
  201.         setCurrentActor(bluecupActor);
  202.         initActor();
  203.         setActorCostume(bluecupCost);
  204.         setActorName("blue cup");
  205.         setActorAnimSpeed(2);
  206.         actorObject[bluecupActor] = SecretRoom::blueCup;
  207.         putActorAt(bluecupActor,159,97,SecretRoom);
  208.         setActorElevation( 55 );
  209.         setActorWidth(0);
  210.  
  211.         setCurrentActor(cubeActor);
  212.         initActor();
  213.         setActorCostume(cubeCost);
  214.         // TODO: make the cube irresponsive to mouseover
  215.         setActorName("blue cup");
  216.         setActorAnimSpeed(2);
  217.         setObjectClass(cubeActor, [ 0x80 + ClassUntouchable ]);
  218.         actorObject[cubeActor] = SecretRoom::blueCup;
  219.         putActorAt(cubeActor,160,98,SecretRoom);
  220.         setActorElevation( 55 );
  221.         setActorWidth(0);
  222.  
  223.         pickupObject( InventoryItems::scanner, InventoryItems );
  224.         //pickupObject( InventoryItems::card, InventoryItems );
  225.         //pickupObject( InventoryItems::gun, InventoryItems );
  226.         //pickupObject( InventoryItems::bullets, InventoryItems );
  227.         invOffset = 0;
  228.         
  229.         setCurrentActor(VAR_EGO);
  230.  
  231.     }
  232.  
  233.     // This script is called on pre-entry to load the actor
  234.     // objects from this room
  235.     script loadObjects() {
  236.         loadFlObject(commanderZifObj,Actors);
  237.         loadFlObject(ensignZobObj,Actors);
  238.     }
  239.     
  240.     script zobTalkToZif() {
  241.             char* sentence;
  242.  
  243.             cutscene(1) {
  244.                 actorFace( commanderZif, VAR_EGO );
  245.                 actorSay(commanderZif,"Yes, ensign?");
  246.                 waitForMessage();
  247.             }
  248.             dialogLoop: while(1) {
  249.                 sentence[0] = "What are your orders?";
  250.                 Dialog::dialogAdd(sentence);
  251.                 sentence = 0;
  252.                 if( OfficeRoom::hasPressedPlate &&
  253.                     ! OfficeRoom::hasTalkedAboutPlate )
  254.                     sentence[0] = "I require your assistance with this opening mechanism.";
  255.                 Dialog::dialogAdd(sentence);
  256.                 sentence = 0;
  257.                 sentence[0] = "I'll continue my search.";
  258.                 Dialog::dialogAdd(sentence);
  259.                 sentence = 0;
  260.  
  261.                 Dialog::dialogStart(ZOB_DIM_COLOR,ZOB_COLOR);
  262.                 do breakScript() while(selectedSentence < 0);
  263.                 Dialog::dialogHide();
  264.                 cutscene() {
  265.                     sentence = dialogList[selectedSentence];
  266.                     egoSay("%s{sentence}");
  267.                     waitForMessage();
  268.                     switch(selectedSentence) {
  269.                     case 0:
  270.                         try {
  271.                         actorSay(commanderZif,"Locate the stolen artifact.");
  272.                         waitForMessage();
  273.                         egoSay("Any ideas where?");
  274.                         waitForMessage();
  275.                         actorSay(commanderZif,"Study your surroundings.");
  276.                         waitForMessage();
  277.                         actorSay(commanderZif,"Use all the cunning and guile at your disposal.");
  278.                         waitForMessage();
  279.                         actorSay(commanderZif,"Should you do this, you shall surely be successful.");
  280.                         waitForMessage();
  281.                         egoSay("Guile, right, aye sir.");
  282.                         waitForMessage();
  283.                         actorSay(commanderZif,"Also get a gun with which to shoot things.");
  284.                         waitForMessage();
  285.                         }
  286.                         override {
  287.                             if(VAR_OVERRIDE) {
  288.                                 actorSay(0xFF, ""); //stopTalking();
  289.                             }
  290.                         }
  291.                         break;
  292.                     case 2:
  293.                         actorSay(commanderZif,"Very good.");
  294.                         break;
  295.                     case 1:
  296.                         actorSay(commanderZif,"Have you deciphered its secrets?");
  297.                         waitForMessage();
  298.                         egoSay("Yes, I believe two persons are required.");
  299.                         waitForMessage();
  300.                         actorSay(commanderZif,"In which case I shall follow you, ensign.");
  301.                         OfficeRoom::hasTalkedAboutPlate = 1;
  302.                         break;
  303.                     }
  304.                     waitForMessage();
  305.                 }
  306.                 Dialog::dialogClear(1);
  307.                 if(selectedSentence == 2) break dialogLoop;
  308.             }
  309.             Dialog::dialogEnd();
  310.  
  311.     }
  312.     
  313.     
  314.     script zobTalkToZifInSecretRoom() {
  315.             char* sentence;
  316.  
  317.             cutscene(1) {
  318.                 actorFace( commanderZif, VAR_EGO );
  319.                 actorSay(commanderZif,"Yes, ensign?");
  320.                 waitForMessage();
  321.             } 
  322.             dialogLoop: while(1) {
  323.                 sentence[0] = "What now, Sir?";
  324.                 Dialog::dialogAdd(sentence);
  325.                 sentence = 0;
  326.                 sentence[0] = "I'll continue my search.";
  327.                 Dialog::dialogAdd(sentence);
  328.  
  329.                 Dialog::dialogStart(ZOB_DIM_COLOR,ZOB_COLOR);
  330.                 do breakScript() while(selectedSentence < 0);
  331.                 Dialog::dialogHide();
  332.                 cutscene() {
  333.                     sentence = dialogList[selectedSentence];
  334.                     egoSay("%s{sentence}");
  335.                     waitForMessage();
  336.                     switch(selectedSentence) {
  337.                     case 0:
  338.                         try {
  339.                         actorSay(commanderZif,"Get artifact.");
  340.                         waitForMessage();
  341.                         actorSay(commanderZif,"We need to leave orbit quickly.");
  342.                         waitForMessage();
  343.                         egoSay("I'll see what I can do.");
  344.                         waitForMessage();
  345.                         }
  346.                         override {
  347.                             if(VAR_OVERRIDE) {
  348.                                 stopTalking();
  349.                             }
  350.                         }
  351.                         break;
  352.                     case 1:
  353.                         actorSay(commanderZif,"Very good.");
  354.                         break;
  355.                     }
  356.                     waitForMessage();
  357.                 }
  358.                 Dialog::dialogClear(1);
  359.                 if(selectedSentence == 1) break dialogLoop;
  360.             }
  361.             Dialog::dialogEnd();
  362.  
  363.     }
  364.  
  365.     object commanderZifObj {
  366.         name = "Commander Zif";
  367.         verb(int vrb,int objA,int objB) {
  368.             char* sentence;
  369.             int asked;
  370.         case TalkTo:
  371.             pauseRoaming(commanderZif);
  372.             if(SecretRoom::cubeDisappeared) {
  373.                 zobTalkToZifInSecretRoom();
  374.                 while(isScriptRunning(zobTalkToZifInSecretRoom)) breakScript();
  375.             } else {
  376.                 zobTalkToZif();
  377.                 while(isScriptRunning(zobTalkToZif)) breakScript();
  378.             }
  379.             resumeRoaming(commanderZif);
  380.             return;
  381.         case LookAt:
  382.             egoSay("My commanding officer, Commander Zif.");
  383.             return;
  384.         case Smell:
  385.             pauseRoaming(commanderZif);
  386.             egoSay("Is that a new cologne, Sir?");
  387.             waitForMessage();
  388.             actorSay(commanderZif,"I thought we got past these... feelings.");
  389.             waitForMessage();
  390.             egoSay("Sorry, Sir.");
  391.             resumeRoaming(commanderZif);
  392.             return;
  393.         }
  394.  
  395.     }
  396.  
  397.     object ensignZobObj {
  398.         name = "Ensign Zob";
  399.     }
  400.     
  401.  
  402. }
  403.