diff --git a/Scripts/Python/Kalamee.py b/Scripts/Python/Kalamee.py
new file mode 100644
index 0000000000..17691fc694
--- /dev/null
+++ b/Scripts/Python/Kalamee.py
@@ -0,0 +1,49 @@
+# /*==LICENSE==*
+#
+# CyanWorlds.com Engine - MMOG client, server and tools
+# Copyright (C) 2011 Cyan Worlds, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Additional permissions under GNU GPL version 3 section 7
+#
+# If you modify this Program, or any covered work, by linking or
+# combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+# NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+# JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+# (or a modified version of those libraries),
+# containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+# PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+# JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+# licensors of this Program grant you additional
+# permission to convey the resulting work. Corresponding Source for a
+# non-source form of such a combination shall include the source code for
+# the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+# work.
+#
+# You can contact Cyan Worlds, Inc. by email legal@cyan.com
+# or by snail mail at:
+# Cyan Worlds, Inc.
+# 14617 N Newport Hwy
+# Mead, WA 99021
+#
+# *==LICENSE==*/
+
+from Plasma import *
+from PlasmaTypes import *
+class Kalamee(ptResponder):
+ def __init__(self):
+ ptResponder.__init__(self)
+ self.id = 22020001
+ self.version = 1
diff --git a/Scripts/Python/KalameeResetJC.py b/Scripts/Python/KalameeResetJC.py
new file mode 100644
index 0000000000..6eb722d706
--- /dev/null
+++ b/Scripts/Python/KalameeResetJC.py
@@ -0,0 +1,94 @@
+# /*==LICENSE==*
+#
+# CyanWorlds.com Engine - MMOG client, server and tools
+# Copyright (C) 2011 Cyan Worlds, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Additional permissions under GNU GPL version 3 section 7
+#
+# If you modify this Program, or any covered work, by linking or
+# combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+# NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+# JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+# (or a modified version of those libraries),
+# containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+# PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+# JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+# licensors of this Program grant you additional
+# permission to convey the resulting work. Corresponding Source for a
+# non-source form of such a combination shall include the source code for
+# the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+# work.
+#
+# You can contact Cyan Worlds, Inc. by email legal@cyan.com
+# or by snail mail at:
+# Cyan Worlds, Inc.
+# 14617 N Newport Hwy
+# Mead, WA 99021
+#
+# *==LICENSE==*/
+
+from Plasma import *
+from PlasmaTypes import *
+from PlasmaVaultConstants import *
+from PlasmaNetConstants import *
+import xRandom
+from xPsnlVaultSDL import *
+
+Activator = ptAttribActivator(1, 'Activator: JC Reset Clickable')
+
+class KalameeResetJC(ptResponder):
+ __module__ = __name__
+
+ def __init__(self):
+ ptResponder.__init__(self)
+ self.id = 22100002
+ self.version = 1
+ PtDebugPrint('KalameeResetJC: initialised successfully!')
+
+ def OnFirstUpdate(self):
+ pass
+
+ def OnServerInitComplete(self):
+ pass
+
+ def OnNotify(self, state, id, events):
+ if not state:
+ return None
+ if id == Activator.id:
+ self.ResetAgeJourneyCloth()
+
+ def OnSDLNotify(self, VARname, SDLname, playerID, tag):
+ pass
+
+ def ResetAgeJourneyCloth(self):
+ ageChronNode = None
+ ageName = PtGetAgeName()
+ vault = ptVault()
+ chron = vault.findChronicleEntry('JourneyClothProgress')
+ ageChronRefList = chron.getChildNodeRefList()
+ for ageChron in ageChronRefList:
+ ageChild = ageChron.getChild()
+ ageChild = ageChild.upcastToChronicleNode()
+ if ageChild.chronicleGetName() == ageName:
+ ageChronNode = ageChild
+ break
+
+ if type(ageChronNode) != type(None):
+ PtDebugPrint('KalameeResetJC: resetting JourneyClothProgress')
+ ageChronNode.chronicleSetValue('')
+ ageChronNode.save()
+ else:
+ PtDebugPrint('KalameeResetJC: unable to find JourneyClothProgress for age!')
diff --git a/Scripts/Python/xLinkingBookDefs.py b/Scripts/Python/xLinkingBookDefs.py
index a67910af5c..772bf43210 100644
--- a/Scripts/Python/xLinkingBookDefs.py
+++ b/Scripts/Python/xLinkingBookDefs.py
@@ -268,11 +268,13 @@
"Vothol": ( 0, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpanelvothol' + LinkEnd ),
"ChisoPreniv": ( 0, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpanelchisopreniv' + LinkEnd ),
"ChisoPrenivNote": ( 0, 1.0, 1.0, FanAgeStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpanelchisopreniv' + LinkEnd ),
+ "ChisoPrenivLower": ( 0, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpanelchisolower' + LinkEnd ),
"Serene": ( 0, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpanelserene' + LinkEnd ),
"Tiam": ( 1, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + ShareHolder + LinkStart + 'xlinkpaneltiam' + LinkEnd ),
"Elonin": ( 1, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + ShareHolder + LinkStart + 'xlinkpanelelonin' + LinkEnd ),
"EderNaybree": ( 0, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpaneledernaybree' + LinkEnd ),
"FahetsHighgarden": ( 0, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + NoShare + LinkStart + 'xlinkpanelhighgarden' + LinkEnd ),
+ "Kalamee": ( 1, 1.0, 1.0, NoDRCStamp, BookStart1 + DRCStampHolder + ShareHolder + LinkStart + 'xlinkpanelkalamee' + LinkEnd ),
}
# cross-references the book name with the age and spawn point it links to
@@ -347,11 +349,13 @@
"VeeTsah": ( "VeeTsah", "LinkInPointDefault" ),
"Vothol": ( "Vothol", "LinkInPointDefault" ),
"ChisoPreniv": ( "ChisoPreniv", "LinkInPointDefault" ),
+ "ChisoPrenivLower": ( "ChisoPreniv", "LinkInLowerFloor" ),
"Serene": ( "Serene", "LinkInPointDefault" ),
"Tiam": ( "Tiam", "LinkInPointDefault" ),
"Elonin": ( "Elonin", "LinkInPointDefault" ),
"EderNaybree": ( "EderNaybree", "LinkInPointDefault" ),
"FahetsHighgarden": ( "FahetsHighgarden", "LinkInPointDefault" ),
+ "Kalamee": ( "Kalamee", "LinkInPointDefault" ),
}
#
diff --git a/Scripts/Python/xMultiDialogToggle.py b/Scripts/Python/xMultiDialogToggle.py
new file mode 100644
index 0000000000..436bc3eb91
--- /dev/null
+++ b/Scripts/Python/xMultiDialogToggle.py
@@ -0,0 +1,167 @@
+# /*==LICENSE==*
+#
+# CyanWorlds.com Engine - MMOG client, server and tools
+# Copyright (C) 2011 Cyan Worlds, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Additional permissions under GNU GPL version 3 section 7
+#
+# If you modify this Program, or any covered work, by linking or
+# combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+# NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+# JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+# (or a modified version of those libraries),
+# containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+# PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+# JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+# licensors of this Program grant you additional
+# permission to convey the resulting work. Corresponding Source for a
+# non-source form of such a combination shall include the source code for
+# the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+# work.
+#
+# You can contact Cyan Worlds, Inc. by email legal@cyan.com
+# or by snail mail at:
+# Cyan Worlds, Inc.
+# 14617 N Newport Hwy
+# Mead, WA 99021
+#
+# *==LICENSE==*/
+
+#==============================================================================#
+# #
+# Offline KI #
+# #
+# Copyright (C) 2004-2011 The Offline KI contributors #
+# See the file AUTHORS for more info about the contributors (including #
+# contact information) #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version, with or (at your option) without #
+# the Uru exception (see below). #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# Please see the file COPYING for the full GPLv3 license, or see #
+# #
+# #
+# Uru exception: In addition, this file may be used in combination with #
+# (non-GPL) code within the context of Uru. #
+# #
+#==============================================================================#
+
+from Plasma import *
+from PlasmaTypes import *
+import PlasmaControlKeys
+import string
+Activate = ptAttribActivator(1, ' clickable ', netForce=1)
+Vignettes = ptAttribString(4, 'Toggle multiple dialogs - by Name')
+SingleUser = ptAttribBoolean(5, 'One user only?', 0)
+KeyMap = {}
+KeyMap[PlasmaControlKeys.kKeyMoveForward] = PlasmaControlKeys.kKeyCamPanUp
+KeyMap[PlasmaControlKeys.kKeyMoveBackward] = PlasmaControlKeys.kKeyCamPanDown
+KeyMap[PlasmaControlKeys.kKeyRotateLeft] = PlasmaControlKeys.kKeyCamPanLeft
+KeyMap[PlasmaControlKeys.kKeyRotateRight] = PlasmaControlKeys.kKeyCamPanRight
+kExit = 99
+Vignette = None
+class xMultiDialogToggle(ptModifier,):
+
+ def __init__(self):
+ ptModifier.__init__(self)
+ self.id = 5104999
+ self.version = 1
+ minor = 0
+ self.me = self.__class__.__name__
+ self.VignetteList = []
+ print ('__init__%s v. %d.%d' % (self.me, self.version, minor))
+
+ def IGetAgeFilename(self):
+ ageInfo = PtGetAgeInfo()
+ if ageInfo is not None:
+ return ageInfo.getAgeFilename()
+ else:
+ return 'GUI'
+
+ def OnFirstUpdate(self):
+ try:
+ self.VignetteList = [i.strip() for i in Vignettes.value.split(',')]
+
+ PtDebugPrint(('%s: Dialog list = %s' % (self.me,
+ self.VignetteList)))
+ except:
+ PtDebugPrint(("ERROR: %s.OnFirstUpdate(): Couldn't process dialog list" % self.me))
+ return
+ for i in range(len(self.VignetteList)):
+ PtLoadDialog(self.VignetteList[i], self.key, self.IGetAgeFilename())
+
+ def __del__(self):
+ for i in range(len(self.VignetteList)):
+ PtUnloadDialog(self.VignetteList[i])
+
+ def OnNotify(self, state, id, events):
+ global Vignette
+ if (state and ((id == Activate.id) and PtWasLocallyNotified(self.key))):
+ Vignette = self.VignetteList[0]
+ self.IStartDialog(1)
+
+ def OnGUINotify(self, id, control, event):
+ global Vignette
+ if (event == kAction):
+ if (control.getTagID() == kExit):
+ for i in range(len(self.VignetteList)):
+ if (self.VignetteList[i] == Vignette):
+ try:
+ tmpVignette = self.VignetteList[(i + 1)]
+ except IndexError:
+ self.IQuitDialog(1)
+ return
+ self.IQuitDialog(0)
+ Vignette = tmpVignette
+ self.IStartDialog(0)
+ break
+
+ elif (event == kExitMode):
+ self.IQuitDialog(1)
+
+ def OnControlKeyEvent(self, controlKey, activeFlag):
+ PtDebugPrint(('Got controlKey event %d and its activeFlag is %d' % (controlKey,
+ activeFlag)), level=kDebugDumpLevel)
+ if (controlKey == PlasmaControlKeys.kKeyExitMode):
+ self.IQuitDialog(1)
+
+ def IStartDialog(self, init = 1):
+ PtLoadDialog(Vignette, self.key, self.IGetAgeFilename())
+ if PtIsDialogLoaded(Vignette):
+ PtShowDialog(Vignette)
+ PtDebugPrint(('%s: Dialog %s goes up' % (self.me,
+ Vignette)))
+ if init:
+ PtGetControlEvents(True, self.key)
+ if SingleUser.value:
+ Activate.disable()
+
+ def IQuitDialog(self, exit = 1):
+ if Vignette:
+ PtHideDialog(Vignette)
+ PtDebugPrint(('%s: Dialog %s goes down' % (self.me,
+ Vignette)))
+ if exit:
+ PtGetControlEvents(False, self.key)
+ Activate.enable()
diff --git a/Scripts/Python/xSimplePanel.py b/Scripts/Python/xSimplePanel.py
new file mode 100644
index 0000000000..84fdac6ddd
--- /dev/null
+++ b/Scripts/Python/xSimplePanel.py
@@ -0,0 +1,228 @@
+# /*==LICENSE==*
+#
+# CyanWorlds.com Engine - MMOG client, server and tools
+# Copyright (C) 2011 Cyan Worlds, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Additional permissions under GNU GPL version 3 section 7
+#
+# If you modify this Program, or any covered work, by linking or
+# combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+# NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+# JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+# (or a modified version of those libraries),
+# containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+# PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+# JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+# licensors of this Program grant you additional
+# permission to convey the resulting work. Corresponding Source for a
+# non-source form of such a combination shall include the source code for
+# the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+# work.
+#
+# You can contact Cyan Worlds, Inc. by email legal@cyan.com
+# or by snail mail at:
+# Cyan Worlds, Inc.
+# 14617 N Newport Hwy
+# Mead, WA 99021
+#
+# *==LICENSE==*/
+
+#==============================================================================#
+# #
+# Offline KI #
+# #
+# Copyright (C) 2004-2011 The Offline KI contributors #
+# See the file AUTHORS for more info about the contributors (including #
+# contact information) #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version, with or (at your option) without #
+# the Uru exception (see below). #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# Please see the file COPYING for the full GPLv3 license, or see #
+# #
+# #
+# Uru exception: In addition, this file may be used in combination with #
+# (non-GPL) code within the context of Uru. #
+# #
+#==============================================================================#
+
+from Plasma import *
+from PlasmaTypes import *
+import string
+actButton1 = ptAttribActivator(1, 'Act: Button 1')
+actButton2 = ptAttribActivator(2, 'Act: Button 2')
+actButton3 = ptAttribActivator(3, 'Act: Button 3')
+actButton4 = ptAttribActivator(4, 'Act: Button 4')
+actButton5 = ptAttribActivator(5, 'Act: Button 5')
+actButton6 = ptAttribActivator(6, 'Act: Button 6')
+actButton7 = ptAttribActivator(7, 'Act: Button 7')
+actButton8 = ptAttribActivator(8, 'Act: Button 8')
+actButton9 = ptAttribActivator(9, 'Act: Button 9')
+respButton1 = ptAttribResponder(10, 'Resp: Button 1 Down')
+respButton2 = ptAttribResponder(11, 'Resp: Button 2 Down')
+respButton3 = ptAttribResponder(12, 'Resp: Button 3 Down')
+respButton4 = ptAttribResponder(13, 'Resp: Button 4 Down')
+respButton5 = ptAttribResponder(14, 'Resp: Button 5 Down')
+respButton6 = ptAttribResponder(15, 'Resp: Button 6 Down')
+respButton7 = ptAttribResponder(16, 'Resp: Button 7 Down')
+respButton8 = ptAttribResponder(17, 'Resp: Button 8 Down')
+respButton9 = ptAttribResponder(18, 'Resp: Button 9 Down')
+respButtonsUp = ptAttribResponder(19, 'Resp: All Buttons Up')
+Solution = ptAttribString(20, 'Solution sequence')
+ButtonSDL = ptAttribString(21, 'Button SDL name')
+SolvedSDL = ptAttribString(22, 'Solved SDL name')
+boolReplay = ptAttribBoolean(23, 'Replay if solved?', 1)
+floatTimeOut = ptAttribFloat(24, 'Click time-out', 1.2)
+boolFirstUpdate = ptAttribBoolean(25, 'Init SDL on first update?', 0)
+ButtonDict = {1: (actButton1, respButton1),
+ 2: (actButton2, respButton2),
+ 3: (actButton3, respButton3),
+ 4: (actButton4, respButton4),
+ 5: (actButton5, respButton5),
+ 6: (actButton6, respButton6),
+ 7: (actButton7, respButton7),
+ 8: (actButton8, respButton8),
+ 9: (actButton9, respButton9)}
+class xSimplePanel(ptResponder,):
+
+ def __init__(self):
+ ptResponder.__init__(self)
+ self.id = 1049699
+ self.version = 1
+ minor = 0
+ self.me = self.__class__.__name__
+ print ('__init__%s v. %d.%d' % (self.me,
+ self.version,
+ minor))
+
+
+
+ def OnFirstUpdate(self):
+ EmptyButtons = []
+ for i in ButtonDict:
+ (act, resp,) = ButtonDict[i]
+ if ((not len(act.value)) or (not len(resp.value))):
+ EmptyButtons.append(i)
+
+ for i in EmptyButtons:
+ del ButtonDict[i]
+
+ print ('%s.OnFirstUpdate: Valid buttons: %d' % (self.me,
+ len(ButtonDict)))
+ if (len(ButtonDict) != len(Solution.value)):
+ print ('%s.OnFirstUpdate: WARNING! Solution length mismatch: %d' % (self.me,
+ len(Solution.value)))
+ if boolFirstUpdate.value:
+ self.OnServerInitComplete()
+
+
+
+ def OnServerInitComplete(self):
+ ageSDL = PtGetAgeSDL()
+ ageSDL.sendToClients(ButtonSDL.value)
+ ageSDL.sendToClients(SolvedSDL.value)
+ ageSDL.setFlags(ButtonSDL.value, 1, 1)
+ ageSDL.setFlags(SolvedSDL.value, 1, 1)
+ ageSDL.setNotify(self.key, ButtonSDL.value, 0.0)
+ ageSDL.setNotify(self.key, SolvedSDL.value, 0.0)
+ ButtonsPushed = ageSDL[ButtonSDL.value][0]
+ ButtonsPushed = str(ButtonsPushed)
+ print ('%s.OnServerInitComplete: When I got here, ButtonsPushed = %s' % (self.me,
+ ButtonsPushed))
+ if (len(ButtonsPushed) >= len(Solution.value)):
+ PuzzleSolved = ageSDL[SolvedSDL.value][0]
+ if ((not PuzzleSolved) or boolReplay.value):
+ respButtonsUp.run(self.key, fastforward=1)
+ ageSDL[ButtonSDL.value] = (0,)
+ return
+ for i in ButtonDict:
+ if (str(i) in ButtonsPushed):
+ (act, resp,) = ButtonDict[i]
+ resp.run(self.key, fastforward=1)
+ act.disable()
+
+ if ('0' in ButtonsPushed):
+ ageSDL[ButtonSDL.value] = (0,)
+
+
+
+ def OnNotify(self, state, id, events):
+ if ((id in ButtonDict) and (state and PtWasLocallyNotified(self.key))):
+ ageSDL = PtGetAgeSDL()
+ PtSetGlobalClickability(0)
+ PtAtTimeCallback(self.key, floatTimeOut.value, 1)
+ print ('%s.OnNotify: Button #%d pushed' % (self.me,
+ id))
+ PuzzleSolved = ageSDL[SolvedSDL.value][0]
+ if (PuzzleSolved and boolReplay.value):
+ print ('%s.OnNotify: Oops... you have reset the puzzle!' % self.me)
+ ageSDL[SolvedSDL.value] = (0,)
+ ButtonsPushed = ageSDL[ButtonSDL.value][0]
+ ButtonsPushed = str(ButtonsPushed)
+ print ('%s.OnNotify: Before, ButtonsPushed was %s' % (self.me,
+ ButtonsPushed))
+ ButtonsPushed = int((ButtonsPushed + str(id)))
+ print ('%s.OnNotify: Now, ButtonsPushed is %s' % (self.me,
+ ButtonsPushed))
+ ageSDL[ButtonSDL.value] = (ButtonsPushed,)
+ if (len(str(ButtonsPushed)) >= len(Solution.value)):
+ PtAtTimeCallback(self.key, 1, 2)
+
+
+
+ def OnSDLNotify(self, VARname, SDLname, playerID, tag):
+ if (VARname == ButtonSDL.value):
+ ageSDL = PtGetAgeSDL()
+ ButtonsPushed = ageSDL[ButtonSDL.value][0]
+ print ('%s.OnSDLNotify: New ButtonsPushed = %s' % (self.me,
+ ButtonsPushed))
+ if (ButtonsPushed == 0):
+ for i in ButtonDict:
+ (act, resp,) = ButtonDict[i]
+ act.enable()
+
+ return
+ ButtonsPushed = str(ButtonsPushed)
+ LastButtonPushed = int(ButtonsPushed[-1:])
+ (act, resp,) = ButtonDict[LastButtonPushed]
+ resp.run(self.key, netPropagate=0)
+ act.disable()
+
+
+
+ def OnTimer(self, id):
+ if (id == 1):
+ PtSetGlobalClickability(1)
+ elif (id == 2):
+ ageSDL = PtGetAgeSDL()
+ ButtonsPushed = ageSDL[ButtonSDL.value][0]
+ print ('%s.OnTimer: Check solution. ButtonsPushed = %s' % (self.me,
+ ButtonsPushed))
+ if (ButtonsPushed == int(Solution.value)):
+ print ('%s.OnTimer: Puzzle solved. Unlocking...' % self.me)
+ ageSDL[SolvedSDL.value] = (1,)
+ if (not boolReplay.value):
+ return
+ respButtonsUp.run(self.key)
+ ageSDL[ButtonSDL.value] = (0,)
diff --git a/Scripts/SDL/Kalamee.sdl b/Scripts/SDL/Kalamee.sdl
new file mode 100644
index 0000000000..a70596f96e
--- /dev/null
+++ b/Scripts/SDL/Kalamee.sdl
@@ -0,0 +1,54 @@
+# /*==LICENSE==*
+#
+# CyanWorlds.com Engine - MMOG client, server and tools
+# Copyright (C) 2011 Cyan Worlds, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Additional permissions under GNU GPL version 3 section 7
+#
+# If you modify this Program, or any covered work, by linking or
+# combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+# NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+# JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+# (or a modified version of those libraries),
+# containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+# PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+# JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+# licensors of this Program grant you additional
+# permission to convey the resulting work. Corresponding Source for a
+# non-source form of such a combination shall include the source code for
+# the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+# work.
+#
+# You can contact Cyan Worlds, Inc. by email legal@cyan.com
+# or by snail mail at:
+# Cyan Worlds, Inc.
+# 14617 N Newport Hwy
+# Mead, WA 99021
+#
+# *==LICENSE==*/
+
+STATEDESC Kalamee
+{
+ VERSION 1
+
+ VAR BOOL allJourneyClothsVisited[1] DEFAULT=0
+ VAR INT sluiceGatePuzzleButtonsPushed[1] DEFAULT=0
+ VAR BOOL sluiceGatePuzzleUnlocked[1] DEFAULT=0
+ VAR INT journeyClothGateClosed[1] DEFAULT=1
+ VAR BOOL trapGateUnlocked01[1] DEFAULT=0
+ VAR BOOL trapGateUnlocked02[1] DEFAULT=0
+ VAR BOOL trapGateUnlocked03[1] DEFAULT=0
+}
diff --git a/Scripts/dat/Kalamee.age b/Scripts/dat/Kalamee.age
new file mode 100644
index 0000000000..3cec3c6ab8
--- /dev/null
+++ b/Scripts/dat/Kalamee.age
@@ -0,0 +1,23 @@
+StartDateTime=0000000000
+DayLength=24.000000
+MaxCapacity=10
+LingerTime=180
+SequencePrefix=22100
+ReleaseVersion=0
+Page=mainroom,1
+Page=BookIntro,2
+Page=BookCredits,3
+Page=SketchbookA,4
+Page=SketchbookB,5
+Page=SketchbookC,6
+Page=ResetPanel,7
+Page=ScopeA,8
+Page=ScopeB,9
+Page=ScopeC,10
+Page=SpwnA,11
+Page=SpwnB,12
+Page=SpwnC,13
+Page=SpwnD,14
+Page=SpwnE,15
+Page=SpwnF,16
+Page=SpwnG,17
diff --git a/Scripts/dat/Kalamee.fni b/Scripts/dat/Kalamee.fni
new file mode 100644
index 0000000000..df17e7421d
--- /dev/null
+++ b/Scripts/dat/Kalamee.fni
@@ -0,0 +1,4 @@
+Graphics.Renderer.SetYon 100000
+Graphics.Renderer.Fog.SetDefLinear 0 0 0
+Graphics.Renderer.Fog.SetDefColor 0 0 0
+Graphics.Renderer.SetClearColor 0 0 0