Chapter 8: Advanced use of control areas
The main set of SCI tutorials shows that the way to check if the ego is on a particular control area is the following:
(instance RoomScript of Script
(if(== (send gEgo:onControl()) ctlGREEN)
If the ego is on GREEN, then he is sent to a new room.
That’s only part of the story. The value returned by onControl() is actually a bit mask, which can contain any combination of the following values:
These are defined in sci.sh:
(define ctlBLACK $0001)
(define ctlNAVY $0002)
(define ctlGREEN $0004)
(define ctlTEAL $0008)
(define ctlMAROON $0010)
(define ctlPURPLE $0020)
(define ctlBROWN $0040)
(define ctlSILVER $0080)
(define ctlGREY $0100)
(define ctlBLUE $0200)
(define ctlLIME $0400)
(define ctlCYAN $0800)
(define ctlRED $1000)
(define ctlFUCHSIA $2000)
(define ctlYELLOW $4000)
(define ctlWHITE $8000)
This makes sense, because the “footprint” of the ego (or any Act class) is actually a two-dimensional area, not a single point. Therefore, he may be on several colours at once.
To detect if the ego is completely on one colour do the following:
(if (== (send gEgo:onControl()) ctlGREEN)
// Ego is completely on green (no part of his footprint hits black, even).
To detect if some part of the ego’s footprint is touching a particular colour:
(if (& (send gEgo:onControl()) ctlGREEN)
// Part of ego is touching green.
To detect if the ego is touching one or more of ctlGREEN and ctlCYAN, do the following:
(if (& (send gEgo:onControl()) (| ctlGREEN ctlCYAN))
// Ego is touching green or cyan.
To detect if the ego is touching both ctlGREEN and ctlCYAN exclusively, do the following:
(if (== (send gEgo:onControl()) (| ctlGREEN ctlCYAN))
// Ego is green and cyan, but no other colours.
Basically, just remember it is a bit-mask, so the “&” and “|” operators are your friends.
|< Prev||Back to Tutorials|