Community
SCI Programming => SCI Syntax Help => Topic started by: OmerMor on July 24, 2015, 07:01:05 AM
-
Akril from the SHP forums found an interesting view in KQ6, see here:
http://www.sierrahelp.com/forums/viewtopic.php?f=6&t=4311 (http://www.sierrahelp.com/forums/viewtopic.php?f=6&t=4311)
The view number is 257, and it is only referenced from room 250 in the CD version of the game.
Here's the decompiled room script:
(version 2)
(include "sci.sh")
(exports
0 rm250
)
(use "Main")
(use "walkEgoInScr")
(use "NewRoomCue")
(use "n913")
(use "MessageObj")
(use "Scaler")
(use "PolyPath")
(use "Polygon")
(use "CueObj")
(use "Cycle")
(use "View")
(use "Obj")
(script 250)
(local
local0 = -1
local1[2]
local3
local4
)
(procedure (localproc_149a)
return == (beauty:script) roseTendingScr
)
(procedure (localproc_14a9)
return
(if (localproc_149a())
(if (proc913_0(37))
10
)(else
12
)
)(else
11
)
)
(instance public rm250 of KQ6Room
(properties
noun 3
picture 250
horizon 0
east 240
south 240
west 260
)
(method (init param1)
(send global2:addObstacle((send ((Polygon:new())):
type(2)
init(369 -60 369 169 319 169 65 110 0 110 0 -60)
yourself()
)
(send ((Polygon:new())):
type(0)
init(-40 125 40 125 201 189 201 229 -40 229)
yourself()
)
(send ((Polygon:new())):
type(2)
init(0 161 84 162 103 186 176 186 176 189 0 189)
yourself()
)
))
(send gEgo:
init()
setScale(Scaler 100 67 153 109)
)
(super:init(rest param1))
(if (== gGArrayScriptGetValue 260)
proc12_1(8 116)
)(else
proc12_1(272 187 -50)
)
(houseDoor:init())
(gate:init())
(genericFeatures:init())
(houseRoses:init())
(palmTrees:init())
(featureToBeIgnored:init())
(send (ScriptID(10 4)):
onMeCheck(8)
init()
)
(leaves:init())
(if (>= (send gKq6:_detailLevel) 2)
(leaves:setScript(ScriptID(13 0)))
)
(if ((send gEgo:has(37)) and not proc913_0(43))
(beauty:init(1))
)(else
(if (((<> global154 global153) and (<= global155 3)) and not proc913_0(43))
(beauty:
init(0)
setScript(
(if (proc999_5(++global155 3 4))
rmAct3and4Scr
)(else
rmAct1and2Scr
)
)
)
)
)
(send global102:
number(250)
loop(-1)
play()
)
)
(method (dispose param1)
= global154 global153
proc913_2(59)
(super:dispose(rest param1))
DisposeScript(964)
DisposeScript(13)
)
(method (doVerb theVerb param2)
(if (== theVerb 1)
(send gKq6Messager:say(noun theVerb
(if (< global153 5)
26
)(else
27
)
))
1
)(else
(super:doVerb(theVerb rest param2))
)
)
(method (edgeToRoom param1 param2)
(var temp0)
= temp0 1
(switch (param1)
(case 3
proc12_0(param1 -50)
return 0
)
(case 2
proc12_0(3 -50)
return 0
)
(case 4
proc12_0(param1)
return 0
)
(default
= temp0 0
(super:edgeToRoom(param1 rest param2))
)
)
return
(if (temp0)
(beauty:setScript(0))
(send global102:fade())
)(else
0
)
)
(method (scriptCheck param1 param2)
(var temp0, temp1)
= temp0 0
(switch (param1)
(case 87
(if ((send gNewEventHandler:contains(beauty)))
(send gKq6Messager:say(0 0 2 0 0 899))
)(else
= temp0 1
)
)
(case 85
= temp1 (send gNewEventHandler:contains(beauty))
(if (temp1 and localproc_149a())
(CueObj:
state(0)
cycles(0)
client(beauty)
theVerb(31)
)
(send gEgo:setMotion(PolyPath (beauty:approachX) (beauty:approachY) CueObj))
)(else
(if (temp1)
(beauty:doVerb(31 rest param2))
)(else
= temp0 1
)
)
)
(case 93
(if ((send gNewEventHandler:contains(beauty)))
(send gKq6Messager:say(7 0 16 0 0 0))
)(else
= temp0 1
)
)
(default
= temp0 1
)
)
return temp0
)
)
(instance roomConv of Conversation
(properties)
)
(instance rmAct1and2Scr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
proc913_1(59)
(send client:
view(253)
loop(2)
cel(0)
posn(213 81)
setCycle(End self)
)
)
(case 1
(send client:
loop(3)
cel(0)
setCycle(End self)
)
)
(case 2
(send client:
cel(0)
posn(202 88)
setCycle(End self)
)
)
(case 3
(send client:
cel(0)
posn(194 94)
setCycle(End self)
)
)
(case 4
(send client:
loop(4)
cel(0)
posn(191 96)
setCycle(End self)
)
)
(case 5
= seconds (= register Random(1 9))
)
(case 6
(send client:
loop(5)
cel(0)
posn(174 97)
setCycle(End self)
)
)
(case 7
(send client:
loop(6)
cel(0)
)
= seconds (- 10 register)
)
(case 8
(houseDoor:
noun(23)
view(255)
loop(0)
cel(0)
setCycle(End self)
)
(send global105:
number(901)
loop(1)
play()
)
)
(case 9
= ticks 12
)
(case 10
(houseDoor:
loop(1)
cel(0)
setCycle(End self)
)
)
(case 11
= cycles 2
)
(case 12
(houseDoor:
loop(2)
cel(0)
)
= cycles 2
)
(case 13
(if (== global155 1)
= register 4
)(else
= register 5
)
(send gKq6Messager:say(1 0 register 1 self))
)
(case 14
(send gKq6Messager:say(1 0 register 2 self))
)
(case 15
(if (<> register 4)
(houseDoor:setCycle(End self))
)(else
++state
= ticks 1
)
)
(case 16
= cycles 2
)
(case 17
(send gKq6Messager:say(1 0 register 3 self))
)
(case 18
(if (== register 4)
(houseDoor:setCycle(End self))
)(else
++state
= ticks 1
)
)
(case 19
= cycles 2
)
(case 20
(send gKq6Messager:say(1 0 register 4 self))
)
(case 21
(if (<> register 4)
= cycles 1
)(else
(send gKq6Messager:say(1 0 register 5 self))
)
)
(case 22
(send client:setScript(rmEndofScriptsScr))
)
)
)
)
(instance rmAct3and4Scr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
proc913_1(59)
(send client:
view(253)
loop(4)
cel(7)
posn(191 96)
)
= cycles 1
)
(case 1
= seconds (= register Random(1 9))
)
(case 2
(send client:
loop(5)
cel(0)
posn(174 97)
setCycle(End self)
)
)
(case 3
(send client:
loop(6)
cel(0)
)
= seconds (- 10 register)
)
(case 4
(houseDoor:
noun(23)
view(255)
loop(0)
cel(0)
setCycle(End self)
)
(send global105:
number(901)
loop(1)
play()
)
)
(case 5
= cycles 2
)
(case 6
(if (== global155 3)
= register 6
(houseDoor:
loop(1)
cel(0)
setCycle(End self)
)
)(else
= register 7
= state (+ state 2)
= ticks 1
)
)
(case 7
= cycles 2
)
(case 8
(houseDoor:
loop(2)
cel(0)
)
= cycles 2
)
(case 9
(send gKq6Messager:say(1 0 register 0 self))
)
(case 10
(send client:setScript(rmEndofScriptsScr))
)
)
)
)
(instance rmGiveRoseScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(send gEgo:put(38 gArrayScriptGetValue))
(send gKq6:handsOff())
(send (ScriptID(10 0)):setIt(128))
(if (proc913_1(37))
= register 20
)(else
= register 19
(send gKq6:givePoints(2))
proc913_2(47)
)
(beauty:setScript(0))
(send gKq6Messager:say(6 71 register 1 self))
)
(case 1
(if (== register 19)
(send gKq6Messager:say(6 71 register 2 self))
)(else
(self:cue())
)
)
(case 2
(send gEgo:
setSpeed(6)
view(251)
loop(0)
cel(0)
posn(250 154)
normal(0)
setCycle(CT 4 1 self)
)
)
(case 3
(beauty:
view(251)
loop(1)
cel(0)
setCycle(CT 3 1 self)
)
)
(case 4
(beauty:setCycle(End self))
(send gEgo:cel(5))
)
(case 5
(send gEgo:
reset(0)
setSpeed(6)
posn((beauty:approachX) (beauty:approachY))
)
= seconds 2
)
(case 6
(beauty:
loop(2)
cel(0)
setCycle(End self)
)
)
(case 7
(send gKq6Messager:
say(6 71 register
(if (== register 19)
3
)(else
2
)
self)
oneOnly(0)
)
)
(case 8
(beauty:setScript(roseTendingScr))
(send gKq6:handsOn())
(self:dispose())
)
)
)
)
(instance roseTendingScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(send client:
view(251)
loop(4)
cel(0)
)
= cycles 1
)
(case 1
= seconds Random(2 5)
)
(case 2
(send client:setCycle(End self))
)
(case 3
= seconds Random(2 5)
)
(case 4
(send client:setCycle(Beg self))
)
(case 5
= state 0
= cycles 1
)
)
)
)
(instance turnScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
0
)
(case 1
= register 1
(send gEgo:setHeading(register self))
)
(case 2
(self:dispose())
)
)
)
)
(instance rmGiveRingScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(send gEgo:put(37))
(send gKq6:handsOff())
(send gKq6:givePoints(2))
(beauty:
setScript(0)
setPri(2)
view(252)
posn(290 158)
setHeading(270 self)
)
= register 0
)
(case 1
(roomConv:
add(-1 6 69 10 1)
add(-1 6 69 10 2)
add(-1 6 69 10 3)
add(-1 6 69 10 4)
add(-1 6 69 10 5)
add(-1 6 69 10 6)
add(-1 6 69 10 7)
add(-1 6 69 10 8)
add(-1 6 69 10 9)
add(-1 6 69 10 10)
add(-1 6 69 10 11)
add(-1 6 69 10 12)
add(-1 6 69 10 13)
add(-1 6 69 10 14)
add(-1 6 69 10 15)
init(self)
)
)
(case 2
(beauty:
view(252)
setCycle(Walk)
setMotion(MoveTo 147 122 self)
)
(self:setScript(turnScr 0 90))
(send gEgo:setMotion(MoveTo 121 154 turnScr))
)
(case 3
(beauty:hide())
(send global105:
number(906)
loop(1)
play()
)
(gate:
view(253)
loop(1)
cel(0)
setCycle(CT 5 1 self)
)
)
(case 4
(gate:setCycle(End))
(beauty:
show()
setPri(-1)
posn(110 131)
setMotion(MoveTo 159 158 self)
)
)
(case 5
(if (not (turnScr:register))
(turnScr:caller(self))
)(else
= cycles 2
)
)
(case 6
(beauty:loop(1))
(send gEgo:loop(0))
= cycles 2
)
(case 7
(roomConv:
add(-1 6 69 10 16)
add(-1 6 69 10 17)
add(-1 6 69 10 18)
init(self)
)
)
(case 8
(send gEgo:
normal(0)
setSpeed(6)
view(253)
loop(10)
posn(127 157)
setCycle(CT 4 1 self)
)
)
(case 9
(beauty:
view(253)
loop(0)
cel(0)
posn(158 157)
setCycle(CT 3 1 self)
)
)
(case 10
(beauty:setCycle(End self))
(send gEgo:setCycle(End self))
)
(case 11
0
)
(case 12
(send gKq6Messager:say(6 69 10 19 self))
)
(case 13
(beauty:
view(252)
setCycle(Walk)
cycleSpeed(5)
moveSpeed(5)
setMotion(MoveTo 320 180)
)
(send gEgo:
reset(0)
posn(121 154)
setSpeed(9)
setMotion(MoveTo 300 190 self)
)
= ticks 60
)
(case 14
(houseDoor:
view(255)
loop(2)
cel(0)
setCycle(End self)
)
)
(case 15
(send gKq6Messager:say(6 69 10 20 self))
)
(case 16
= cycles 10
)
(case 17
(send gKq6Messager:say(6 69 10 21 self))
)
(case 18
(send global102:fade())
(send global2:newRoom(540))
)
)
)
)
(instance rmEndofScriptsScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(houseDoor:
noun(19)
view(255)
loop(0)
cel((houseDoor:lastCel()))
setCycle(Beg houseDoor)
)
(send client:
posn(174 97)
loop(7)
cel(0)
setCycle(End self)
)
)
(case 1
(send client:
setLoop(8)
posn(189 85)
setCycle(Walk)
setMotion(MoveTo 216 66 self)
)
)
(case 2
(houseDoor:setCycle(End self))
(send global105:
number(901)
loop(1)
play()
)
)
(case 3
(send client:
setLoop(-1)
loop(9)
cel(0)
setCycle(End self)
)
)
(case 4
(houseDoor:setCycle(Beg self))
)
(case 5
(send global105:
number(902)
loop(1)
play()
)
proc913_2(59)
(send client:dispose())
)
)
)
)
(instance useFluteOnBeautyScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(send gKq6:handsOff())
= register localproc_14a9()
(if (<> register 11)
++state
)
= cycles 2
)
(case 1
(self:setScript(ScriptID(85) self))
)
(case 2
(switch (register)
(case 11
(send gKq6Messager:say(1 31 0 0 self 0))
)
(case 10
(send gKq6Messager:say(6 31 12 1 self))
)
(default
++state
(send gKq6Messager:say(6 31 register 0 self))
)
)
)
(case 3
(send gKq6Messager:say(
(if (== register 10)
6
)(else
2
)
31 register 0 self))
)
(case 4
(send gKq6:handsOn())
(self:dispose())
)
)
)
)
(instance giveAllScr of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(send gKq6:handsOff())
= register localproc_14a9()
(send gKq6Messager:say(6 0
(if (== register 12)
10
)(else
register
)
1 self))
)
(case 1
(if (<> register 11)
(send gKq6Messager:say(6 0 register
(if (== register 12)
1
)(else
2
)
self))
)(else
= cycles 2
)
)
(case 2
(send gKq6:handsOn())
(self:dispose())
)
)
)
)
(instance scriptToBeIgnored of Script
(properties)
(method (changeState newState)
(switch (= state newState)
(case 0
(send gKq6:handsOff())
(send client:
view(255)
loop(0)
cel(0)
)
= cycles 2
)
(case 1
(send client:setCycle(End self))
)
(case 2
= cycles 2
)
(case 3
(send client:
view(257)
loop(0)
cel(0)
setCycle(End self)
)
)
(case 4
= cycles 2
)
(case 5
(send client:
loop(1)
cel(0)
setCycle(Fwd)
)
= ticks 300
)
(case 6
(send client:
loop(0)
cel(10)
setCycle(Beg self)
)
)
(case 7
= cycles 2
)
(case 8
(send client:
view(255)
loop(0)
cel(3)
setCycle(Beg self)
)
)
(case 9
(send client:
view(250)
loop(1)
cel(0)
)
(send gKq6:handsOn())
(self:dispose())
)
)
)
)
(instance beauty of Actor
(properties
x 214
y 81
noun 6
sightAngle 45
view 252
signal $5000
)
(method (init param1 param2)
(super:init(rest param2))
(if (param1)
(self:
view(251)
posn(285 156)
loop(4)
setPri(5)
approachX(247)
approachY(153)
approachVerbs(2 71)
setScale(Scaler 100 67 153 109)
setScript(roseTendingScr)
)
)(else
(self:setCycle(Walk))
)
)
(method (doVerb theVerb)
(if (proc999_5(theVerb 42 27 28 7 32 12 65 33) and localproc_149a())
(send gKq6Messager:say(noun theVerb 18))
)(else
(if (proc999_5(theVerb 57 58 59 60 96 43 56) and localproc_149a())
(send gKq6Messager:say(noun 43
(if (proc913_0(37))
10
)(else
12
)
))
)(else
(if (proc999_5(theVerb 66 70) and localproc_149a())
(send gKq6Messager:say(noun 66
(if (proc913_0(37))
10
)(else
12
)
))
)(else
(if (== theVerb 31)
(send global2:setScript(useFluteOnBeautyScr))
)(else
(if (proc999_5(theVerb 74 73 55) and localproc_149a())
(send gKq6Messager:say(noun 55 18))
)(else
(if ((== theVerb 71) and localproc_149a())
(send global2:setScript(rmGiveRoseScr))
)(else
(if (== theVerb 69)
(if (proc913_0(37))
(send global2:setScript(rmGiveRingScr))
)(else
(send gKq6Messager:say(noun theVerb 12))
)
)(else
(if (== theVerb 2)
(send gKq6Messager:say(noun theVerb
(if (localproc_149a())
(if (proc913_0(37))
(+ 22
(if (< local0 3)
++local0
)(else
local0
)
)
)(else
(if (proc913_0(47))
14
)(else
13
)
)
)(else
11
)
))
proc913_1(47)
)(else
(if (== theVerb 1)
(send gKq6Messager:say(noun theVerb
(if (proc913_1(70))
(if (proc913_0(37))
10
)(else
9
)
)(else
21
)
))
)(else
(if (== theVerb 5)
(send gKq6Messager:say(noun theVerb
(if (localproc_149a())
18
)(else
11
)
))
)(else
(send global2:setScript(giveAllScr))
)
)
)
)
)
)
)
)
)
)
)
)
(instance gate of Prop
(properties
x 118
y 108
noun 7
sightAngle 90
view 250
signal $4000
)
(method (doVerb theVerb param2)
(if (== theVerb 2)
++local4
)
(super:doVerb(theVerb rest param2))
)
)
(instance houseDoor of Prop
(properties
x 221
y 68
noun 19
sightAngle 90
view 250
loop 1
priority 1
signal $0010
)
(method (doVerb theVerb param2)
(if (((== local4 3) and (== local3 7)) and (== theVerb 2))
= local4 0
= local3 0
(self:setScript(scriptToBeIgnored))
)(else
(super:doVerb(theVerb rest param2))
)
)
(method (cue)
(self:
view(250)
loop(1)
cel(0)
)
(send global105:
number(902)
loop(1)
play()
)
)
)
(instance leaves of Prop
(properties
x 60
y 181
view 256
priority 15
signal $5010
)
(method (onMe)
return 0
)
)
(instance featureToBeIgnored of Feature
(properties
x 100
y 320
noun 3
nsLeft 3
nsBottom 7
nsRight 9
)
(method (init param1)
(super:init(rest param1))
= sightAngle 26505
)
(method (doVerb theVerb param2)
(if (== local4 3)
(switch (theVerb)
(case 5
= local3 (| local3 $0001)
)
(case 2
= local3 (| local3 $0002)
)
(case 1
= local3 (| local3 $0004)
)
)
)
(super:doVerb(theVerb rest param2))
)
)
(instance palmTrees of Feature
(properties
noun 15
onMeCheck $0004
)
)
(instance houseRoses of Feature
(properties
noun 22
onMeCheck $1000
)
)
(instance genericFeatures of Feature
(properties
sightAngle 40
)
(method (onMe param1)
(var temp0)
= noun
(switch (= temp0 OnControl(4 (send param1:x) (send param1:y)))
(case 2
8
)
(case 1024
21
)
(case 16
12
)
(case 32
11
)
(case 64
17
)
(case 128
14
)
(case 256
13
)
(case 512
18
)
(default
0
)
)
)
)
Can you help me figure out what would trigger this view?
-
So the view is of the prop instance houseDoor and is triggered... it looks like when you talk (verb 2) to the door... after two local variables have also been set
(method (doVerb theVerb param2)
(if (((== local4 3) and (== local3 7)) and (== theVerb 2))
= local4 0
= local3 0
(self:setScript(scriptToBeIgnored))
)(else
(super:doVerb(theVerb rest param2))
)
)
It appears as though local3 is only changed when you click walk (verb 3) on this feature which I am not quite sure where it actually is... after local4 has been set to 3
(instance featureToBeIgnored of Feature
(properties
x 100
y 320
noun 3
nsLeft 3
nsBottom 7
nsRight 9
)
(method (init param1)
(super:init(rest param1))
= sightAngle 26505
)
(method (doVerb theVerb param2)
(if (== local4 3)
(switch (theVerb)
(case 5
= local3 (| local3 $0001)
)
(case 2
= local3 (| local3 $0002)
)
(case 1
= local3 (| local3 $0004)
)
)
)
(super:doVerb(theVerb rest param2))
)
)
local4, appears to be associated with the gate, increasing each time that you talk (verb 2) to it?
(instance gate of Prop
(properties
x 118
y 108
noun 7
sightAngle 90
view 250
signal $4000
)
(method (doVerb theVerb param2)
(if (== theVerb 2)
++local4
)
(super:doVerb(theVerb rest param2))
)
)
So you figure out where featureToBeIgnored is... and there you go
-
Thanks Cloudee!
So you figure out where featureToBeIgnored is... and there you go
So where is it? IIUC, it is located outside the screen borders (100,320).
-
By default, the onMe() method actually uses nsLeft/Bottom/Right/Top in order to detect if something is "onMe". The x/y properties are used to make the ego face a particular direction when interacting with it.
So it seems like clicking in this box should activate it: (3, 0) - (9, 7). Basically near the top left of the screen.
My confusion is how does the house door get to where it needs to be? Its default position is (221, 68), which is on the main wall of the house, which doesn't look right at all (haven't played the game, but if I had to guess, it's down on the bottom right along hte path?)
-
The house door is on the house in the middle of the screen. 221, 68 looks like the right coordinates. I guess you're confusing x and y values?
-
Oh, no, I was confusing the loops. House door is loop 1, now I get it. I was looking at the gate.
-
So I am not sure how I got this "It appears as though local3 is only changed when you click walk (verb 3)"
As I look at it again, if local4 = 3 ... which we get to by clicking talk (I think lol) on the gate 3 times then it checks the verb used on the ignore feature box
(method (doVerb theVerb param2)
(if (== local4 3)
(switch (theVerb)
(case 5
= local3 (| local3 $0001)
)
(case 2
= local3 (| local3 $0002)
)
(case 1
= local3 (| local3 $0004)
)
)
)
(super:doVerb(theVerb rest param2))
)
-
Very obscure - nice find. So you need to click talk on the gate three times, then three different verbs on that feature, then finally talk on the door? Hmm, looks like you're going to have a problem with the feature - it seems to be obscured by the icon bar. It's easy to trigger (i.e. cheat) with ScummVM though.
-
So with your help, I finally nailed it:
https://www.youtube.com/watch?v=jj8VrFLcflg (https://www.youtube.com/watch?v=jj8VrFLcflg)
;D
lskovlum: it's not obscured by the icon bar - the icon bar is automatically hidden.
-
hahaha, that's awesome!