(version 2)
(include "sci.sh")
(use "Main")
(use "Print")
(use "Game")
(use "Obj")
(script 924)



(class Messager of Obj
    (properties
        caller 0
        disposeWhenDone 1
        oneOnly 0
        killed 0
        oldIconBarState 0
        curSequence 0
        lastSequence 0
        talker 0
    )

    (method (dispose)
        (talkerSet:dispose())
        (if (gIconBar)
            (send gIconBar:state(oldIconBarState))
            = oldIconBarState 0
        )
        (if (caller)
            (if (not gNewSet)
                = gNewSet (Set:new())
            )
            (send gNewSet:add((send ((Cue:new())):
                    cuee(caller)
                    cuer(self)
                    register(killed)
                    yourself()
                )
))
        )
        = talker 0
        (super:dispose())
    )


    (method (cue param1)
        (if (paramTotal and param1)
            = killed 1
        )
        (if (oneOnly or killed)
            (if (gNewEventHandler)
                (send gNewEventHandler:
                    release()
                    dispose()
                )
                = gNewEventHandler 0
            )
            (self:dispose())
        )(else
            (self:sayNext())
        )
    )


    (method (say theCaller)
        (var theTheCaller, theTheCaller_2, theTheCaller_3, temp3, temp4[20], temp24)
        = theTheCaller_3 (= curSequence 0)
        = theTheCaller_2 theTheCaller_3
        = theTheCaller theTheCaller_2
        = caller (= oneOnly (= killed 0))
        (if (gIconBar and not oldIconBarState)
            = oldIconBarState (send gIconBar:state)
        )
        = theTheCaller theCaller[0]
        (if (== theTheCaller -1)
            (if ((> paramTotal 1) and IsObject(theCaller[1]))
                = caller theCaller[1]
            )
            (self:sayNext())
        )(else
            (if ((> paramTotal 1) and theCaller[1])
                = theTheCaller_2 theCaller[1]
            )
            (if ((> paramTotal 2) and theCaller[2])
                = theTheCaller_3 theCaller[2]
            )
            (if ((> paramTotal 3) and theCaller[3])
                = oneOnly 1
                = curSequence theCaller[3]
            )(else
                = curSequence 1
            )
            = temp24 4
            (if (((> paramTotal temp24) and theCaller[temp24]) and not IsObject(theCaller[temp24]))
                = lastSequence theCaller[temp24]
                ++temp24
                = oneOnly 0
            )(else
                = lastSequence 0
            )
            (if ((> paramTotal temp24) and theCaller[temp24])
                = caller theCaller[temp24]
            )(else
                = caller 0
            )
            = temp3 
                (if (> paramTotal ++temp24)
                    theCaller[temp24]
                )(else
                    gNumber
                )
            (if (((& global90 $0001) and Message(msgGET temp3 theTheCaller theTheCaller_2 theTheCaller_3 curSequence)) or 0)
                (self:sayNext(temp3 theTheCaller theTheCaller_2 theTheCaller_3 curSequence))
            )(else
                (Print:
                    addTextF("<Messager>\n\tmsgType set to 0 or\n\t%d: %d, %d, %d, %d not found" temp3 theTheCaller theTheCaller_2 theTheCaller_3 curSequence)
                    init()
                )
                (self:dispose())
            )
        )
    )


    (method (sayFormat param1 param2 theCaller param4)
        (var temp0, temp1, temp2)
        (if (gIconBar and not oldIconBarState)
            = oldIconBarState (send gIconBar:state)
        )
        = temp2 (self:findTalker(param1))
        = temp0 proc921_3(param2 theCaller rest param4)
        (if (IsObject(theCaller[- paramTotal 2]))
            = caller theCaller[(- paramTotal 2)]
        )
        = oneOnly 1
        = temp1 Memory(1 temp0)
        Format(temp1 param2 theCaller rest param4)
        (send temp2:say(temp1 self))
        Memory(3 temp1)
    )


    (method (sayNext param1 param2 param3 param4 param5)
        (var theTalker, temp1[200])
        (if (paramTotal)
            = theTalker Message(msgGET param1 param2 param3 param4 param5 @temp1)
        )(else
            = theTalker Message(msgNEXT @temp1)
        )
        (if (theTalker and (not lastSequence or (lastSequence and (<= curSequence lastSequence))))
            = theTalker (self:findTalker(theTalker))
            (if ((talker and (<> theTalker talker)) and (== (send talker:disposeWhenDone) 2))
                (send talker:
                    caller(0)
                    dispose(1)
                )
            )
            (if (<> (= talker theTalker) -1)
                (talkerSet:add(theTalker))
                (send theTalker:
                    modNum(param1)
                    say(@temp1 self param1 param2 param3 param4 param5)
                )
                ++curSequence
            )(else
                (if (gNewEventHandler)
                    (send gNewEventHandler:
                        release()
                        dispose()
                    )
                    = gNewEventHandler 0
                )
                (self:dispose())
            )
        )(else
            (if (gNewEventHandler)
                (send gNewEventHandler:
                    release()
                    dispose()
                )
                = gNewEventHandler 0
            )
            (self:dispose())
        )
    )


    (method (findTalker)
        (Print:
            width(200)
            addText("<Messager findTalker:>\n\tCan't find talker or\n\tfindTalker method not over-ridden")
            init()
        )
        return gNarrator
    )

)
(instance talkerSet of Set
    (properties)

    (method (dispose)
        (self:
            eachElementDo(#caller 0)
            eachElementDo(#dispose (send gFpMessager:disposeWhenDone))
            release()
        )
        (super:dispose())
    )

)
