swf-go/subtypes/ACTIONS.go

217 lines
3.6 KiB
Go

package subtypes
import (
"git.gammaspectra.live/WeebDataHoarder/swf-go/types"
"github.com/icza/bitio"
)
type CLIPACTIONS struct {
Reserved uint16
AllEventFlags CLIPEVENTFLAGS
Records CLIPACTIONRECORDS
}
type CLIPACTIONRECORDS []CLIPACTIONRECORD
func (records *CLIPACTIONRECORDS) SWFRead(r types.DataReader, ctx types.ReaderContext) (err error) {
for {
var flags CLIPEVENTFLAGS
err = types.ReadType(r, ctx, &flags)
if err != nil {
return err
}
if flags.IsEnd() {
break
}
record := CLIPACTIONRECORD{
EventFlags: flags,
}
err = types.ReadType(r, ctx, &record)
if err != nil {
return err
}
*records = append(*records, record)
}
return nil
}
type CLIPACTIONRECORD struct {
EventFlags CLIPEVENTFLAGS
ActionRecordSize uint32
KeyCode uint8
Actions []ACTIONRECORD
}
func (clipRecord *CLIPACTIONRECORD) SWFRead(r types.DataReader, ctx types.ReaderContext) (err error) {
err = types.ReadU32(r, &clipRecord.ActionRecordSize)
if err != nil {
return err
}
countReader := bitio.NewCountReader(r)
if clipRecord.EventFlags.KeyPress {
err = types.ReadU8(r, &clipRecord.KeyCode)
if err != nil {
return err
}
}
//TODO: check
for uint32(countReader.BitsCount/8) < clipRecord.ActionRecordSize {
var record ACTIONRECORD
err = types.ReadType(countReader, ctx, &record)
if err != nil {
return err
}
clipRecord.Actions = append(clipRecord.Actions, record)
}
return nil
}
type CLIPEVENTFLAGS struct {
//align?
_ struct{} `swfFlags:"root"`
KeyUp bool
KeyDown bool
MouseUp bool
MouseDown bool
MouseMove bool
Unload bool
EnterFrame bool
Load bool
DragOver bool
RollOut bool
RollOver bool
ReleaseOutside bool
Release bool
Press bool
Initialize bool
EventData bool
//SWF 6 or later
Reserved1 uint8 `swfBits:",5" swfCondition:"IsSWF6OrGreater()"`
Construct bool `swfCondition:"IsSWF6OrGreater()"`
KeyPress bool `swfCondition:"IsSWF6OrGreater()"`
DragOut bool `swfCondition:"IsSWF6OrGreater()"`
Reserved2 uint8 `swfBits:",8" swfCondition:"IsSWF6OrGreater()"`
}
func (f *CLIPEVENTFLAGS) IsEnd() bool {
return *f == CLIPEVENTFLAGS{}
}
func (f *CLIPEVENTFLAGS) IsSWF6OrGreater(ctx types.ReaderContext) bool {
return ctx.Version >= 6
}
type ActionCode uint8
// TODO: complete lists
const (
_ = ActionCode(iota)
_
_
_
ActionNextFrame
ActionPreviousFrame
ActionPlay
ActionStop
ActionToggleQuality
ActionStopSounds
ActionAdd
ActionSubtract
ActionMultiply
ActionDivide
ActionEquals
ActionLess
ActionAnd
ActionOr
ActionNot
ActionStringEquals
ActionStringLength
ActionStringAdd
ActionStringExtract
ActionPop
ActionToInteger
_
_
_
ActionGetVariable
ActionSetVariable
_
_
ActionSetTarget2
_
ActionGetProperty
ActionSetProperty
ActionCloneSprite
ActionRemoveSprite
ActionTrace
ActionStartDrag
ActionEndDrag
ActionStringLess
_
_
_
_
_
_
ActionRandomNumber
ActionMBStringLength
ActionCharToAscii
ActionAsciiToChar
ActionGetTime
ActionMBStringExtract
ActionMBCharToAscii
ActionMBAsciiToChar
)
const (
_ = ActionCode(iota) + 0x80
ActionGotoFrame
ActionGetURL
_ //83
_
_
_
_
_
_
ActionWaitForFrame // 0x8A
ActionSetTarget
ActionGoToLabel
ActionWaitForFrame2
_
_
_ //0x90
_
_
_
_
_
ActionPush
_
_
ActionJump
ActionGetURL2
_
_
ActionIf
ActionCall
ActionGotoFrame2
)
type ACTIONRECORD struct {
_ struct{} `swfFlags:"root"`
ActionCode ActionCode
Length uint16 `swfCondition:"HasActionLength()"`
Data []uint8 `swfCount:"Length"`
}
func (a *ACTIONRECORD) HasActionLength(ctx types.ReaderContext) bool {
return a.ActionCode > 0x80
}