SCI Programming.com
Welcome, Guest. Please login or register.
December 18, 2017, 09:51:47 AM
Home  >  Tutorials  >  Chapter 11: Creating the Point and Click Script
Chapter 11: Creating the Point and Click Script

I will come in and add in a little description of what we are doing and why but as I seem to have trouble finding the time to do that right now, here is our point and click menu script, save as resource 950.

Code:
//******************************************************************************
// PnCMenu.sc
// Contains the script which runs our point and click menu. 
//******************************************************************************
(include "sci.sh")(include "game.sh")                               (script 950)
//******************************************************************************
(use "main")(use "controls")(use "cycle")(use "game")(use "feature")
(use "obj")(use "gauge")
//******************************************************************************
(local
       txtstring[50]        // used to display and update any printed variables
)
//******************************************************************************	
(instance public PnCMenu of Rgn
(properties)
  (method (init)
  (super:init())

  (self:setScript(PnCMenuScript))

  (menuTop:setPri(15)ignoreActors()init())
  (menuBot:setPri(15)ignoreActors()init())
  (helpbutton:setPri(15)ignoreActors()init())
    (switch(menuOption) // depending on which menu was last visible, repeat it 
      (case 0 (menuZero:setPri(15)ignoreActors()cel(1)init())       // action menu button highlight
      	      (menuOne:setPri(15)ignoreActors()cel(2)init())        // system menu button unhighlight
      	      (walkIcon:loop(0)cel(0)setPri(15)ignoreActors()init())//walk
      	      (talkIcon:setPri(15)ignoreActors()init()loop(0))      // talk
      	      (getIcon:loop(0)setPri(15)ignoreActors()init())       // hand
      	      (lookIcon:loop(0)setPri(15)ignoreActors()init())      // look
      	      (actionIcon:loop(0)setPri(15)ignoreActors()init())    // inventory
      	      )// end case 0
      (case 1 (menuZero:setPri(15)ignoreActors()cel(0)init())
      	      (menuOne:setPri(15)ignoreActors()cel(3)init())
      	      (walkIcon:loop(1)cel(0)setPri(15)ignoreActors()init()) // speed/ volume controls
      	      (talkIcon:setPri(15)ignoreActors()init()loop(1))       // restart
      	      (getIcon:loop(1)setPri(15)ignoreActors()init())        // load game
      	      (lookIcon:loop(1)setPri(15)ignoreActors()init())       // save game
      	      (actionIcon:loop(1)setPri(15)ignoreActors()init())     // quit
      	      )// end case 1
    )// end menuOption switch
  )// end init method
)// end public Instance

(instance PnCMenuScript of Script
(properties)
  (method (doit)
  (super:doit())
    (switch(menuOption)
    (case 0 (menuZero:cel(1))
    	    (menuOne:cel(2))
    	     (if(== gCurrentCursor 999)(walkIcon:loop(0)cel(1)))
    	     (else (walkIcon:loop(0)cel(0)))
    	     (if(== gCurrentCursor 996)(talkIcon:loop(0)cel(3)))
    	     (else (talkIcon:loop(0)cel(2)))
    	     (if(== gCurrentCursor 995)(getIcon:loop(0)cel(5)))
    	     (else (getIcon:loop(0)cel(4)))
    	     (if(== gCurrentCursor 998)(lookIcon:loop(0)cel(7)))
    	     (else (lookIcon:loop(0)cel(6)))
    	     (if(== gCurrentCursor itemIcon)(actionIcon:loop(0)cel(9)))
    	     (else (actionIcon:loop(0)cel(8))))
    (case 1 (menuZero:cel(0))
    	    (menuOne:cel(3))
    	    (walkIcon:loop(1)cel(0))
    	    (talkIcon:loop(1)cel(1))
    	    (getIcon:loop(1)cel(2))
    	    (lookIcon:loop(1)cel(3))
    	    (actionIcon:loop(1)cel(4)))
    )// end switch
  )// end method

  (method (handleEvent pEvent)
  (super:handleEvent(pEvent))
    (if(==(send pEvent:type())evMOUSEBUTTON)
      // handles the mouses right clicks
      (if(& (send pEvent:modifiers) emRIGHT_BUTTON)
       (if(== gProgramControl TRUE)(send pEvent:claimed(TRUE)))// do nuthin
       (else (send pEvent:claimed(TRUE))
        (switch(gCurrentCursor)
         (case itemIcon  SetCursor(999 HaveMouse()) = gCurrentCursor 999)// item to walk
         (case 999 SetCursor(996 HaveMouse()) = gCurrentCursor 996)// walk to talk
         (case 996 SetCursor(995 HaveMouse()) = gCurrentCursor 995)// talk to touch
         (case 995 SetCursor(998 HaveMouse()) = gCurrentCursor 998)// touch to look
         (case 998 (if (== itemIcon 900)
       		     SetCursor(999 HaveMouse()) = gCurrentCursor 999)// look to walk if no item
       		     (else
       		     SetCursor(itemIcon HaveMouse()) = gCurrentCursor itemIcon)// look to item
	     )// end case
        )// end switch
       )// end else
      )// end right button
      // handles the mouses left clicks
      (if(not(& (send pEvent:modifiers) emRIGHT_BUTTON))
       (if(== gProgramControl TRUE)(send pEvent:claimed(TRUE)))// do nuthin
       (else                       // handle the clicks on our menu buttons
       	 (if((>(send pEvent:x) (getIcon:nsLeft))and // hand or restore button
             (< (send pEvent:x) (getIcon:nsRight))and
             (> (send pEvent:y) (getIcon:nsTop))and
             (< (send pEvent:y) (getIcon:nsBottom)))
               (switch(menuOption)
       	         (case 0 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       	                 SetCursor(995 HaveMouse()) = gCurrentCursor 995)
                 (case 1 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
                         (send gGame:restore()))
               )// end switch
       	 )// end click on view
       (else
         (if((>(send pEvent:x) (lookIcon:nsLeft))and
             (< (send pEvent:x) (lookIcon:nsRight))and
       			(> (send pEvent:y) (lookIcon:nsTop))and
       			(< (send pEvent:y) (lookIcon:nsBottom)))
       			(switch(menuOption)
       				(case 0 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       					    SetCursor(998 HaveMouse()) = gCurrentCursor 998)
       			    (case 1 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       			    	    (send gGame:save()))
       			 )// end switch
       		  )// end click on view
       		  
       		  
       (else
         (if((>(send pEvent:x) (talkIcon:nsLeft))and
             (< (send pEvent:x) (talkIcon:nsRight))and
             (> (send pEvent:y) (talkIcon:nsTop))and
             (< (send pEvent:y) (talkIcon:nsBottom)))
       			            (switch(menuOption)
       			              (case 0 // action menu - Talk
       			              	(send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       			              	SetCursor(996 HaveMouse())
       			              	= gCurrentCursor 996
       			              )// end case 0
       			              (case 1  // system menu - restart
       			              	(send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       			              	 (if(Print(950 25 #title "Restart" #font gDefaultFont #button "Restart" 1 #button " Oops " 0))
       			              	 	(send gGame:restart())
       			              	 )// end if
       			              )// end case 1
       			            )// end switch
       			)// end click on view
       (else
         (if((>(send pEvent:x) (walkIcon:nsLeft))and
             (< (send pEvent:x) (walkIcon:nsRight))and
             (> (send pEvent:y) (walkIcon:nsTop))and
             (< (send pEvent:y) (walkIcon:nsBottom)))
       			             (switch(menuOption)
       			               (case 0 // action menu - Walk
       			               	(send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       			               	SetCursor(999 HaveMouse()) 
       			               	= gCurrentCursor 999
       			               )// end case 0
       			               (case 1 // system menu - speed/volume
       			               	(send pEvent:type(evMOUSEBUTTON) claimed(TRUE))  
       			               	= sGauge (Gauge:new()) 
       			               	= vGauge (Gauge:new())  
       			               	= pncSpeed (send sGauge:text("Game Speed")
       			               		     description("Use the mouse or the left and right arrow keys to select the game speed.")
       			               		                    higher(" + ")
       			               		                    lower(" - ")
       			               		                    normal(NORMAL_SPEED)
       			               		                    doit(- 15 gSpeed)
       			               		       )// end sgauge info
       			               	(send gGame:setSpeed(- 15 pncSpeed))
       			               	Wait(30)  
       			               	= pncVolume (send vGauge:text("Sound Volume")
       			                                         description("Use the mouse or the left and right arrow keys to adjust the volume.")
       			                                         higher(" + ")
       			                                         lower(" - ")
       			                                         normal(15)
       			                                         doit(DoSound(sndVOLUME pncVolume))
       			                            )// end vgauge info 
       			               	DoSound(sndVOLUME pncVolume)
       			               )// end case 1
       			             )// end switch
       			)// end click on view
       (else
         (if((>(send pEvent:x) (actionIcon:nsLeft))and
             (< (send pEvent:x) (actionIcon:nsRight))and
             (> (send pEvent:y) (actionIcon:nsTop))and
             (< (send pEvent:y) (actionIcon:nsBottom)))
       		                 (switch(menuOption)
       		                   (case 0 // action menu - Inventory
       		                   	(send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       				             (if(== canTab TRUE)
                                    = gPreviousCursor gCurrentCursor
                                    (send gRoom:newRoom(500))
                                 )
                                 (else Print("Not right now man, sorry!"))
                               )// end case 0
                               (case 1 // system menu - quit
                               	(send pEvent:type(evMOUSEBUTTON) claimed(TRUE)) 
                               	(if(Print(950 26 #title "Quit"  #font gDefaultFont #button " Quit " 1 #button " Oops " 0))
                               		= gQuitGame TRUE
                               	)
                               )// end case 1
                              )// end switch
            )// end click on view
       (else
         (if((>(send pEvent:x) (menuZero:nsLeft))and // clicks on menu selection - action
             (< (send pEvent:x) (menuZero:nsRight))and
             (> (send pEvent:y) (menuZero:nsTop))and
             (< (send pEvent:y) (menuZero:nsBottom))) 
             = menuOption 0
             (send pEvent:type(evMOUSEBUTTON) claimed(TRUE)) 
       	 )// end click on view
       (else(if((>(send pEvent:x) (menuOne:nsLeft))and // clicks on menu selection - system
       			(< (send pEvent:x) (menuOne:nsRight))and
       			(> (send pEvent:y) (menuOne:nsTop))and
       			(< (send pEvent:y) (menuOne:nsBottom))) 
       			   = menuOption 1 
       			   (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       	    )// end click on view
       (else
       	 (if((>(send pEvent:x) (helpbutton:nsLeft))and
       	 	 (< (send pEvent:x) (helpbutton:nsRight))and
       	 	 (> (send pEvent:y) (helpbutton:nsTop))and
       	 	 (< (send pEvent:y) (helpbutton:nsBottom)))
       	 	 Format(@txtstring 950 0 gGameTitle)
       	 	 Print(@txtstring gGameTitle #title "Help")
       	 	 Print(950 1 #title "Help")
       	 	 Print(950 2 #title "Help")
       	 	 Print(950 3 #title "Help")
       	 	 Print(950 4 #title "Help")
       	 	 Format(@txtstring 950 5 gGameTitle)
       	 	 Print(@txtstring gGameTitle #title "Help")
       	 	 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))
       	 )
//****************************************************************************
//                        Default Action Clicks                                 
//****************************************************************************
// View                                                       // clicks on ego
(else
(if((> (send pEvent:x) (send gEgo:nsLeft))and
	(< (send pEvent:x) (send gEgo:nsRight))and
	(> (send pEvent:y) (send gEgo:nsTop))and
	(< (send pEvent:y) (send gEgo:nsBottom)))
  (switch(gCurrentCursor)
    (case 999 (send pEvent:type(evMOUSEBUTTON) claimed(FALSE))) // walk
    (case 998 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))   // look
    	  (switch(Random(0 2))
    	  	(case 0 Print(950 10))
    	  	(case 1 Print(950 11))
    	  	(case 2 Print(950 12))
    	  )// end random switch
    )// end case look
    (case 996 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))   // talk
    	  (switch(Random(0 2))
    	  	(case 0 Print(950 13))
    	  	(case 1 Print(950 14))
    	  	(case 2 Print(950 15))
    	  )// end random switch
    )// end case talk
    (case 995 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))  // get
    	  (switch(Random(0 2))
    	  	(case 0 Print(950 16))
    	  	(case 1 Print(950 17))
    	  	(case 2 Print(950 18))
    	  )// end random switch
    )// end case get
    (default  (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))  // item
    	  (switch(Random(0 2))
    	  	(case 0 Print(950 19))
    	  	(case 1 Print(950 20))
    	  	(case 2 Print(950 21))
    	  )// end random switch
    )// end case item
  ) // end switch
) // end if ego
//****************************************************************************
//                                                            // Room defaults
(else
  (switch(gCurrentCursor)
    (case 999 (send pEvent:type(evMOUSEBUTTON) claimed(FALSE))) // walk
    (case 998 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))Print(gRoomNumber 0))// look
    (case 996 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))Print(gRoomNumber 1))// talk
    (case 995 (send pEvent:type(evMOUSEBUTTON) claimed(TRUE))Print(gRoomNumber 2))// get
    (default  (send pEvent:type(evMOUSEBUTTON) claimed(TRUE)) // items
    	      (switch(Random(0 2))
    	      	(case 0 Print(950 22))
    	      	(case 1 Print(950 23))
    	      	(case 2 Print(950 24))
    	      )// end random switch
    )// end default case
  )// end cursor switch
)// end else room default
//******************************************************************************
                      )// end else ego default 
                    )// end else help button
                  ) // end menuone
                ) // end menuzero
              ) // end action
            ) // end walk
          ) // end talk
        ) // end look
      ) // end get
      )
  ) // end if mousebutton
 )// end method
)// end instance
/******************************************************************************/
(instance menuTop of Prop(properties x 24 y 16 view 950 loop 2 cel 0))
(instance lookIcon of Prop(properties x 24 y 46 view 950 loop 0 cel 6))
(instance getIcon of Prop(properties x 24 y 76 view 950 loop 0 cel 4))
(instance talkIcon of Prop(properties x 24 y 106 view 950 loop 0 cel 2))
(instance walkIcon of Prop(properties x 24 y 136 view 950 loop 0 cel 1))
(instance actionIcon of Prop(properties x 24 y 166 view 950 loop 0 cel 8))
(instance menuBot of Prop(properties x 24 y 182 view 950 loop 3 cel 0))

(instance menuZero of Prop(properties x 14 y 14 view 950 loop 4 cel 0))
(instance menuOne of Prop(properties x 24 y 14 view 950 loop 4 cel 1))
(instance helpbutton of Prop(properties x 34 y 14 view 950 loop 4 cel 4))
//****************************************************************************//

There it is, our Point and Click Room Script! Are you ready to actually use it in a room?
<< Prev Back to Tutorials Next >>

The SCI Programming Community
Copyright © 2007 - 2017, All Rights Reserved.