Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ' ************************
- ' RM2k(3) Clipboard Interface special version for RMEventFactory
- ' by Cherry
- ' www.cherrytree.at
- ' ************************
- #Include Once "useful/useful.bi"
- ' ********* Int <> BER *********
- Function BER2Int(packed As String) As UInteger
- Dim Value As UInteger
- Dim Temporal As UByte
- For i As Integer = 0 To Len(packed) - 1
- Value Shl= 7
- Temporal = packed[i]
- Value Or= Temporal And &h7F
- If Temporal And &h80 = 0 Then Exit For
- Next
- Return Value
- End Function
- Function Int2BER(number As Integer) As String
- Dim Rev As String
- Dim Temporal1 As ULongInt = number
- Dim Temporal2 As UByte
- Dim counter As Integer
- Do
- Temporal2 = Temporal1 And &h7F
- Temporal1 Shr= 7
- If counter Then Temporal2 Or= &h80
- Rev &= Chr(Temporal2)
- counter += 1
- Loop While Temporal1
- Dim Outp As String
- For i As Integer = Len(Rev) - 1 To 0 Step -1
- Outp &= Chr(Rev[i])
- Next
- Return Outp
- End Function
- ' ********* Stream reader *********
- Type StreamReader
- Data As String
- Position As Integer
- Declare Constructor(Data_ As String)
- Declare Function ReadByte() As UByte
- Declare Function ReadInt() As Integer
- Declare Function ReadBER() As Integer
- Declare Function ReadString(Length As Integer, coded As Boolean = FALSE) As String
- Declare Function EndReached() As Boolean
- End Type
- Constructor StreamReader(Data_ As String)
- Data = Data_
- Position = 0
- End Constructor
- Function StreamReader.ReadByte() As UByte
- Position += 1
- Return IIf(Position >= Len(Data), CUByte(0), Data[Position - 1])
- End Function
- Function StreamReader.ReadInt() As Integer
- Position += 4
- Return Cvi(Mid(Data, Position - 3, 4))
- End Function
- Function StreamReader.ReadBER() As Integer
- Dim Value As Integer, Temporal As UByte
- Do
- Value Shl= 7
- Temporal = IIf(Position >= Len(Data), CUByte(0), Data[Position])
- Value Or= Temporal And &h7F
- Position += 1
- If (Temporal And &h80) = 0 Then Exit Do
- Loop While Position <= Len(Data)
- Return Value
- End Function
- Function StreamReader.ReadString(Length As Integer, coded As Boolean = FALSE) As String
- If coded Then
- Dim s As String
- For i As Integer = 0 To Length - 1
- s += Chr(ReadBER())
- Next
- Return s
- Else
- Position += Length
- Return Mid(Data, Position - Length + 1, Length)
- EndIf
- End Function
- Function StreamReader.EndReached() As Boolean
- Return Position >= Len(Data)
- End Function
- ' ********* Stream writer *********
- Type StreamWriter
- Data As String
- Declare Sub WriteByte(value As UByte)
- Declare Sub WriteInt(value As Integer)
- Declare Sub WriteBER(value As Integer, addlengthBER As Boolean = FALSE, value2 As Integer = -1)
- Declare Sub WriteString(value As String, addlengthBER As Boolean = FALSE, value2 As Integer = -1, coded As Boolean = FALSE)
- End Type
- Sub StreamWriter.WriteByte(value As UByte)
- Data += Chr(value)
- End Sub
- Sub StreamWriter.WriteInt(value As Integer)
- Data += Mki(value)
- End Sub
- Sub StreamWriter.WriteBER(value As Integer, addlengthBER As Boolean = FALSE, value2 As Integer = -1)
- If value2 <> -1 Then Data += Int2BER(value2)
- If addlengthBER Then Data += Int2BER(Len(Int2BER(value)))
- Data += Int2BER(value)
- End Sub
- Sub StreamWriter.WriteString(value As String, addlengthBER As Boolean = FALSE, value2 As Integer = -1, coded As Boolean = FALSE)
- If value2 <> -1 Then Data += Int2BER(value2)
- If coded Then
- If addlengthBER Then
- Dim slen As Integer
- For i As Integer = 0 To Len(value) - 1
- slen += Len(Int2BER(value[i]))
- Next
- Data += Int2BER(slen)
- EndIf
- For i As Integer = 0 To Len(value) - 1
- Data += Int2BER(value[i])
- Next
- Else
- If addlengthBER Then Data += Int2BER(Len(value))
- Data += value
- EndIf
- End Sub
- ' ********* Main AEE code *********
- Namespace AEE
- ' ********* Declarations *********
- Enum OBJECTTYPE
- OBJ_NONE
- OBJ_STARTCONDITIONS
- OBJ_MOVEEVENTCOMMAND
- OBJ_MOVEEVENTDATA
- OBJ_EVENTCOMMAND
- OBJ_EVENTPAGE
- OBJ_EVENT
- End Enum
- Enum COMPARISONS
- EVC_EQUAL
- EVC_GREATER_OR_EQUAL
- EVC_LESS_OR_EQUAL
- EVC_GREATER
- EVC_LESS
- EVC_NOT_EQUAL
- End Enum
- Type STARTCONDITIONS
- _ObjectType As Const OBJECTTYPE = OBJ_STARTCONDITIONS
- Enum STARTCONDITIONS2
- EPSC_SWITCH1 = &h1
- EPSC_SWITCH2 = &h2
- EPSC_VARIABLE = &h4
- EPSC_ITEM = &h8
- EPSC_HERO_IN_PARTY = &h10
- EPSC_TIMER1 = &h20
- EPSC_TIMER2 = &h40
- EPSC_TURNS = &h80
- EPSC_MONSTER_TURNS = &h100
- EPSC_HERO_TURNS = &h200
- EPSC_EXHAUSTION = &h400
- EPSC_MONSTER_HP = &h800
- EPSC_HERO_HP = &h1000
- EPSC_HERO_COMMAND = &h2000
- End Enum
- Used As Integer
- Switch1_ID As Integer = 1
- Switch2_ID As Integer = 1
- Variable_ID As Integer = 1
- Variable_Value As Integer
- Variable_Comparison As COMPARISONS = EVC_GREATER_OR_EQUAL
- Item_ID As Integer = 1
- HeroInParty_HeroID As Integer = 1
- Timer1_Sec As Integer
- Timer2_Sec As Integer
- Turns_Elapsed1 As Integer
- Turns_Elapsed2 As Integer
- MonsterTurns_MonsterID As Integer
- MonsterTurns_TurnsElapsed1 As Integer
- MonsterTurns_TurnsElapsed2 As Integer
- HeroTurns_HeroID As Integer
- HeroTurns_TurnsElapsed1 As Integer
- HeroTurns_TurnsElapsed2 As Integer
- Exhaustion_Min As Integer
- Exhaustion_Max As Integer
- MonsterHP_MonsterID As Integer
- MonsterHP_Min As Integer
- MonsterHP_Max As Integer
- HeroHP_HeroID As Integer
- HeroHP_Min As Integer
- HeroHP_Max As Integer
- HeroCommand_HeroID As Integer
- HeroCommand_CommandID As Integer
- End Type
- Const SPR_TILESET = 0
- Type MOVEEVENTCOMMAND
- _ObjectType As Const OBJECTTYPE = OBJ_MOVEEVENTCOMMAND
- Enum MOVEEVENTCOMMANDTYPE
- ME_MOVE_UP
- ME_MOVE_RIGHT
- ME_MOVE_DOWN
- ME_MOVE_LEFT
- ME_MOVE_UP_RIGHT
- ME_MOVE_DOWN_RIGHT
- ME_MOVE_DOWN_LEFT
- ME_MOVE_UP_LEFT
- ME_MOVE_RANDOMLY
- ME_MOVE_TOWARD_HERO
- ME_MOVE_AWAY_FROM_HERO
- ME_MOVE_FORWARD
- ME_FACE_UP
- ME_FACE_RIGHT
- ME_FACE_DOWN
- ME_FACE_LEFT
- ME_TURN_RIGHT
- ME_TURN_LEFT
- ME_TURN_AROUND
- ME_TURN_RANDOMLY
- ME_FACE_RANDOMLY
- ME_FACE_TOWARD_HERO
- ME_FACE_AWAY_FROM_HERO
- ME_WAIT
- ME_BEGIN_JUMP
- ME_END_JUMP
- ME_LOCK_FACING
- ME_UNLOCK_FACING
- ME_INCREASE_SPEED
- ME_DECREASE_SPEED
- ME_INCREASE_FREQUENCY
- ME_DECREASE_FREQUENCY
- ME_SWITCH_ON
- ME_SWITCH_OFF
- ME_CHANGE_GRAPHIC
- ME_PLAY_SE
- ME_PHASING_MODE_ON
- ME_PHASING_MODE_OFF
- ME_STOP_ANIMATION
- ME_RESUME_ANIMATION
- ME_INCREASE_TRANSPARENCY
- ME_DECREASE_TRANSPARENCY
- End Enum
- Command As MOVEEVENTCOMMANDTYPE
- Switch_ID As Integer = 1
- Sprite_Filename As ZString Ptr
- Sprite_ID As Integer
- SE_Filename As ZString Ptr
- SE_Volume As Integer = 100
- SE_Tempo As Integer = 100
- SE_Balance As Integer = 50
- End Type
- Enum EVENTID
- EV_HERO = 10001
- EV_BOAT
- EV_SHIP
- EV_AIRSHIP
- EV_THIS
- End Enum
- Enum FACEDIRECTIONS
- FD_UP
- FD_RIGHT
- FD_DOWN
- FD_LEFT
- End Enum
- Enum CHARSETFRAMES
- CSF_LEFT
- CSF_CENTER
- CSF_RIGHT
- End Enum
- Type MOVEEVENTDATA
- _ObjectType As Const OBJECTTYPE = OBJ_MOVEEVENTDATA
- Target As EVENTID
- Frequency As Integer = 8
- RepeatPattern As Boolean
- IgnoreImpossible As Boolean
- CommandsAmount As Integer
- Commands As MOVEEVENTCOMMAND Ptr
- End Type
- Enum EVENTCOMMANDS
- EVCMD_FREE_LINE = 10
- EVCMD_SHOW_MESSAGE = 10110
- EVCMD_ADD_LINE_TO_MESSAGE = 20110
- EVCMD_MESSAGE_OPTIONS = 10120
- EVCMD_SELECT_FACE = 10130
- EVCMD_SHOW_CHOICE = 10140
- EVCMD_CHOICE_CASE = 20140
- EVCMD_CHOICE_END = 20141
- EVCMD_INPUT_NUMBER = 10150
- EVCMD_CHANGE_SWITCH = 10210
- EVCMD_CHANGE_VARIABLE = 10220
- EVCMD_CHANGE_TIMER = 10230
- EVCMD_CHANGE_MONEY = 10310
- EVCMD_CHANGE_ITEMS = 10320
- EVCMD_CHANGE_PARTY = 10330
- EVCMD_CHANGE_EXP = 10410
- EVCMD_CHANGE_LEVEL = 10420
- EVCMD_CHANGE_STATS = 10430
- EVCMD_CHANGE_SKILL = 10440
- EVCMD_CHANGE_EQUIPMENT = 10450
- EVCMD_CHANGE_HP = 10460
- EVCMD_CHANGE_MP = 10470
- EVCMD_CHANGE_CONDITION = 10480
- EVCMD_FULL_RECOVERY = 10490
- EVCMD_INFLICT_DAMAGE = 10500
- EVCMD_CHANGE_HERO_NAME = 10610
- EVCMD_CHANGE_HERO_TITLE = 10620
- EVCMD_CHANGE_HERO_GRAPHIC = 10630
- EVCMD_CHANGE_HERO_FACE = 10640
- EVCMD_CHANGE_VEHICLE_GRAPHIC = 10650
- EVCMD_CHANGE_SYSTEM_BGM = 10660
- EVCMD_CHANGE_SYSTEM_SE = 10670
- EVCMD_CHANGE_SYSTEM_GRAPHIC = 10680
- EVCMD_CHANGE_TRANSITION = 10690
- EVCMD_START_COMBAT = 10710
- EVCMD_BATTLE_VICTORY = 20710
- EVCMD_BATTLE_ESCAPE = 20711
- EVCMD_BATTLE_DEFEAT = 20712
- EVCMD_BATTLE_END = 20713
- EVCMD_CALL_SHOP = 10720
- EVCMD_SHOP_TRANSACTION = 20720
- EVCMD_SHOP_CANCEL = 20721
- EVCMD_SHOP_END = 20722
- EVCMD_CALL_INN = 10730
- EVCMD_INN_REST = 20730
- EVCMD_INN_CANCEL = 20731
- EVCMD_INN_END = 20732
- EVCMD_ENTER_HERO_NAME = 10740
- EVCMD_TELEPORT = 10810
- EVCMD_MEMORIZE_LOCATION = 10820
- EVCMD_GO_TO_MEMORIZED_LOCATION = 10830
- EVCMD_RIDE_VEHICLE = 10840
- EVCMD_TELEPORT_VEHICLE = 10850
- EVCMD_SET_EVENT_LOCATION = 10860
- EVCMD_SWAP_TWO_EVENT_LOCATIONS = 10870
- EVCMD_GET_TERRAIN_ID = 10910
- EVCMD_GET_EVENT_ID = 10920
- EVCMD_ERASE_SCREEN = 11010
- EVCMD_SHOW_SCREEN = 11020
- EVCMD_SET_SCREEN_TONE = 11030
- EVCMD_FLASH_SCREEN = 11040
- EVCMD_SHAKE_SCREEN = 11050
- EVCMD_PAN_SCREEN = 11060
- EVCMD_WEATHER_EFFECTS = 11070
- EVCMD_SHOW_PICTURE = 11110
- EVCMD_MOVE_PICTURE = 11120
- EVCMD_ERASE_PICTURE = 11130
- EVCMD_SHOW_BATTLE_ANIMATION = 11210
- EVCMD_SET_HERO_OPACITY = 11310
- EVCMD_FLASH_EVENT = 11320
- EVCMD_MOVE_EVENT = 11330
- EVCMD_WAIT_UNTIL_MOVED = 11340
- EVCMD_STOP_ALL_MOVEMENT = 11350
- EVCMD_WAIT = 11410
- EVCMD_PLAY_BGM = 11510
- EVCMD_FADE_OUT_BGM = 11520
- EVCMD_MEMORIZE_BGM = 11530
- EVCMD_PLAY_MEMORIZED_BGM = 11540
- EVCMD_PLAY_SOUND_EFFECT = 11550
- EVCMD_PLAY_MOVIE = 11560
- EVCMD_KEY_INPUT_PROCESSING = 11610
- EVCMD_CHANGE_TILESET = 11710
- EVCMD_CHANGE_PANORAMA = 11720
- EVCMD_CHANGE_ENCOUNTER_RATE = 11740
- EVCMD_CHANGE_SINGLE_TILE = 11750
- EVCMD_CHANGE_TELEPORT_TARGET = 11810
- EVCMD_ENABLE_TELEPORT = 11820
- EVCMD_SET_ESCAPE_LOCATION = 11830
- EVCMD_ENABLE_ESCAPE = 11840
- EVCMD_CALL_SAVE_MENU = 11910
- EVCMD_ENABLE_SAVE = 11930
- EVCMD_CALL_MAIN_MENU = 11950
- EVCMD_ENABLE_MAIN_MENU = 11960
- EVCMD_FORK = 12010
- EVCMD_FORK_ELSE_CASE = 22010
- EVCMD_FORK_END = 22011
- EVCMD_LABEL = 12110
- EVCMD_JUMP_TO_LABEL = 12120
- EVCMD_START_LOOP = 12210
- EVCMD_END_LOOP = 22210
- EVCMD_BREAK_LOOP = 12220
- EVCMD_STOP_EVENT = 12310
- EVCMD_DELETE_EVENT = 12320
- EVCMD_CALL_EVENT = 12330
- EVCMD_COMMENT = 12410
- EVCMD_ADD_LINE_TO_COMMENT = 22410
- EVCMD_GAME_OVER = 12420
- EVCMD_GO_TO_TITLE_SCREEN = 12510
- EVCMD_CHANGE_CLASS = 1008
- EVCMD_CHANGE_BATTLE_COMMANDS = 1009
- EVCMD_CHANGE_ENEMY_HP = 13110
- EVCMD_CHANGE_ENEMY_MP = 13120
- EVCMD_CHANGE_ENEMY_CONDITION = 13130
- EVCMD_REVIVE_ENEMY = 13150
- EVCMD_CHANGE_BACKDROP = 13210
- EVCMD_SHOW_BATTLE_ANIMATION_IN_BATTLE = 13260
- EVCMD_ENABLE_COMBO = 1007
- EVCMD_FORCE_FLEE = 1006
- EVCMD_END_BATTLE = 13410
- EVCMD_FORK_IN_BATTLE = 13310
- EVCMD_FORK_IN_BATTLE_ELSE_CASE = 23310
- EVCMD_FORK_IN_BATTLE_END = 23311
- EVCMD_CALL_COMMON_EVENT = 1005
- End Enum
- Type EVENTCOMMAND
- _ObjectType As Const OBJECTTYPE = OBJ_EVENTCOMMAND
- Command As Integer = EVCMD_FREE_LINE
- TreeDepth As Integer
- NameBlock As ZString Ptr
- ParamsAmount As Integer
- Params As Integer Ptr
- MoveEventBlock As MOVEEVENTDATA Ptr
- End Type
- Type EVENTPAGE
- _ObjectType As Const OBJECTTYPE = OBJ_EVENTPAGE
- ID As Integer
- StartConditions As STARTCONDITIONS Ptr
- Sprite_Filename As ZString Ptr
- Sprite_ID As Integer
- Sprite_Transparency As Boolean
- FacingDirection As FACEDIRECTIONS
- Frame As CHARSETFRAMES = CSF_CENTER
- Enum TRIGGERCONDITION
- EPTC_PUSH_KEY
- EPTC_CALL = 0
- EPTC_HERO_TOUCH
- EPTC_HERO_COLLISION
- EPTC_AUTOSTART
- EPTC_PARALLEL
- End Enum
- Trigger As TRIGGERCONDITION
- ForbidEventOverlap As Boolean
- Enum MOVEMENTTYPE_
- EPMT_STATIONARY
- EPMT_RANDOM
- EPMT_VERTICAL
- EPMT_HORIZONTAL
- EPMT_TOWARD_HERO
- EPMT_AWAY_FROM_HERO
- EPMT_CUSTOM
- End Enum
- MovementType As MOVEMENTTYPE_
- MovementPattern As MOVEEVENTDATA Ptr
- MovementSpeed As Integer = 3
- MovementFrequency As Integer = 3
- Enum ANIMATIONTYPE_
- EPAT_NON_CONTINUOUS
- EPAT_CONTINUOUS
- EPAT_FIXED_DIR_NON_CONTINUOUS
- EPAT_FIXED_DIR_CONTINUOUS
- EPAT_FIXED_GRAPHIC
- EPAT_SPIN_AROUND
- EPAT_NO_STEPS
- End Enum
- AnimationType As ANIMATIONTYPE_
- Enum EVENTLEVEL_
- ELV_BELOW_HERO
- ELV_SAME_LEVEL_AS_HERO
- ELV_ABOVE_HERO
- End Enum
- EventLevel As EVENTLEVEL_
- CommandsAmount As Integer
- Commands As EVENTCOMMAND Ptr
- End Type
- Type EXTRAINFORMATION
- i(&hFF) As String
- End Type
- Type EVENT
- _ObjectType As Const OBJECTTYPE = OBJ_EVENT
- Enum EVENTTYPE
- EVT_UNKNOWN
- EVT_MAP
- EVT_COMMON
- EVT_BATTLE
- End Enum
- Type_ As EVENTTYPE
- ID As Integer
- Coordinates As Point
- Name As ZString Ptr
- PagesAmount As Integer
- Pages As EVENTPAGE Ptr
- ExtraInformation As EXTRAINFORMATION Ptr
- End Type
- Enum CLIPBOARDCONTENTTYPE
- CBCT_UNKNOWN
- CBCT_TEXT = CF_TEXT
- CBCT_EVENT = 563
- CBCT_EVENTPAGE = 564
- CBCT_BATTLEEVENTPAGE = 565
- CBCT_EVENTCOMMANDS = 566
- CBCT_MONSTERGROUP = 578
- CBCT_COMMONEVENT = 584
- End Enum
- ' ********* Event command property constants *********
- Enum TRANSITIONS
- TR_DEFAULT = -1
- TR_FADE
- TR_DISSOLVE
- TR_DISSOLVEUP
- TR_DISSOLVEDOWN
- TR_BLINDS
- TR_VERTICALSTRIPES
- TR_HORIZONTALSTRIPES
- TR_RECIDINGSQUARE
- TR_EXPANDINGSQUARE
- TR_SHIFTUP
- TR_SHIFTDOWN
- TR_SHIFTLEFT
- TR_SHIFTRIGHT
- TR_VERTICALSPLIT
- TR_HORIZONATLSPLIT
- TR_4WAYSPLIT
- TR_ZOOM
- TR_MOSAIC
- TR_WAVERSCREEN
- TR_INSTANT
- TR_NONE
- End Enum
- Enum ECP_CHGV_OPERATIONS ' Change Variable
- ECP_CHGV_OP_SET
- ECP_CHGV_OP_ADD
- ECP_CHGV_OP_SUBTRACT
- ECP_CHGV_OP_MULTIPLY
- ECP_CHGV_OP_DIVIDE
- ECP_CHGV_OP_MODULO
- End Enum
- Enum ECP_CHGV_OPERANDTYPES
- ECP_CHGV_OT_VALUE
- ECP_CHGV_OT_VARIABLE
- ECP_CHGV_OT_REFERENCE
- ECP_CHGV_OT_RANDOM
- ECP_CHGV_OT_ITEM
- ECP_CHGV_OT_HERO
- ECP_CHGV_OT_EVENT
- ECP_CHGV_OT_OTHER
- ECP_CHGV_OT_MONSTER
- End Enum
- Enum ECP_CHGV_HEROPROPERTIES
- ECP_CHGV_HP_LEVEL
- ECP_CHGV_HP_EXP
- ECP_CHGV_HP_HP
- ECP_CHGV_HP_MP
- ECP_CHGV_HP_MAXHP
- ECP_CHGV_HP_MAXMP
- ECP_CHGV_HP_ATK
- ECP_CHGV_HP_DEF
- ECP_CHGV_HP_INT
- ECP_CHGV_HP_AGI
- ECP_CHGV_HP_WEAPON_ID
- ECP_CHGV_HP_SHIELD_ID
- ECP_CHGV_HP_ARMOR_ID
- ECP_CHGV_HP_HELMET_ID
- ECP_CHGV_HP_ACCESSORY_ID
- End Enum
- Enum ECP_CHGV_EVENTPROPERTIES
- ECP_CHGV_EP_MAPID
- ECP_CHGV_EP_MAPX
- ECP_CHGV_EP_MAPY
- ECP_CHGV_EP_FACING
- ECP_CHGV_EP_SCREENX
- ECP_CHGV_EP_SCREENY
- End Enum
- Enum ECP_CHGV_OTHEROPERAND
- ECP_CHGV_OO_MONEY
- ECP_CHGV_OO_TIMER1
- ECP_CHGV_OO_PARTYSIZE
- ECP_CHGV_OO_SAVES
- ECP_CHGV_OO_BATTLES
- ECP_CHGV_OO_VICTORIES
- ECP_CHGV_OO_DEFEATS
- ECP_CHGV_OO_ESCAPES
- ECP_CHGV_OO_MIDIPOS
- ECP_CHGV_OO_TIMER2
- End Enum
- Enum ECP_CHGV_MONSTERPROPERTIES
- ECP_CHGV_MP_HP
- ECP_CHGV_MP_MP
- ECP_CHGV_MP_MAXHP
- ECP_CHGV_MP_MAXMP
- ECP_CHGV_MP_ATK
- ECP_CHGV_MP_DEF
- ECP_CHGV_MP_INT
- ECP_CHGV_MP_AGI
- End Enum
- Enum ECP_CHGST_STATS ' Change Ability
- ECP_CHGST_MAXHP
- ECP_CHGST_MAXMP
- ECP_CHGST_ATK
- ECP_CHGST_DEF
- ECP_CHGST_INT
- ECP_CHGST_AGI
- End Enum
- Enum ECP_CHGEQ_EQUIPMENTTYPES ' Change Equipment
- ECP_CHGEQ_WEAPON
- ECP_CHGEQ_SHIELD
- ECP_CHGEQ_ARMOR
- ECP_CHGEQ_HELMET
- ECP_CHGEQ_ACCESSORY
- ECP_CHGEQ_ALL
- End Enum
- Enum ECP_CHGSB_SCENES ' Change System BGM
- ECP_CHGSB_BATTLE
- ECP_CHGSB_VICTORY
- ECP_CHGSB_BOAT
- ECP_CHGSB_SHIP
- ECP_CHGSB_AIRSHIP
- ECP_CHGSB_GAMEOVER
- End Enum
- Enum ECP_CHGSS_EVENTS ' Change System SE
- ECP_CHGSS_CURSOR
- ECP_CHGSS_DECISION
- ECP_CHGSS_CANCEL
- ECP_CHGSS_BUZZER
- ECP_CHGSS_BATTLESTART
- ECP_CHGSS_ESCAPE
- ECP_CHGSS_ATTACK
- ECP_CHGSS_DAMAGEENEMY
- ECP_CHGSS_DAMAGEHERO
- ECP_CHGSS_EVADE
- ECP_CHGSS_DEATH
- ECP_CHGSS_ITEM
- End Enum
- Enum ECP_CHGTR_EVENTS ' Change System Transitions
- ECP_CHGTR_EV_TELEPORT_ERASE
- ECP_CHGTR_EV_TELEPORT_SHOW
- ECP_CHGTR_EV_BATTLESTART_ERASE
- ECP_CHGTR_EV_BATTLESTART_SHOW
- ECP_CHGTR_EV_BATTLEEND_ERASE
- ECP_CHGTR_EV_BATTLEEND_SHOW
- End Enum
- Enum ECP_PS_TYPES ' Pan Screen
- ECP_PS_LOCK
- ECP_PS_UNLOCK
- ECP_PS_MOVE
- ECP_PS_RECALL
- End Enum
- Enum ECP_CW_WEATHERTYPES ' Change Weather
- ECP_CW_NONE
- ECP_CW_RAIN
- ECP_CW_SNOW
- ECP_CW_FOG
- ECP_CW_SANDSTORM
- End Enum
- Enum ECP_FORK_TYPES ' Fork Condition
- ECP_FORK_TP_SWITCH
- ECP_FORK_TP_VARIABLE
- ECP_FORK_TP_TIMER1
- ECP_FORK_TP_MONEY
- ECP_FORK_TP_ITEM
- ECP_FORK_TP_HERO
- ECP_FORK_TP_EVENT
- ECP_FORK_TP_VEHICLE
- ECP_FORK_HP_ACTIONKEY
- ECP_FORK_HP_BGMPLAYED
- ECP_FORK_HP_TIMER2
- ECP_FORK_HP_HERO_ABLETOACT = 2
- ECP_FORK_HP_ENEMY_ABLETOACT
- ECP_FORK_HP_ENEMY_CURRENTTARGET
- ECP_FORK_HP_BATTLECOMMAND
- End Enum
- Enum ECP_FORK_HEROPROPERTIES
- ECP_FORK_HP_INPARTY
- ECP_FORK_HP_NAME
- ECP_FORK_HP_LEVEL
- ECP_FORK_HP_HP
- ECP_FORK_HP_SKILL
- ECP_FORK_HP_ITEM
- ECP_FORK_HP_CONDITION
- End Enum
- ' ********* Object management functions *********
- Function CreateString(Length As Integer) As ZString Ptr
- Return Callocate(Length + 1)
- End Function
- Sub DeleteString(Data_ As ZString Ptr)
- If Data_ <> NULL Then DeAllocate(Data_)
- End Sub
- Function CreateObject(ObjectType_ As OBJECTTYPE) As Any Ptr
- Select Case ObjectType_
- Case OBJ_STARTCONDITIONS
- Var ret = New STARTCONDITIONS
- Return ret
- Case OBJ_MOVEEVENTCOMMAND
- Var ret = New MOVEEVENTCOMMAND
- Return ret
- Case OBJ_MOVEEVENTDATA
- Var ret = New MOVEEVENTDATA
- Return ret
- Case OBJ_EVENTCOMMAND
- Var ret = New EVENTCOMMAND
- Return ret
- Case OBJ_EVENTPAGE
- Var ret = New EVENTPAGE
- Return ret
- Case OBJ_EVENT
- Var ret = New EVENT
- Return ret
- Case Else
- Return NULL
- End Select
- End Function
- Function ResizeObjectArray(Array As Any Ptr, ObjectType_ As OBJECTTYPE, OldSize As Integer, NewSize As Integer) As Any Ptr
- Select Case ObjectType_
- Case OBJ_MOVEEVENTCOMMAND
- If NewSize = 0 Then
- Delete[](Cast(MOVEEVENTCOMMAND Ptr, Array))
- Return NULL
- EndIf
- Var tmp = New MOVEEVENTCOMMAND[NewSize]
- CopyMemory(tmp, Array, min(OldSize, NewSize) * SizeOf(MOVEEVENTCOMMAND))
- Delete[](Cast(MOVEEVENTCOMMAND Ptr, Array))
- Return tmp
- Case OBJ_EVENTCOMMAND
- If NewSize = 0 Then
- Delete[](Cast(EVENTCOMMAND Ptr, Array))
- Return NULL
- EndIf
- Var tmp = New EVENTCOMMAND[NewSize]
- CopyMemory(tmp, Array, min(OldSize, NewSize) * SizeOf(EVENTCOMMAND))
- Delete[](Cast(EVENTCOMMAND Ptr, Array))
- Return tmp
- Case OBJ_EVENTPAGE
- If NewSize = 0 Then
- Delete[](Cast(EVENTPAGE Ptr, Array))
- Return NULL
- EndIf
- Var tmp = New EVENTPAGE[NewSize]
- CopyMemory(tmp, Array, min(OldSize, NewSize) * SizeOf(EVENTPAGE))
- Delete[](Cast(EVENTPAGE Ptr, Array))
- For i As Integer = OldSize To NewSize - 1
- Cast(EVENTPAGE Ptr, tmp)[i].ID = i + 1
- Next
- Return tmp
- Case Else
- Return Array
- End Select
- End Function
- Function CopyString(Source As ZString Ptr) As ZString Ptr
- Var l = lstrlen(Source)
- Var d = CreateString(l)
- memcpy(d, Source, l + 1)
- Return d
- End Function
- Sub CopyObject(Source As Any Ptr, Dest As Any Ptr, Array As Boolean = FALSE, Amount As Integer = 1)
- If Array = FALSE Then Amount = 1
- If IsBadReadPtr(Source, 4) Then Exit Sub
- If IsBadReadPtr(Dest, 4) Then Exit Sub
- If *Cast(Integer Ptr, Source) <> *Cast(Integer Ptr, Dest) Then Exit Sub
- Select Case *Cast(Integer Ptr, Source)
- Case OBJ_STARTCONDITIONS
- memcpy(Dest, Source, SizeOf(STARTCONDITIONS))
- Case OBJ_MOVEEVENTCOMMAND
- memcpy(Dest, Source, SizeOf(MOVEEVENTCOMMAND) * Amount)
- For i As Integer = 1 To Amount
- If Cast(MOVEEVENTCOMMAND Ptr, Source)[i - 1].Sprite_Filename <> NULL Then
- Print "Src: " & *Cast(MOVEEVENTCOMMAND Ptr, Source)[i - 1].Sprite_Filename
- Cast(MOVEEVENTCOMMAND Ptr, Dest)[i - 1].Sprite_Filename = CopyString(Cast(MOVEEVENTCOMMAND Ptr, Source)[i - 1].Sprite_Filename)
- Print "Dst: " & *Cast(MOVEEVENTCOMMAND Ptr, Dest)[i - 1].Sprite_Filename
- Else
- Cast(MOVEEVENTCOMMAND Ptr, Dest)[i - 1].Sprite_Filename = NULL
- EndIf
- If Cast(MOVEEVENTCOMMAND Ptr, Source)[i - 1].SE_Filename <> NULL Then
- Cast(MOVEEVENTCOMMAND Ptr, Dest)[i - 1].SE_Filename = CopyString(Cast(MOVEEVENTCOMMAND Ptr, Source)[i - 1].SE_Filename)
- Else
- Cast(MOVEEVENTCOMMAND Ptr, Dest)[i - 1].SE_Filename = NULL
- EndIf
- Next
- Case OBJ_MOVEEVENTDATA
- memcpy(Dest, Source, SizeOf(MOVEEVENTDATA))
- If Cast(MOVEEVENTDATA Ptr, Source)->Commands <> NULL Then
- Cast(MOVEEVENTDATA Ptr, Dest)->Commands = ResizeObjectArray(NULL, OBJ_MOVEEVENTCOMMAND, 0, Cast(MOVEEVENTDATA Ptr, Source)->CommandsAmount)
- CopyObject(Cast(MOVEEVENTDATA Ptr, Source)->Commands, Cast(MOVEEVENTDATA Ptr, Dest)->Commands, TRUE, Cast(MOVEEVENTDATA Ptr, Source)->CommandsAmount)
- Else
- Cast(MOVEEVENTDATA Ptr, Dest)->Commands = NULL
- EndIf
- Case OBJ_EVENTCOMMAND
- memcpy(Dest, Source, SizeOf(EVENTCOMMAND) * Amount)
- For i As Integer = 1 To Amount
- If Cast(EVENTCOMMAND Ptr, Source)[i - 1].Params <> NULL Then
- Var mp = max(Cast(EVENTCOMMAND Ptr, Source)[i - 1].ParamsAmount, 64)
- Cast(EVENTCOMMAND Ptr, Dest)[i - 1].Params = New Integer[mp]
- memcpy(Cast(EVENTCOMMAND Ptr, Dest)[i - 1].Params, Cast(EVENTCOMMAND Ptr, Source)[i - 1].Params, SizeOf(Integer) * mp)
- Else
- Cast(EVENTCOMMAND Ptr, Dest)[i - 1].Params = NULL
- EndIf
- If Cast(EVENTCOMMAND Ptr, Source)[i - 1].MoveEventBlock <> NULL Then
- Cast(EVENTCOMMAND Ptr, Dest)[i - 1].MoveEventBlock = CreateObject(OBJ_MOVEEVENTDATA)
- CopyObject(Cast(EVENTCOMMAND Ptr, Source)[i - 1].MoveEventBlock, Cast(EVENTCOMMAND Ptr, Dest)[i - 1].MoveEventBlock)
- Else
- Cast(EVENTCOMMAND Ptr, Dest)[i - 1].MoveEventBlock = NULL
- EndIf
- If Cast(EVENTCOMMAND Ptr, Source)[i - 1].NameBlock <> NULL Then
- Cast(EVENTCOMMAND Ptr, Dest)[i - 1].NameBlock = CopyString(Cast(EVENTCOMMAND Ptr, Source)[i - 1].NameBlock)
- Else
- Cast(EVENTCOMMAND Ptr, Dest)[i - 1].NameBlock = NULL
- EndIf
- Next
- Case OBJ_EVENTPAGE
- Var id = Cast(EVENTPAGE Ptr, Dest)->ID
- memcpy(Dest, Source, SizeOf(EVENTPAGE) * Amount)
- Cast(EVENTPAGE Ptr, Dest)->ID = id
- For i As Integer = 1 To Amount
- If Cast(EVENTPAGE Ptr, Source)[i - 1].StartConditions <> NULL Then
- Cast(EVENTPAGE Ptr, Dest)[i - 1].StartConditions = CreateObject(OBJ_STARTCONDITIONS)
- CopyObject(Cast(EVENTPAGE Ptr, Source)[i - 1].StartConditions, Cast(EVENTPAGE Ptr, Dest)[i - 1].StartConditions)
- Else
- Cast(EVENTPAGE Ptr, Dest)[i - 1].StartConditions = NULL
- EndIf
- If Cast(EVENTPAGE Ptr, Source)[i - 1].Sprite_Filename <> NULL Then
- Cast(EVENTPAGE Ptr, Dest)[i - 1].Sprite_Filename = CopyString(Cast(EVENTPAGE Ptr, Source)[i - 1].Sprite_Filename)
- Else
- Cast(EVENTPAGE Ptr, Dest)[i - 1].Sprite_Filename = NULL
- EndIf
- If Cast(EVENTPAGE Ptr, Source)[i - 1].MovementPattern <> NULL Then
- Cast(EVENTPAGE Ptr, Dest)[i - 1].MovementPattern = CreateObject(OBJ_MOVEEVENTDATA)
- CopyObject(Cast(EVENTPAGE Ptr, Source)[i - 1].MovementPattern, Cast(EVENTPAGE Ptr, Dest)[i - 1].MovementPattern)
- Else
- Cast(EVENTPAGE Ptr, Dest)[i - 1].MovementPattern = NULL
- EndIf
- If Cast(EVENTPAGE Ptr, Source)[i - 1].Commands <> NULL Then
- Cast(EVENTPAGE Ptr, Dest)[i - 1].Commands = ResizeObjectArray(NULL, OBJ_EVENTCOMMAND, 0, Cast(EVENTPAGE Ptr, Source)[i - 1].CommandsAmount)
- CopyObject(Cast(EVENTPAGE Ptr, Source)[i - 1].Commands, Cast(EVENTPAGE Ptr, Dest)[i - 1].Commands, TRUE, Cast(EVENTPAGE Ptr, Source)[i - 1].CommandsAmount)
- Else
- Cast(EVENTPAGE Ptr, Dest)[i - 1].Commands = NULL
- EndIf
- Next
- Case OBJ_EVENT
- memcpy(Dest, Source, SizeOf(EVENT))
- If Cast(EVENT Ptr, Source)->Name <> NULL Then
- Cast(EVENT Ptr, Dest)->Name = CopyString(Cast(EVENT Ptr, Source)->Name)
- Else
- Cast(EVENT Ptr, Dest)->Name = NULL
- EndIf
- If Cast(EVENT Ptr, Source)->Pages <> NULL Then
- Cast(EVENT Ptr, Dest)->Pages = ResizeObjectArray(NULL, OBJ_EVENTPAGE, 0, Cast(EVENT Ptr, Source)->PagesAmount)
- CopyObject(Cast(EVENT Ptr, Source)->Pages, Cast(EVENT Ptr, Dest)->Pages, TRUE, Cast(EVENT Ptr, Source)->PagesAmount)
- Else
- Cast(EVENT Ptr, Dest)->Pages = NULL
- EndIf
- If Cast(EVENT Ptr, Source)->ExtraInformation <> NULL Then
- Cast(EVENT Ptr, Dest)->ExtraInformation = New EXTRAINFORMATION
- For i As Integer = 0 To &hFF
- Cast(EVENT Ptr, Dest)->ExtraInformation->i(i) = Cast(EVENT Ptr, Source)->ExtraInformation->i(i)
- Next
- Else
- Cast(EVENT Ptr, Dest)->ExtraInformation = NULL
- EndIf
- Case Else
- ' Do nothing
- End Select
- End Sub
- Sub DestroyObject(Object As Any Ptr, Array As Boolean = FALSE, Amount As Integer = 1)
- If Array = FALSE Then Amount = 1
- If IsBadReadPtr(Object, 4) Then Exit Sub
- Select Case *Cast(Integer Ptr, Object)
- Case OBJ_STARTCONDITIONS
- Delete(Cast(STARTCONDITIONS Ptr, Object))
- Case OBJ_MOVEEVENTCOMMAND
- For i As Integer = 1 To Amount
- DeAllocate(Cast(MOVEEVENTCOMMAND Ptr, Object)[i - 1].Sprite_Filename)
- DeAllocate(Cast(MOVEEVENTCOMMAND Ptr, Object)[i - 1].SE_Filename)
- Next
- If Array Then
- Delete[](Cast(MOVEEVENTCOMMAND Ptr, Object))
- Else
- Delete(Cast(MOVEEVENTCOMMAND Ptr, Object))
- EndIf
- Case OBJ_MOVEEVENTDATA
- DestroyObject(Cast(MOVEEVENTDATA Ptr, Object)->Commands, TRUE, Cast(MOVEEVENTDATA Ptr, Object)->CommandsAmount)
- Delete(Cast(MOVEEVENTDATA Ptr, Object))
- Case OBJ_EVENTCOMMAND
- For i As Integer = 1 To Amount
- Delete[](Cast(EVENTCOMMAND Ptr, Object)[i - 1].Params)
- DestroyObject(Cast(EVENTCOMMAND Ptr, Object)[i - 1].MoveEventBlock)
- Next
- If Array Then
- Delete[](Cast(EVENTCOMMAND Ptr, Object))
- Else
- Delete(Cast(EVENTCOMMAND Ptr, Object))
- EndIf
- Case OBJ_EVENTPAGE
- For i As Integer = 1 To Amount
- DestroyObject(Cast(EVENTPAGE Ptr, Object)[i - 1].StartConditions)
- DeAllocate(Cast(EVENTPAGE Ptr, Object)[i - 1].Sprite_Filename)
- DestroyObject(Cast(EVENTPAGE Ptr, Object)[i - 1].MovementPattern)
- DestroyObject(Cast(EVENTPAGE Ptr, Object)[i - 1].Commands, TRUE, Cast(EVENTPAGE Ptr, Object)[i - 1].CommandsAmount)
- Next
- If Array Then
- Delete[](Cast(EVENTPAGE Ptr, Object))
- Else
- Delete(Cast(EVENTPAGE Ptr, Object))
- EndIf
- Case OBJ_EVENT
- DeAllocate(Cast(EVENT Ptr, Object)->Name)
- DestroyObject(Cast(EVENT Ptr, Object)->Pages, TRUE)
- Delete(Cast(EVENT Ptr, Object)->ExtraInformation)
- Delete(Cast(EVENT Ptr, Object))
- Case Else
- DeAllocate(Object)
- End Select
- End Sub
- Sub DeleteExtraInformation(Data_ As EXTRAINFORMATION Ptr)
- Delete(Data_)
- End Sub
- Function ResizeIntArray(Array As Integer Ptr, OldSize As Integer, NewSize As Integer) As Integer Ptr
- If NewSize = 0 Then
- Delete[](Array)
- Return NULL
- EndIf
- Var tmp = New Integer[NewSize]
- CopyMemory(tmp, Array, min(OldSize, NewSize) * SizeOf(Integer))
- Delete[](Array)
- Return tmp
- End Function
- Sub DestroyIntArray(Array As Integer Ptr)
- If IsBadReadPtr(Array, 1) Then Exit Sub
- Delete[](Array)
- End Sub
- ' ********* Clipboard reading functions *********
- Function CheckClipboardContent() As CLIPBOARDCONTENTTYPE
- If IsClipboardFormatAvailable(CBCT_TEXT) Then Return CBCT_TEXT
- If IsClipboardFormatAvailable(CBCT_EVENT) Then Return CBCT_EVENT
- If IsClipboardFormatAvailable(CBCT_EVENTPAGE) Then Return CBCT_EVENTPAGE
- If IsClipboardFormatAvailable(CBCT_BATTLEEVENTPAGE) Then Return CBCT_BATTLEEVENTPAGE
- If IsClipboardFormatAvailable(CBCT_EVENTCOMMANDS) Then Return CBCT_EVENTCOMMANDS
- If IsClipboardFormatAvailable(CBCT_MONSTERGROUP) Then Return CBCT_MONSTERGROUP
- If IsClipboardFormatAvailable(CBCT_COMMONEVENT) Then Return CBCT_COMMONEVENT
- Return CBCT_UNKNOWN
- End Function
- Sub AdjustTreeDepth(Page As EVENTPAGE Ptr)
- Dim mintd As UInteger = -1 ' Trick: get the lowest value
- For i As Integer = 0 To Page->CommandsAmount - 1
- mintd = min(mintd, Page->Commands[i].TreeDepth)
- Next
- For i As Integer = 0 To Page->CommandsAmount - 1
- Page->Commands[i].TreeDepth -= mintd
- Next
- End Sub
- Sub ReadMoveEventCommands(ByRef Stream As StreamReader, MoveEvent As MOVEEVENTDATA Ptr, Length As Integer, Coded As Boolean = FALSE)
- Var StreamStartPosition = Stream.Position
- Do While Stream.Position < Length + StreamStartPosition
- MoveEvent->CommandsAmount += 1
- MoveEvent->Commands = ResizeObjectArray(MoveEvent->Commands, OBJ_MOVEEVENTCOMMAND, MoveEvent->CommandsAmount - 1, MoveEvent->CommandsAmount)
- Var cmd = Stream.ReadBER()
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].Command = cmd
- Select Case cmd
- Case MOVEEVENTCOMMAND.ME_SWITCH_ON, MOVEEVENTCOMMAND.ME_SWITCH_OFF
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].Switch_ID = Stream.ReadBER()
- Case MOVEEVENTCOMMAND.ME_CHANGE_GRAPHIC
- Var slen = Stream.ReadBER()
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].Sprite_Filename = CreateString(slen)
- *MoveEvent->Commands[MoveEvent->CommandsAmount - 1].Sprite_Filename = Stream.ReadString(slen, Coded)
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].Sprite_ID = Stream.ReadBER()
- Case MOVEEVENTCOMMAND.ME_PLAY_SE
- Var slen = Stream.ReadBER()
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].SE_Filename = CreateString(slen)
- If Coded Then
- For i As Integer = 1 To slen
- *MoveEvent->Commands[MoveEvent->CommandsAmount - 1].SE_Filename &= Chr(Stream.ReadBER())
- Next
- Else
- *MoveEvent->Commands[MoveEvent->CommandsAmount - 1].SE_Filename = Stream.ReadString(slen)
- EndIf
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].SE_Volume = Stream.ReadBER()
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].SE_Tempo = Stream.ReadBER()
- MoveEvent->Commands[MoveEvent->CommandsAmount - 1].SE_Balance = Stream.ReadBER()
- End Select
- Loop
- End Sub
- Sub ReadEventCommands(ByRef Stream As StreamReader, Page As EVENTPAGE Ptr, Length As Integer)
- Var StreamStartPosition = Stream.Position
- Do While Stream.Position < Length + StreamStartPosition
- Page->CommandsAmount += 1
- Page->Commands = ResizeObjectArray(Page->Commands, OBJ_EVENTCOMMAND, Page->CommandsAmount - 1, Page->CommandsAmount)
- Var cmd = Stream.ReadBER()
- Page->Commands[Page->CommandsAmount - 1].Command = cmd
- Page->Commands[Page->CommandsAmount - 1].TreeDepth = Stream.ReadBER()
- Var slen = Stream.ReadBER()
- If slen Then
- Page->Commands[Page->CommandsAmount - 1].NameBlock = CreateString(slen)
- *Page->Commands[Page->CommandsAmount - 1].NameBlock = Stream.ReadString(slen)
- EndIf
- If cmd = EVCMD_MOVE_EVENT Then
- Var count = Stream.ReadBER()
- Page->Commands[Page->CommandsAmount - 1].Params = New Integer[64]
- Page->Commands[Page->CommandsAmount - 1].MoveEventBlock = New MOVEEVENTDATA
- Page->Commands[Page->CommandsAmount - 1].MoveEventBlock->Target = Stream.ReadBER()
- Page->Commands[Page->CommandsAmount - 1].MoveEventBlock->Frequency = Stream.ReadBER()
- Page->Commands[Page->CommandsAmount - 1].MoveEventBlock->RepeatPattern = Stream.ReadBER()
- Page->Commands[Page->CommandsAmount - 1].MoveEventBlock->IgnoreImpossible = Stream.ReadBER()
- count -= 4
- Var cpos = Stream.Position
- For i As Integer = 0 To count - 1
- Stream.ReadBER() ' Throw away
- Next
- Var clen = Stream.Position - cpos
- Stream.Position = cpos
- ReadMoveEventCommands(Stream, Page->Commands[Page->CommandsAmount - 1].MoveEventBlock, clen, TRUE)
- Else
- Page->Commands[Page->CommandsAmount - 1].ParamsAmount = Stream.ReadBER()
- Var mp = max(Page->Commands[Page->CommandsAmount - 1].ParamsAmount, 64)
- Page->Commands[Page->CommandsAmount - 1].Params = New Integer[mp]
- For i As Integer = 0 To Page->Commands[Page->CommandsAmount - 1].ParamsAmount - 1
- Page->Commands[Page->CommandsAmount - 1].Params[i] = Stream.ReadBER()
- Next
- EndIf
- If cmd = 0 Then
- Page->CommandsAmount -= 1
- Page->Commands = ResizeObjectArray(Page->Commands, OBJ_EVENTCOMMAND, Page->CommandsAmount + 1, Page->CommandsAmount)
- Exit Do
- EndIf
- Loop
- AdjustTreeDepth(Page)
- End Sub
- Sub ReadEventPage(ByRef Stream As StreamReader, Event_ As EVENT Ptr, pagenum As Integer = -1)
- Var cpagenum = pagenum
- If pagenum = -1 Then cpagenum = Stream.ReadBER()
- Dim cpage As EVENTPAGE Ptr
- If cpagenum <= Event_->PagesAmount Then cpage = @(Event_->Pages[cpagenum - 1]) Else cpage = Event_->Pages
- cpage->ID = cpagenum
- Dim ScriptLength As Integer
- Do
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h02
- ' Start conditions
- Var StreamLength3 = Stream.ReadBER()
- Var StreamStartPosition3 = Stream.Position
- cpage->StartConditions = New STARTCONDITIONS
- Var ccond = cpage->StartConditions
- Do While Stream.Position < StreamLength3 + StreamStartPosition3
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h01
- ' Bitfield - which cond. are used?
- Var l = Stream.ReadBER()
- Dim fld As Integer = 0
- For i As Integer = 1 To l
- fld Shl= 8
- fld Or= Stream.ReadByte()
- Next
- ccond->Used Or= fld And &h7F
- Case &h02
- ' Switch 1 ID
- Stream.ReadBER() ' Throw away
- ccond->Switch1_ID = Stream.ReadBER()
- Case &h03
- ' Switch 2 ID
- Stream.ReadBER() ' Throw away
- ccond->Switch2_ID = Stream.ReadBER()
- Case &h04
- ' Variable ID
- Stream.ReadBER() ' Throw away
- ccond->Variable_ID = Stream.ReadBER()
- Case &h05
- ' Variable Value
- Stream.ReadBER() ' Throw away
- ccond->Variable_Value = Stream.ReadBER()
- Case &h06
- ' Item ID
- Stream.ReadBER() ' Throw away
- ccond->Item_ID = Stream.ReadBER()
- Case &h07
- ' Hero ID
- Stream.ReadBER() ' Throw away
- ccond->HeroInParty_HeroID = Stream.ReadBER()
- Case &h08
- ' Timer 1 sec. remaining
- Stream.ReadBER() ' Throw away
- ccond->Timer1_Sec = Stream.ReadBER()
- Case &h09
- ' Timer 2 sec. remaining
- Stream.ReadBER() ' Throw away
- ccond->Timer2_Sec = Stream.ReadBER()
- Case &h0A
- ' Variable comparison
- Stream.ReadBER() ' Throw away
- ccond->Variable_Comparison = Stream.ReadBER()
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- Case &h15
- ' Sprite filename
- Var slen = Stream.ReadBER()
- cpage->Sprite_Filename = CreateString(slen)
- *cpage->Sprite_Filename = Stream.ReadString(slen)
- Case &h16
- ' Sprite ID
- Stream.ReadBER() ' Throw away
- cpage->Sprite_ID = Stream.ReadBER()
- Case &h17
- ' Facing direction
- Stream.ReadBER() ' Throw away
- cpage->FacingDirection = Stream.ReadBER()
- Case &h18
- ' Animation frame
- Stream.ReadBER() ' Throw away
- cpage->Frame = Stream.ReadBER()
- Case &h19
- ' Transparency
- Stream.ReadBER() ' Throw away
- cpage->Sprite_Transparency = Stream.ReadBER() And TRUE
- Case &h1F
- ' Movement type
- Stream.ReadBER() ' Throw away
- cpage->MovementType = Stream.ReadBER()
- Case &h20
- ' Movement frequency
- Stream.ReadBER() ' Throw away
- cpage->MovementFrequency = Stream.ReadBER()
- Case &h21
- ' Trigger condition
- Stream.ReadBER() ' Throw away
- cpage->Trigger = Stream.ReadBER()
- Case &h22
- ' Event level
- Stream.ReadBER() ' Throw away
- cpage->EventLevel = Stream.ReadBER()
- Case &h23
- ' Forbid event overlap
- Stream.ReadBER() ' Throw away
- cpage->ForbidEventOverlap = Stream.ReadBER() And TRUE
- Case &h24
- ' Animation type
- Stream.ReadBER() ' Throw away
- cpage->AnimationType = Stream.ReadBER()
- Case &h25
- ' Movement speed
- Stream.ReadBER() ' Throw away
- cpage->MovementSpeed = Stream.ReadBER()
- Case &h29
- ' Movement pattern
- Var StreamLength3 = Stream.ReadBER()
- Var StreamStartPosition3 = Stream.Position
- cpage->MovementPattern = New MOVEEVENTDATA
- Var cpattern = cpage->MovementPattern
- cpattern->RepeatPattern = TRUE
- cpattern->Target = EV_THIS
- cpattern->Frequency = cpage->MovementFrequency
- Dim MoveLength As Integer
- Do While Stream.Position < StreamLength3 + StreamStartPosition3
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h0B
- ' Move event length
- Stream.ReadBER() ' Throw away
- MoveLength = Stream.ReadBER()
- Case &h0C
- ' Move event data
- ReadMoveEventCommands(Stream, cpattern, Stream.ReadBER())
- Case &h15
- ' Repeat pattern
- Stream.ReadBER() ' Throw away
- cpattern->RepeatPattern = Stream.ReadBER() And TRUE
- Case &h16
- ' Ignore impossible
- Stream.ReadBER() ' Throw away
- cpattern->IgnoreImpossible = Stream.ReadBER() And TRUE
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- Case &h33
- ' Script length
- Stream.ReadBER() ' Throw away
- ScriptLength = Stream.ReadBER()
- Case &h34
- ' Script
- ReadEventCommands(Stream, cpage, Stream.ReadBER())
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- End Sub
- Sub ReadBattleEventPage(ByRef Stream As StreamReader, Event_ As EVENT Ptr, pagenum As Integer = -1)
- Var cpagenum = pagenum
- If pagenum = -1 Then cpagenum = Stream.ReadBER()
- Dim cpage As EVENTPAGE Ptr
- If cpagenum <= Event_->PagesAmount Then cpage = @(Event_->Pages[cpagenum - 1]) Else cpage = Event_->Pages
- cpage->ID = cpagenum
- Dim ScriptLength As Integer
- Do
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h02
- ' Start conditions
- Var StreamLength3 = Stream.ReadBER()
- Var StreamStartPosition3 = Stream.Position
- cpage->StartConditions = New STARTCONDITIONS
- Var ccond = cpage->StartConditions
- Do While Stream.Position < StreamLength3 + StreamStartPosition3
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h01
- ' Bitfield - which cond. are used?
- Var l = Stream.ReadBER()
- Dim fld As Integer = 0
- For i As Integer = 1 To l
- fld Or= Stream.ReadByte() Shl (i - 1) * 8
- Next
- ccond->Used = fld And &h007
- If fld And &h008 Then ccond->Used Or= STARTCONDITIONS.EPSC_TURNS
- If fld And &h010 Then ccond->Used Or= STARTCONDITIONS.EPSC_EXHAUSTION
- If fld And &h020 Then ccond->Used Or= STARTCONDITIONS.EPSC_MONSTER_HP
- If fld And &h040 Then ccond->Used Or= STARTCONDITIONS.EPSC_HERO_HP
- If fld And &h080 Then ccond->Used Or= STARTCONDITIONS.EPSC_MONSTER_TURNS
- If fld And &h100 Then ccond->Used Or= STARTCONDITIONS.EPSC_HERO_TURNS
- If fld And &h200 Then ccond->Used Or= STARTCONDITIONS.EPSC_HERO_COMMAND
- Case &h02
- ' Switch 1 ID
- Stream.ReadBER() ' Throw away
- ccond->Switch1_ID = Stream.ReadBER()
- Case &h03
- ' Switch 2 ID
- Stream.ReadBER() ' Throw away
- ccond->Switch2_ID = Stream.ReadBER()
- Case &h04
- ' Variable ID
- Stream.ReadBER() ' Throw away
- ccond->Variable_ID = Stream.ReadBER()
- Case &h05
- ' Variable Value
- Stream.ReadBER() ' Throw away
- ccond->Variable_Value = Stream.ReadBER()
- Case &h06
- ' Turns elapsed (A)
- Stream.ReadBER() ' Throw away
- ccond->Turns_Elapsed1 = Stream.ReadBER()
- Case &h07
- ' Turns elapsed (B)
- Stream.ReadBER() ' Throw away
- ccond->Turns_Elapsed2 = Stream.ReadBER()
- Case &h08
- ' Exhaustion min.
- Stream.ReadBER() ' Throw away
- ccond->Exhaustion_Min = Stream.ReadBER()
- Case &h09
- ' Exhaustion max.
- Stream.ReadBER() ' Throw away
- ccond->Exhaustion_Max = Stream.ReadBER()
- Case &h0A
- ' Monster HP: Monster ID
- Stream.ReadBER() ' Throw away
- ccond->MonsterHP_MonsterID = Stream.ReadBER() + 1
- Case &h0B
- ' Monster HP: HP min.
- Stream.ReadBER() ' Throw away
- ccond->MonsterHP_Min = Stream.ReadBER()
- Case &h0C
- ' Monster HP: HP max.
- Stream.ReadBER() ' Throw away
- ccond->MonsterHP_Max = Stream.ReadBER()
- Case &h0D
- ' Hero HP: Hero ID
- Stream.ReadBER() ' Throw away
- ccond->HeroHP_HeroID = Stream.ReadBER()
- Case &h0E
- ' Hero HP: HP min.
- Stream.ReadBER() ' Throw away
- ccond->HeroHP_Min = Stream.ReadBER()
- Case &h0F
- ' Hero HP: HP max.
- Stream.ReadBER() ' Throw away
- ccond->HeroHP_Max = Stream.ReadBER()
- Case &h10
- ' Monster turns: Monster ID
- Stream.ReadBER() ' Throw away
- ccond->MonsterTurns_MonsterID = Stream.ReadBER() + 1
- Case &h11
- ' Monster turns: Turns elapsed (A)
- Stream.ReadBER() ' Throw away
- ccond->MonsterTurns_TurnsElapsed1 = Stream.ReadBER()
- Case &h12
- ' Monster turns: Turns elapsed (B)
- Stream.ReadBER() ' Throw away
- ccond->MonsterTurns_TurnsElapsed2 = Stream.ReadBER()
- Case &h13
- ' Hero turns: Hero ID
- Stream.ReadBER() ' Throw away
- ccond->HeroTurns_HeroID = Stream.ReadBER()
- Case &h14
- ' Hero turns: Turns elapsed (A)
- Stream.ReadBER() ' Throw away
- ccond->HeroTurns_TurnsElapsed1 = Stream.ReadBER()
- Case &h15
- ' Hero turns: Turns elapsed (B)
- Stream.ReadBER() ' Throw away
- ccond->HeroTurns_TurnsElapsed2 = Stream.ReadBER()
- Case &h16
- ' Hero command: Hero ID
- Stream.ReadBER() ' Throw away
- ccond->HeroCommand_HeroID = Stream.ReadBER()
- Case &h17
- ' Hero command: Command ID
- Stream.ReadBER() ' Throw away
- ccond->HeroCommand_CommandID = Stream.ReadBER()
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- Case &h0B
- ' Script length
- Stream.ReadBER() ' Throw away
- ScriptLength = Stream.ReadBER()
- Case &h0C
- ' Script
- ReadEventCommands(Stream, cpage, Stream.ReadBER())
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- End Sub
- Function GetClipboardContent(ContentType As CLIPBOARDCONTENTTYPE, Content As String = "$CLIP") As Any Ptr
- If Content = "$CLIP" Then Content = ReadClipboard(ContentType)
- If Len(Content) = 0 Then Return 0
- Select Case ContentType
- Case CBCT_TEXT
- ' Text
- Dim ret As ZString Ptr = CreateString(Len(Content))
- *ret = Content
- Return ret
- Case CBCT_EVENT
- ' Map event
- Var ret = New Event
- Var Stream = StreamReader(Content)
- Var StreamLength = Stream.ReadInt()
- ret->Type_ = EVENT.EVT_MAP
- Stream.ReadByte() ' Throw away
- Do While Stream.Position < StreamLength
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h01
- ' Name
- Var slen = Stream.ReadBER()
- ret->Name = CreateString(slen)
- *ret->Name = Stream.ReadString(slen)
- Case &h02
- ' X position
- Stream.ReadBER() ' Throw away
- ret->Coordinates.x = Stream.ReadBER()
- Case &h03
- ' Y position
- Stream.ReadBER() ' Throw away
- ret->Coordinates.y = Stream.ReadBER()
- Case &h05
- ' Pages
- Var StreamLength2 = Stream.ReadBER()
- Var StreamStartPosition2 = Stream.Position
- ret->PagesAmount = Stream.ReadBER()
- ret->Pages = New EVENTPAGE[ret->PagesAmount]
- Do While Stream.Position < StreamLength2 + StreamStartPosition2
- ReadEventPage(Stream, ret)
- Loop
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- Return ret
- Case CBCT_EVENTPAGE
- ' Event page
- Var ret = New Event
- Var Stream = StreamReader(Content)
- Var StreamLength = Stream.ReadInt()
- ret->Type_ = EVENT.EVT_MAP
- ret->PagesAmount = 1
- ret->Pages = New EVENTPAGE[1]
- ReadEventPage(Stream, ret, Stream.ReadInt())
- Return ret
- Case CBCT_BATTLEEVENTPAGE
- ' Battle event page
- Var ret = New Event
- Var Stream = StreamReader(Content)
- Var StreamLength = Stream.ReadInt()
- ret->Type_ = EVENT.EVT_BATTLE
- ret->PagesAmount = 1
- ret->Pages = New EVENTPAGE[1]
- ReadBattleEventPage(Stream, ret, Stream.ReadInt())
- Return ret
- Case CBCT_EVENTCOMMANDS
- ' Event commands
- Var ret = New Event
- Var Stream = StreamReader(Content)
- Var StreamLength = Stream.ReadInt()
- ret->Type_ = EVENT.EVT_UNKNOWN
- ret->PagesAmount = 1
- ret->Pages = New EVENTPAGE[1]
- Var cpage = ret->Pages
- cpage->ID = 1
- cpage->StartConditions = New STARTCONDITIONS
- ReadEventCommands(Stream, cpage, StreamLength)
- Return ret
- Case CBCT_MONSTERGROUP
- ' Monster group
- Var ret = New Event
- Var Stream = StreamReader(Content)
- Var StreamLength = Stream.ReadInt()
- ret->Type_ = EVENT.EVT_BATTLE
- ret->ID = Stream.ReadInt()
- Do While Stream.Position < StreamLength
- Var dataid = Stream.ReadBER()
- Select Case dataid
- Case &h00
- ' End of block
- Exit Do
- Case &h01
- ' Name
- Var slen = Stream.ReadBER()
- ret->Name = CreateString(slen)
- *ret->Name = Stream.ReadString(slen)
- Case &h0B
- ' Pages
- Var StreamLength2 = Stream.ReadBER()
- Var StreamStartPosition2 = Stream.Position
- ret->PagesAmount = Stream.ReadBER()
- ret->Pages = New EVENTPAGE[ret->PagesAmount]
- Do While Stream.Position < StreamLength2 + StreamStartPosition2
- ReadBattleEventPage(Stream, ret)
- Loop
- Case Else
- ' Other monster group information
- Var slen = Stream.ReadBER()
- If ret->ExtraInformation = NULL Then ret->ExtraInformation = New EXTRAINFORMATION
- If Cast(UInteger, dataid) < &h100 Then
- ret->ExtraInformation->i(dataid) = Stream.ReadString(slen)
- Else
- Stream.Position += slen
- EndIf
- End Select
- Loop
- Return ret
- Case CBCT_COMMONEVENT
- ' Common event
- Var ret = New Event
- Var Stream = StreamReader(Content)
- Var StreamLength = Stream.ReadInt()
- Dim ScriptLength As Integer
- ret->Type_ = EVENT.EVT_COMMON
- ret->ID = Stream.ReadInt()
- ret->PagesAmount = 1
- ret->Pages = New EVENTPAGE[1]
- Var cpage = ret->Pages
- cpage->ID = 1
- cpage->StartConditions = New STARTCONDITIONS
- Var ccond = cpage->StartConditions
- Do While Stream.Position < StreamLength
- Select Case Stream.ReadBER()
- Case &h00
- ' End of block
- Exit Do
- Case &h01
- ' Name
- Var slen = Stream.ReadBER()
- ret->Name = CreateString(slen)
- *ret->Name = Stream.ReadString(slen)
- Case &h0B
- ' Activation condition
- Stream.ReadBER() ' Throw away
- Select Case Stream.ReadBER()
- Case 3
- cpage->Trigger = EVENTPAGE.EPTC_AUTOSTART
- Case 4
- cpage->Trigger = EVENTPAGE.EPTC_PARALLEL
- Case 5
- cpage->Trigger = EVENTPAGE.EPTC_CALL
- End Select
- Case &h0C
- ' Use switch?
- Stream.ReadBER() ' Throw away
- If (cpage->Trigger = EVENTPAGE.EPTC_AUTOSTART Or cpage->Trigger = EVENTPAGE.EPTC_PARALLEL) Then ccond->Used = IIf(Stream.ReadBER(), STARTCONDITIONS.EPSC_SWITCH1, 0)
- Case &h0D
- ' Switch ID
- Stream.ReadBER() ' Throw away
- Var sid = Stream.ReadBER()
- ccond->Switch1_ID = sid
- Case &h15
- ' Script length
- Stream.ReadBER() ' Throw away
- ScriptLength = Stream.ReadBER()
- Case &h16
- ' Script
- ReadEventCommands(Stream, cpage, Stream.ReadBER())
- Case Else
- Var slen = Stream.ReadBER()
- Stream.Position += slen
- End Select
- Loop
- Return ret
- Case Else
- Return NULL
- End Select
- End Function
- Sub WriteMoveEventCommands(ByRef Stream As StreamWriter, MoveEvent As MOVEEVENTDATA Ptr, Coded As Boolean = FALSE)
- For i As Integer = 0 To MoveEvent->CommandsAmount - 1
- Var cmd = MoveEvent->Commands[i].Command
- Stream.WriteBER(cmd)
- Select Case cmd
- Case MOVEEVENTCOMMAND.ME_SWITCH_ON, MOVEEVENTCOMMAND.ME_SWITCH_OFF
- Stream.WriteBER(MoveEvent->Commands[i].Switch_ID)
- Case MOVEEVENTCOMMAND.ME_CHANGE_GRAPHIC
- Stream.WriteString(*MoveEvent->Commands[i].Sprite_Filename, TRUE, , Coded)
- Stream.WriteBER(MoveEvent->Commands[i].Sprite_ID)
- Case MOVEEVENTCOMMAND.ME_PLAY_SE
- Stream.WriteString(*MoveEvent->Commands[i].SE_Filename, TRUE, , Coded)
- Stream.WriteBER(MoveEvent->Commands[i].SE_Volume)
- Stream.WriteBER(MoveEvent->Commands[i].SE_Tempo)
- Stream.WriteBER(MoveEvent->Commands[i].SE_Balance)
- End Select
- Next
- End Sub
- Sub WriteEventCommands(ByRef Stream As StreamWriter, Page As EVENTPAGE Ptr, Finalize As Boolean)
- AdjustTreeDepth(Page)
- For i As Integer = 0 To Page->CommandsAmount - 1
- Stream.WriteBER(Page->Commands[i].Command)
- Stream.WriteBER(Page->Commands[i].TreeDepth)
- Stream.WriteString(SafeStrAcc(Page->Commands[i].NameBlock), TRUE)
- If Page->Commands[i].Command = EVCMD_MOVE_EVENT Then
- Scope
- Dim Stream2 As StreamWriter
- WriteMoveEventCommands(Stream2, Page->Commands[i].MoveEventBlock)
- Stream.WriteBER(Len(Stream2.Data) + 4)
- End Scope
- Stream.WriteBER(Page->Commands[i].MoveEventBlock->Target)
- Stream.WriteBER(Page->Commands[i].MoveEventBlock->Frequency)
- Stream.WriteBER(Page->Commands[i].MoveEventBlock->RepeatPattern)
- Stream.WriteBER(Page->Commands[i].MoveEventBlock->IgnoreImpossible)
- WriteMoveEventCommands(Stream, Page->Commands[i].MoveEventBlock, TRUE)
- Else
- Stream.WriteBER(Page->Commands[i].ParamsAmount)
- For j As Integer = 0 To Page->Commands[i].ParamsAmount - 1
- Stream.WriteBER(Page->Commands[i].Params[j])
- Next
- EndIf
- Next
- If Finalize Then
- Stream.WriteBER(&h00)
- Stream.WriteBER(&h00)
- Stream.WriteBER(&h00)
- Stream.WriteBER(&h00)
- EndIf
- End Sub
- Sub WriteEventPage(ByRef Stream As StreamWriter, Event_ As EVENT Ptr, pagenum As Integer, writepagenum As Boolean = FALSE)
- Var cpage = @(Event_->Pages[pagenum - 1])
- If writepagenum Then Stream.WriteBER(cpage->ID)
- ' Start conditions
- Scope
- Dim Stream2 As StreamWriter
- Var ccond = cpage->StartConditions
- ' Bitfield - which cond. are used?
- Stream2.WriteBER(&h01)
- Stream2.WriteBER(1)
- Stream2.WriteByte(ccond->Used And &h7F)
- ' Switch 1 ID
- If ccond->Used And STARTCONDITIONS.EPSC_SWITCH1 Then Stream2.WriteBER(ccond->Switch1_ID, TRUE, &h02)
- ' Switch 2 ID
- If ccond->Used And STARTCONDITIONS.EPSC_SWITCH2 Then Stream2.WriteBER(ccond->Switch2_ID, TRUE, &h03)
- ' Variable ID
- If ccond->Used And STARTCONDITIONS.EPSC_VARIABLE Then Stream2.WriteBER(ccond->Variable_ID, TRUE, &h04)
- ' Variable Value
- If ccond->Used And STARTCONDITIONS.EPSC_VARIABLE Then Stream2.WriteBER(ccond->Variable_Value, TRUE, &h05)
- ' Item ID
- If ccond->Used And STARTCONDITIONS.EPSC_ITEM Then Stream2.WriteBER(ccond->Item_ID, TRUE, &h06)
- ' Hero ID
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_IN_PARTY Then Stream2.WriteBER(ccond->HeroInParty_HeroID, TRUE, &h07)
- ' Timer 1 sec. remaining
- If ccond->Used And STARTCONDITIONS.EPSC_TIMER1 Then Stream2.WriteBER(ccond->Timer1_Sec, TRUE, &h08)
- ' Timer 2 sec. remaining
- If ccond->Used And STARTCONDITIONS.EPSC_TIMER2 Then Stream2.WriteBER(ccond->Timer2_Sec, TRUE, &h09)
- ' Variable comparison
- If ccond->Used And STARTCONDITIONS.EPSC_VARIABLE Then Stream2.WriteBER(ccond->Variable_Comparison, TRUE, &h0A)
- ' End of block
- Stream2.WriteBER(&h00)
- Stream.WriteString(Stream2.Data, TRUE, &h02)
- End Scope
- ' Sprite filename
- If cpage->Sprite_Filename <> NULL Then Stream.WriteString(*cpage->Sprite_Filename, TRUE, &h15)
- ' Sprite ID
- Stream.WriteBER(cpage->Sprite_ID, TRUE, &h16)
- ' Facing direction
- Stream.WriteBER(cpage->FacingDirection, TRUE, &h17)
- ' Animation frame
- Stream.WriteBER(cpage->Frame, TRUE, &h18)
- ' Transparency
- Stream.WriteBER(cpage->Sprite_Transparency, TRUE, &h19)
- ' Movement type
- Stream.WriteBER(cpage->MovementType, TRUE, &h1F)
- ' Movement frequency
- Stream.WriteBER(cpage->MovementFrequency, TRUE, &h20)
- ' Trigger condition
- Stream.WriteBER(cpage->Trigger, TRUE, &h21)
- ' Event level
- Stream.WriteBER(cpage->EventLevel, TRUE, &h22)
- ' Forbid event overlap
- Stream.WriteBER(cpage->ForbidEventOverlap, TRUE, &h23)
- ' Animation type
- Stream.WriteBER(cpage->AnimationType, TRUE, &h24)
- ' Movement speed
- Stream.WriteBER(cpage->MovementSpeed, TRUE, &h25)
- ' Movement pattern
- If cpage->MovementType = EVENTPAGE.EPMT_CUSTOM And cpage->MovementPattern <> NULL Then
- Scope
- Dim Stream2 As StreamWriter
- Var cpattern = cpage->MovementPattern
- Scope
- Dim Stream3 As StreamWriter
- WriteMoveEventCommands(Stream3, cpattern)
- ' Move event length
- Stream2.WriteBER(Len(Stream3.Data), TRUE, &h0B)
- ' Move event data
- Stream2.WriteString(Stream3.Data, TRUE, &h0C)
- End Scope
- ' Repeat pattern
- Stream2.WriteBER(cpattern->RepeatPattern, TRUE, &h15)
- ' Ignore impossible
- Stream2.WriteBER(cpattern->IgnoreImpossible, TRUE, &h16)
- ' End of block
- Stream2.WriteBER(&h00)
- Stream.WriteString(Stream2.Data, TRUE, &h29)
- End Scope
- EndIf
- Scope
- Dim Stream2 As StreamWriter
- WriteEventCommands(Stream2, cpage, TRUE)
- ' Script length
- Stream.WriteBER(Len(Stream2.Data), TRUE, &h33)
- ' Script
- Stream.WriteString(Stream2.Data, TRUE, &h34)
- End Scope
- ' End of block
- Stream.WriteBER(&h00)
- End Sub
- Sub WriteBattleEventPage(ByRef Stream As StreamWriter, Event_ As EVENT Ptr, pagenum As Integer, writepagenum As Boolean = FALSE)
- Var cpage = @(Event_->Pages[pagenum - 1])
- If writepagenum Then Stream.WriteBER(cpage->ID)
- ' Start conditions
- Scope
- Dim Stream2 As StreamWriter
- Var ccond = cpage->StartConditions
- ' Bitfield - which cond. are used?
- Dim fld As Integer = ccond->Used And &h007
- If ccond->Used And STARTCONDITIONS.EPSC_TURNS Then fld Or= &h008
- If ccond->Used And STARTCONDITIONS.EPSC_EXHAUSTION Then fld Or= &h010
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_HP Then fld Or= &h020
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_HP Then fld Or= &h040
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_TURNS Then fld Or= &h080
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_TURNS Then fld Or= &h100
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_COMMAND Then fld Or= &h200
- Stream2.WriteBER(&h01)
- Stream2.WriteBER(2)
- Stream2.WriteByte(fld And &hFF)
- Stream2.WriteByte(fld Shr 8)
- ' Switch 1 ID
- If ccond->Used And STARTCONDITIONS.EPSC_SWITCH1 Then Stream2.WriteBER(ccond->Switch1_ID, TRUE, &h02)
- ' Switch 2 ID
- If ccond->Used And STARTCONDITIONS.EPSC_SWITCH2 Then Stream2.WriteBER(ccond->Switch2_ID, TRUE, &h03)
- ' Variable ID
- If ccond->Used And STARTCONDITIONS.EPSC_VARIABLE Then Stream2.WriteBER(ccond->Variable_ID, TRUE, &h04)
- ' Variable Value
- If ccond->Used And STARTCONDITIONS.EPSC_VARIABLE Then Stream2.WriteBER(ccond->Variable_Value, TRUE, &h05)
- ' Turns elapsed (A)
- If ccond->Used And STARTCONDITIONS.EPSC_TURNS Then Stream2.WriteBER(ccond->Turns_Elapsed1, TRUE, &h06)
- ' Turns elapsed (B)
- If ccond->Used And STARTCONDITIONS.EPSC_TURNS Then Stream2.WriteBER(ccond->Turns_Elapsed2, TRUE, &h07)
- ' Exhaustion min.
- If ccond->Used And STARTCONDITIONS.EPSC_EXHAUSTION Then Stream2.WriteBER(ccond->Exhaustion_Min, TRUE, &h08)
- ' Exhaustion max.
- If ccond->Used And STARTCONDITIONS.EPSC_EXHAUSTION Then Stream2.WriteBER(ccond->Exhaustion_Max, TRUE, &h09)
- ' Monster HP: Monster ID
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_HP Then Stream2.WriteBER(ccond->MonsterHP_MonsterID, TRUE, &h0A)
- ' Monster HP: HP min.
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_HP Then Stream2.WriteBER(ccond->MonsterHP_Min, TRUE, &h0B)
- ' Monster HP: HP max.
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_HP Then Stream2.WriteBER(ccond->MonsterHP_Max, TRUE, &h0C)
- ' Hero HP: Hero ID
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_HP Then Stream2.WriteBER(ccond->HeroHP_HeroID, TRUE, &h0D)
- ' Hero HP: HP min.
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_HP Then Stream2.WriteBER(ccond->HeroHP_Min, TRUE, &h0E)
- ' Hero HP: HP max.
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_HP Then Stream2.WriteBER(ccond->HeroHP_Max, TRUE, &h0F)
- ' Monster turns: Monster ID
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_TURNS Then Stream2.WriteBER(ccond->MonsterTurns_MonsterID, TRUE, &h10)
- ' Monster turns: Turns elapsed (A)
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_TURNS Then Stream2.WriteBER(ccond->MonsterTurns_TurnsElapsed1, TRUE, &h11)
- ' Monster turns: Turns elapsed (B)
- If ccond->Used And STARTCONDITIONS.EPSC_MONSTER_TURNS Then Stream2.WriteBER(ccond->MonsterTurns_TurnsElapsed2, TRUE, &h12)
- ' Hero turns: Hero ID
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_TURNS Then Stream2.WriteBER(ccond->HeroTurns_HeroID, TRUE, &h13)
- ' Hero turns: Turns elapsed (A)
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_TURNS Then Stream2.WriteBER(ccond->HeroTurns_TurnsElapsed1, TRUE, &h14)
- ' Hero turns: Turns elapsed (B)
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_TURNS Then Stream2.WriteBER(ccond->HeroTurns_TurnsElapsed2, TRUE, &h15)
- ' Hero command: Hero ID
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_COMMAND Then Stream2.WriteBER(ccond->HeroCommand_HeroID, TRUE, &h16)
- ' Hero command: Command ID
- If ccond->Used And STARTCONDITIONS.EPSC_HERO_COMMAND Then Stream2.WriteBER(ccond->HeroCommand_CommandID, TRUE, &h17)
- ' End of block
- Stream2.WriteBER(&h00)
- Stream.WriteString(Stream2.Data, TRUE, &h02)
- End Scope
- Scope
- Dim Stream2 As StreamWriter
- WriteEventCommands(Stream2, cpage, TRUE)
- ' Script length
- Stream.WriteBER(Len(Stream2.Data), TRUE, &h0B)
- ' Script
- Stream.WriteString(Stream2.Data, TRUE, &h0C)
- End Scope
- ' End of block
- Stream.WriteBER(&h00)
- End Sub
- Function SetClipboardContent(ContentType As CLIPBOARDCONTENTTYPE, Data_ As EVENT Ptr, PageID As Integer = 1, FirstCommand As Integer = 0, LastCommand As Integer = -1, DontWrite As Boolean = FALSE) As String
- If ContentType <> CBCT_TEXT Then
- If IsBadReadPtr(Data_, 4) OrElse Data_->_ObjectType <> OBJ_EVENT Then
- If DontWrite = FALSE Then ClearClipboard()
- Return ""
- EndIf
- EndIf
- PageID = min(PageID, Data_->PagesAmount)
- PageID = max(PageID, 1)
- Select Case ContentType
- Case CBCT_TEXT
- ' Text
- If IsBadReadPtr(Data_, 1) Then
- If DontWrite = FALSE Then WriteClipboard("")
- Return ""
- Else
- If DontWrite = FALSE Then WriteClipboard(*Cast(ZString Ptr, Data_))
- Return *Cast(ZString Ptr, Data_)
- EndIf
- Case CBCT_EVENT
- ' Map event
- Dim Stream As StreamWriter
- Stream.WriteByte(0)
- ' Name
- Stream.WriteString(SafeStrAcc(Data_->Name), TRUE, &h01)
- ' X position
- Stream.WriteBER(Data_->Coordinates.x, TRUE, &h02)
- ' Y position
- Stream.WriteBER(Data_->Coordinates.y, TRUE, &h03)
- ' Pages
- Scope
- Dim Stream2 As StreamWriter
- Stream2.WriteBER(Data_->PagesAmount)
- For i As Integer = 1 To Data_->PagesAmount
- WriteEventPage(Stream2, Data_, i, TRUE)
- Next
- Stream.WriteString(Stream2.Data, TRUE, &h05)
- End Scope
- ' End of block
- Stream.WriteBER(&h00)
- Stream.Data = Mki(Len(Stream.Data)) + Stream.Data
- If DontWrite = FALSE Then WriteClipboard(Stream.Data, CBCT_EVENT)
- Return Stream.Data
- Case CBCT_EVENTPAGE
- ' Event page
- Dim Stream As StreamWriter
- Stream.WriteInt(1)
- WriteEventPage(Stream, Data_, PageID, FALSE)
- Stream.Data = Mki(Len(Stream.Data)) + Stream.Data
- If DontWrite = FALSE Then WriteClipboard(Stream.Data, CBCT_EVENTPAGE)
- Return Stream.Data
- Case CBCT_BATTLEEVENTPAGE
- ' Battle event page
- Dim Stream As StreamWriter
- Stream.WriteInt(1)
- WriteBattleEventPage(Stream, Data_, PageID, FALSE)
- Stream.Data = Mki(Len(Stream.Data)) + Stream.Data
- If DontWrite = FALSE Then WriteClipboard(Stream.Data, CBCT_BATTLEEVENTPAGE)
- Return Stream.Data
- Case CBCT_EVENTCOMMANDS
- ' Event commands
- Dim Stream As StreamWriter
- If LastCommand = -1 Then
- LastCommand = Data_->Pages[PageID - 1].CommandsAmount - 1
- Else
- LastCommand = min(LastCommand, Data_->Pages[PageID - 1].CommandsAmount - 1)
- LastCommand = max(LastCommand, -1)
- EndIf
- FirstCommand = min(FirstCommand, Data_->Pages[PageID - 1].CommandsAmount - 1)
- FirstCommand = max(FirstCommand, 0)
- Var oldcmds = Data_->Pages[PageID - 1].Commands
- Var oldcmdsa = Data_->Pages[PageID - 1].CommandsAmount
- Data_->Pages[PageID - 1].CommandsAmount = LastCommand - FirstCommand + 1
- Data_->Pages[PageID - 1].Commands = New EVENTCOMMAND[Data_->Pages[PageID - 1].CommandsAmount]
- memcpy(Data_->Pages[PageID - 1].Commands, oldcmds + FirstCommand, (Data_->Pages[PageID - 1].CommandsAmount) * SizeOf(EVENTCOMMAND))
- WriteEventCommands(Stream, @(Data_->Pages[PageID - 1]), FALSE)
- Data_->Pages[PageID - 1].Commands = oldcmds
- Data_->Pages[PageID - 1].CommandsAmount = oldcmdsa
- Stream.Data = Mki(Len(Stream.Data)) + Stream.Data
- If DontWrite = FALSE Then WriteClipboard(Stream.Data, CBCT_EVENTCOMMANDS)
- Return Stream.Data
- Case CBCT_MONSTERGROUP
- ' Monster group
- Dim Stream As StreamWriter
- Stream.WriteInt(1)
- ' Name
- Stream.WriteString(SafeStrAcc(Data_->Name), TRUE, &h01)
- ' Other monster group information
- If Data_->ExtraInformation <> NULL Then
- For i As Integer = &h02 To &hFF
- If i <> &h0B And Len(Data_->ExtraInformation->i(i)) > 0 Then
- Stream.WriteString(Data_->ExtraInformation->i(i), TRUE, i)
- EndIf
- Next
- EndIf
- ' Pages
- Scope
- Dim Stream2 As StreamWriter
- Stream2.WriteBER(Data_->PagesAmount)
- For i As Integer = 1 To Data_->PagesAmount
- WriteBattleEventPage(Stream2, Data_, i, TRUE)
- Next
- Stream.WriteString(Stream2.Data, TRUE, &h0B)
- End Scope
- ' End of block
- Stream.WriteBER(&h00)
- Stream.Data = Mki(Len(Stream.Data)) + Stream.Data
- If DontWrite = FALSE Then WriteClipboard(Stream.Data, CBCT_MONSTERGROUP)
- Return Stream.Data
- Case CBCT_COMMONEVENT
- Dim Stream As StreamWriter
- Stream.WriteInt(1)
- ' Name
- Stream.WriteString(SafeStrAcc(Data_->Name), TRUE, &h01)
- ' Activation condition
- Select Case Data_->Pages[PageID - 1].Trigger
- Case EVENTPAGE.EPTC_AUTOSTART
- Stream.WriteBER(3, TRUE, &h0B)
- Case EVENTPAGE.EPTC_PARALLEL
- Stream.WriteBER(4, TRUE, &h0B)
- Case Else
- Stream.WriteBER(5, TRUE, &h0B)
- End Select
- If Data_->Pages[PageID - 1].StartConditions->Used And STARTCONDITIONS.EPSC_SWITCH1 Then
- ' Use switch?
- Stream.WriteBER(1, TRUE, &h0C)
- ' Switch ID
- Stream.WriteBER(Data_->Pages[PageID - 1].StartConditions->Switch1_ID, TRUE, &h0D)
- ElseIf Data_->Pages[PageID - 1].StartConditions->Used And STARTCONDITIONS.EPSC_SWITCH2 Then
- ' Use switch?
- Stream.WriteBER(1, TRUE, &h0C)
- ' Switch ID
- Stream.WriteBER(Data_->Pages[PageID - 1].StartConditions->Switch2_ID, TRUE, &h0D)
- EndIf
- Scope
- Dim Stream2 As StreamWriter
- WriteEventCommands(Stream2, @(Data_->Pages[PageID - 1]), TRUE)
- ' Script length
- Stream.WriteBER(Len(Stream2.Data), TRUE, &h15)
- ' Script
- Stream.WriteString(Stream2.Data, TRUE, &h16)
- End Scope
- ' End of block
- Stream.WriteBER(&h00)
- Stream.Data = Mki(Len(Stream.Data)) + Stream.Data
- If DontWrite = FALSE Then WriteClipboard(Stream.Data, CBCT_COMMONEVENT)
- Return Stream.Data
- Case Else
- If DontWrite = FALSE Then ClearClipboard()
- Return ""
- End Select
- End Function
- End Namespace
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement