qt branch: Kill off the over-engineered tagfile format. Replacing it with the more retro ini file format.
parent
1ada89fb66
commit
df4e48ec16
|
@ -26,7 +26,6 @@ BASELIST = \
|
||||||
shaders\
|
shaders\
|
||||||
stats \
|
stats \
|
||||||
structs \
|
structs \
|
||||||
tagdefinitions \
|
|
||||||
texpages \
|
texpages \
|
||||||
tileset \
|
tileset \
|
||||||
wrf
|
wrf
|
||||||
|
|
|
@ -8,7 +8,7 @@ const buggy = "BarbarianBuggy";
|
||||||
const bloke = "BaBaPeople";
|
const bloke = "BaBaPeople";
|
||||||
const jeep = "BabaJeep";
|
const jeep = "BabaJeep";
|
||||||
const firetruck = "BabaFireTruck";
|
const firetruck = "BabaFireTruck";
|
||||||
const cannonbus = "BabaBusCan"
|
const cannonbus = "BabaBusCan";
|
||||||
const firebus = "BabaFireCan";
|
const firebus = "BabaFireCan";
|
||||||
|
|
||||||
// scav group
|
// scav group
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
#
|
|
||||||
# FORMAT: tag enum, value representation (VR), value multiplicity (VM), default value
|
|
||||||
# VR: ST for text, US for unsigned, SI for signed, FP for floating point, GR for group,
|
|
||||||
# EN for group end, BO for boolean
|
|
||||||
# VM: Must be no longer than the size given here; set to 00 for repeating groups
|
|
||||||
# default value cannot be set for VM > 1, ST, GR or EN
|
|
||||||
#
|
|
||||||
01 ST 12 - # Format identifier: "FXData"
|
|
||||||
02 GR 00 - # EFFECTS GROUP
|
|
||||||
01 US 01 - # control
|
|
||||||
02 US 01 - # group
|
|
||||||
03 US 01 - # type
|
|
||||||
04 US 01 - # frameNumber
|
|
||||||
05 US 01 - # size
|
|
||||||
06 US 01 - # baseScale
|
|
||||||
07 US 01 - # specific
|
|
||||||
08 FP 03 - # Position vector
|
|
||||||
09 FP 03 - # Velocity vector
|
|
||||||
0A SI 03 - # Rotation vector
|
|
||||||
0B SI 03 - # Spin vector
|
|
||||||
0C US 01 - # birthTime
|
|
||||||
0D US 01 - # lastFrame
|
|
||||||
0E US 01 - # frameDelay
|
|
||||||
0F US 01 - # lifeSpan
|
|
||||||
10 US 01 - # radius
|
|
||||||
11 ST 00 - # IMD file name
|
|
||||||
FF EN 00 -
|
|
|
@ -1,28 +0,0 @@
|
||||||
#
|
|
||||||
# FORMAT: tag enum, value representation (VR), value multiplicity (VM), default value
|
|
||||||
# VR: ST for text, US for unsigned, SI for signed, FP for floating point, GR for group,
|
|
||||||
# EN for group end, BO for boolean
|
|
||||||
# VM: Must be no longer than the size given here; set to 00 for repeating groups
|
|
||||||
# default value cannot be set for VM > 1, ST, GR or EN
|
|
||||||
#
|
|
||||||
01 ST 12 - # Format identifier: "WZTAGFILE1"
|
|
||||||
02 GR 00 - # DROID GROUP
|
|
||||||
01 US 01 - # Droid ID
|
|
||||||
02 US 03 - # Droid position in (x,y,z) coordinates
|
|
||||||
03 FP 01 - # RETIRED (had unknown usage)
|
|
||||||
04 FP 03 - # RETIRED (had unknown usage)
|
|
||||||
05 US 500 - # Long unsigned byte array
|
|
||||||
06 US 500 - # Long unsigned byte array
|
|
||||||
09 GR 00 - # Droid weapon group
|
|
||||||
01 US 01 - # Weapon type
|
|
||||||
02 US 01 10 # Ammo left
|
|
||||||
03 US 01 0 # Time last fired
|
|
||||||
04 US 01 0 # Recoil value
|
|
||||||
05 SI 03 - # Array of signed int
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
||||||
03 GR 00 - # STRUCTURE GROUP
|
|
||||||
01 US 01 - # Structure ID
|
|
||||||
02 US 03 - # Structure position in (x,y,z) coordinates
|
|
||||||
FF EN 00 -
|
|
||||||
04 US 01 09 # Some default value of 9
|
|
|
@ -1,215 +0,0 @@
|
||||||
#
|
|
||||||
# FORMAT: tag enum, value representation (VR), value multiplicity (VM), default value
|
|
||||||
# VR: ST for text, US for unsigned, SI for signed, FP for floating point, GR for group,
|
|
||||||
# EN for group end, BO for boolean
|
|
||||||
# VM: Must be no longer than the size given here; set to 00 for repeating groups
|
|
||||||
# default value cannot be set for VM > 1, ST, GR or EN
|
|
||||||
#
|
|
||||||
01 ST 01 - # Format identifier: "WZTAGFILE1"
|
|
||||||
03 GR 01 - # MAP INFO GROUP
|
|
||||||
01 US 01 64 # Map width
|
|
||||||
02 US 01 64 # Map height
|
|
||||||
FF EN 00 -
|
|
||||||
04 GR 01 - # CAMERA INFO GROUP
|
|
||||||
01 FP 03 - # Camera position
|
|
||||||
02 FP 03 - # Camera rotation
|
|
||||||
FF EN 00 -
|
|
||||||
05 GR 00 - # TEXTURE GROUP
|
|
||||||
01 ST 80 - # Texture name
|
|
||||||
FF EN 00 -
|
|
||||||
0a GR 00 - # TILE GROUP
|
|
||||||
01 US 01 0 # Terrain type
|
|
||||||
02 US 01 0 # Texture number
|
|
||||||
03 US 01 0 # Triangle flip
|
|
||||||
04 US 01 0 # Texture x flip
|
|
||||||
05 US 01 0 # Texture y flip
|
|
||||||
06 US 01 0 # Not blocking (even if structure or feature on it)
|
|
||||||
07 US 01 0 # *RETIRED* Do not draw flag
|
|
||||||
08 US 01 0 # Height of first corner
|
|
||||||
09 US 01 0 # Visibility bits
|
|
||||||
0a US 01 0 # Info bits
|
|
||||||
0b US 01 0 # Rotation
|
|
||||||
FF EN 00 -
|
|
||||||
0b GR 00 - # GATEWAY GROUP
|
|
||||||
01 US 04 - # (x1, y1, x2, y2) coordinates
|
|
||||||
FF EN 00 -
|
|
||||||
0c GR 00 - # TEXTURE <=> TERRAIN TYPE MAPPING GROUP
|
|
||||||
01 US 01 0 # The terrain type of this texture
|
|
||||||
FF EN 00 -
|
|
||||||
0d GR 00 - # PLAYER INFO GROUP
|
|
||||||
01 GR 00 - # RESEARCH GROUP
|
|
||||||
01 US 01 1 # Is research possible of this tech?
|
|
||||||
02 US 01 0 # Research status
|
|
||||||
03 US 01 0 # Current research points
|
|
||||||
FF EN 00 -
|
|
||||||
02 GR 00 - # STRUCTURE LIMITS GROUP
|
|
||||||
01 ST 80 - # Name of structure
|
|
||||||
02 US 01 255 # Limit
|
|
||||||
FF EN 00 -
|
|
||||||
03 GR 00 - # FLAGS GROUP
|
|
||||||
01 US 01 - # Type
|
|
||||||
02 US 01 0 # Frame number last drawn
|
|
||||||
03 US 03 - # Screen coordinates and radius (x, y, r)
|
|
||||||
04 US 04 - # Player that the position belongs to
|
|
||||||
05 BO 05 0 # Is position selected by the player?
|
|
||||||
06 US 03 - # World coordinates (x, y, z)
|
|
||||||
07 US 01 0 # Factory index
|
|
||||||
08 US 01 0 # Factory type
|
|
||||||
09 US 01 - # Repair ID - only set if factory type is REPAIR_FLAG
|
|
||||||
0a BO 01 0 # Do not register flag in flag list (commanders)
|
|
||||||
FF EN 00 -
|
|
||||||
04 GR 00 - # MESSAGE GROUP
|
|
||||||
01 SI 01 -1 # Object ID, if set, use it rather than name below; -1 means unset
|
|
||||||
02 ST 80 - # Name
|
|
||||||
03 BO 01 0 # Is message read?
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
||||||
0e GR 00 - # PRODUCTION RUNS GROUP (factory types)
|
|
||||||
01 GR 00 - # Number of factories
|
|
||||||
01 GR 00 - # Production runs for each factory
|
|
||||||
01 US 01 0 # Quantity
|
|
||||||
02 US 01 0 # Built
|
|
||||||
03 SI 01 -1 # Template multiplayerID, -1 if none
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
||||||
0f GR 00 - # OBJECT GROUP
|
|
||||||
01 GR 00 - # BASE OBJECT GROUP
|
|
||||||
01 US 01 - # Object type (always type droid)
|
|
||||||
02 US 01 - # Unique object id
|
|
||||||
03 US 03 - # (x, y, z) position coordinates
|
|
||||||
04 FP 01 - # Direction
|
|
||||||
05 SI 01 - # Pitch
|
|
||||||
06 SI 01 - # Roll
|
|
||||||
07 US 01 - # Player
|
|
||||||
08 US 01 - # Selection group
|
|
||||||
09 US 01 - # Selected
|
|
||||||
0a US 01 - # Cluster
|
|
||||||
0b US 08 - # Visibility per player
|
|
||||||
0c US 01 - # Died (in game time)
|
|
||||||
0d US 01 - # Last smoke emission (in game time)
|
|
||||||
0e BO 01 - # On fire?
|
|
||||||
0f US 01 - # Burn start (in game time)
|
|
||||||
10 US 01 - # Total accumulated burn damage
|
|
||||||
FF EN 00 -
|
|
||||||
02 GR 00 - # SENSOR GROUP
|
|
||||||
01 US 01 0 # Sensor range
|
|
||||||
02 US 01 0 # Sensor power
|
|
||||||
03 US 01 0 # ECM range
|
|
||||||
04 US 01 0 # ECM power
|
|
||||||
FF EN 00 -
|
|
||||||
03 GR 00 - # OBJECT STAT GROUP
|
|
||||||
01 US 01 - # Original body points
|
|
||||||
02 US 01 2 # Number of weapon classes
|
|
||||||
03 GR 00 - # ARMOUR GROUP (for each defined side)
|
|
||||||
01 US 01 0 # Armour vs kinetic weapons
|
|
||||||
02 US 02 0 # Armour vs heat weapons
|
|
||||||
FF EN 00 -
|
|
||||||
04 US 01 - # Resistance (used in electronic warfare)
|
|
||||||
FF EN 00 -
|
|
||||||
04 GR 00 - # WEAPON GROUP
|
|
||||||
01 US 01 - # Weapon type
|
|
||||||
02 US 01 0 # Weapon rotation
|
|
||||||
03 US 01 0 # Weapon pitch
|
|
||||||
04 US 01 0 # hitPoints REMOVED
|
|
||||||
05 US 01 0 # Ammo
|
|
||||||
06 US 01 0 # Time frame it was last fired
|
|
||||||
07 US 01 0 # recoilValue (EXPLAIN ME)
|
|
||||||
08 SI 01 -1 # ID of weapon target, -1 if none
|
|
||||||
FF EN 00 -
|
|
||||||
0a GR 00 - # DROID GROUP
|
|
||||||
01 US 01 - # Droid type
|
|
||||||
02 US 0a - # Components
|
|
||||||
03 BO 01 0 # Transport on mission?
|
|
||||||
07 US 01 - # Weight
|
|
||||||
08 US 01 - # Base speed
|
|
||||||
09 ST 60 - # Droid name (typically template name)
|
|
||||||
0a US 01 - # Current body points
|
|
||||||
0b FP 01 - # Experience
|
|
||||||
0c US 01 - # Name version (EXPLAIN ME)
|
|
||||||
0e SI 01 -1 # Current job target ID (repairing stuff etc)
|
|
||||||
0f SI 01 -1 # Current stats target ID (building stuff etc)
|
|
||||||
10 SI 01 -1 # Current base target ID (rearm pad etc)
|
|
||||||
11 US 01 0 # Current order
|
|
||||||
12 US 04 - # Current order parameters
|
|
||||||
13 GR 00 - # DROID ORDER GROUP (queued orders)
|
|
||||||
01 US 01 - # Order
|
|
||||||
02 US 04 - # Order parameters
|
|
||||||
FF EN 00 -
|
|
||||||
14 SI 01 0 # Formation direction
|
|
||||||
15 SI 01 0 # Formation X
|
|
||||||
16 SI 01 0 # Formation Y
|
|
||||||
17 US 03 - # VTOL ammo (for each weapon)
|
|
||||||
18 SI 02 - # Droid movement final destination (x, y)
|
|
||||||
19 SI 02 - # Droid movement origin (x, y)
|
|
||||||
1a SI 02 - # Droid movement immediate target (x, y)
|
|
||||||
1b FP 03 - # Fractions of x,y,z
|
|
||||||
1c FP 01 - # Droid speed
|
|
||||||
1d SI 02 - # Vector for the end of path boundary (x, y)
|
|
||||||
1e US 02 - # Position of last bump (x, y)
|
|
||||||
1f SI 01 - # Direction of motion (not the direction the droid is facing)
|
|
||||||
20 SI 01 - # Direction at last bump
|
|
||||||
21 US 01 - # Time of first bump with something
|
|
||||||
22 US 01 - # Time of last bump with a droid - relative to bumpTime
|
|
||||||
23 US 01 - # When MOVEPAUSE started - relative to bumpTime
|
|
||||||
24 US 01 - # VTOL movement speed
|
|
||||||
25 GR 00 - # PATH GROUP (each item is a position in a path)
|
|
||||||
01 US 01 - # (x, y) position node
|
|
||||||
FF EN 00 -
|
|
||||||
26 US 01 0 # Path status
|
|
||||||
27 US 01 0 # Current position in path
|
|
||||||
FF EN 00 -
|
|
||||||
0b GR 00 - # STRUCTURE GROUP (EXPLAIN ME)
|
|
||||||
01 US 01 - # Structure type
|
|
||||||
02 SI 01 0 # currentPowerAccrued
|
|
||||||
03 US 01 0 # lastResistance
|
|
||||||
04 US 01 0 # targetted
|
|
||||||
05 US 01 0 # timeLastHit
|
|
||||||
06 US 01 0 # lastHitWeapon
|
|
||||||
07 US 01 1 # status (0 = being built, 1 = built, 2 = being demolished)
|
|
||||||
08 SI 01 0 # currentBuildPts
|
|
||||||
FF EN 00 -
|
|
||||||
0c GR 00 - # FEATURE GROUP
|
|
||||||
01 US 01 0 # Time frame it was created
|
|
||||||
FF EN 00 -
|
|
||||||
0d GR 00 - # FACTORY GROUP
|
|
||||||
01 US 01 0 # Capacity (the max size of body the factory can produce)
|
|
||||||
02 US 01 0 # Quantity (the number of droids to produce OR for selectedPlayer, how many loops to perform)
|
|
||||||
03 US 01 0 # Loops performed
|
|
||||||
04 US 01 0 # Production output (droid build points produced per build cycle)
|
|
||||||
05 US 01 0 # powerAccrued (used to keep track of power before building a droid)
|
|
||||||
06 SI 01 -1 # ID of template used, -1 for none
|
|
||||||
07 US 01 0 # timeStarted
|
|
||||||
08 US 01 0 # timeToBuild
|
|
||||||
09 US 01 0 # timeStartHold
|
|
||||||
0a US 01 0 # secondaryOrder
|
|
||||||
0b SI 01 -1 # Factory number, also used to find right flag after game load, oddly enough; -1 for none
|
|
||||||
0c SI 01 -1 # Commander ID, if any, -1 if none
|
|
||||||
FF EN 00 -
|
|
||||||
0e GR 00 - # RESEARCH GROUP
|
|
||||||
01 US 01 0 # Number of upgrades it has
|
|
||||||
02 US 01 0 # powerAccrued
|
|
||||||
03 US 01 0 # timeStartHold
|
|
||||||
04 US 01 0 # ID of research target
|
|
||||||
05 US 01 0 # Time frame research started
|
|
||||||
FF EN 00 -
|
|
||||||
0f GR 00 - # RESOURCE EXTRACTOR GROUP
|
|
||||||
01 US 01 0 # Maximum amount of power that can be extracted from this resource
|
|
||||||
02 SI 01 -1 # ID of power plant that owns this resource, if any, -1 if none
|
|
||||||
FF EN 00 -
|
|
||||||
10 GR 00 - # POWER PLANT GROUP
|
|
||||||
01 US 01 0 # Number of upgrades it has
|
|
||||||
FF EN 00 -
|
|
||||||
11 GR 00 - # REPAIR FACILITY GROUP
|
|
||||||
01 US 01 0 # timeStarted
|
|
||||||
02 US 01 0 # powerAccrued
|
|
||||||
03 SI 01 -1 # Object being repaired, if any, -1 if none
|
|
||||||
04 SI 01 -1 # Research facility number, also used to find right flag after game load, -1 for none
|
|
||||||
FF EN 00 -
|
|
||||||
12 GR 00 - # REARM PAD GROUP
|
|
||||||
01 US 01 0 # reArmPoints
|
|
||||||
02 US 01 0 # timeStarted
|
|
||||||
03 US 01 0 # currentPtsAdded
|
|
||||||
04 SI 01 -1 # Object being rearmed, if any, -1 if none
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
|
@ -1,19 +0,0 @@
|
||||||
#
|
|
||||||
# FORMAT: tag enum, value representation (VR), value multiplicity (VM), default value
|
|
||||||
# VR: ST for text, US for unsigned, SI for signed, FP for floating point, GR for group,
|
|
||||||
# EN for group end, BO for boolean
|
|
||||||
# VM: Must be no longer than the size given here; set to 00 for repeating groups
|
|
||||||
# default value cannot be set for VM > 1, ST, GR or EN
|
|
||||||
#
|
|
||||||
01 ST 12 - # Format identifier: "ScoreData"
|
|
||||||
02 US 01 - # units built
|
|
||||||
03 US 01 - # units killed
|
|
||||||
04 US 01 - # units lost
|
|
||||||
05 US 01 - # structures built
|
|
||||||
06 US 01 - # structures killed
|
|
||||||
07 US 01 - # structures lost
|
|
||||||
08 US 01 - # artifacts found
|
|
||||||
09 US 01 - # mission started
|
|
||||||
0A US 01 - # shots on target
|
|
||||||
0B US 01 - # shots off target
|
|
||||||
0C US 01 - # babas mowed down
|
|
|
@ -1,37 +0,0 @@
|
||||||
#
|
|
||||||
# FORMAT: tag enum, value representation (VR), value multiplicity (VM), default value
|
|
||||||
# VR: ST for text, US for unsigned, SI for signed, FP for floating point, GR for group,
|
|
||||||
# EN for group end, BO for boolean
|
|
||||||
# VM: Must be no longer than the size given here; set to 00 for repeating groups
|
|
||||||
# default value cannot be set for VM > 1, ST, GR or EN
|
|
||||||
#
|
|
||||||
01 ST 12 - # Format identifier: "WZTAGFILE1"
|
|
||||||
02 GR 00 - # DROID GROUP
|
|
||||||
01 US 01 - # Droid ID
|
|
||||||
02 US 03 - # Droid position in (x,y,z) coordinates
|
|
||||||
03 FP 01 - # RETIRED (had unknown usage)
|
|
||||||
04 FP 03 - # RETIRED (had unknown usage)
|
|
||||||
05 US 500 - # Long unsigned byte array
|
|
||||||
06 US 500 - # Long unsigned byte array
|
|
||||||
07 GR 00 - # Write-only group
|
|
||||||
01 US 01 0 # Simple value
|
|
||||||
02 US 01 0 # Simple value
|
|
||||||
03 GR 00 - # Another nested group
|
|
||||||
01 US 01 0 # Default value
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
||||||
08 GR 00 - # Empty group
|
|
||||||
FF EN 00 -
|
|
||||||
09 GR 00 - # Droid weapon group
|
|
||||||
01 US 01 - # Weapon type
|
|
||||||
02 US 01 10 # Ammo left
|
|
||||||
03 US 01 0 # Time last fired
|
|
||||||
04 US 01 0 # Recoil value
|
|
||||||
05 SI 03 - # Array of signed int
|
|
||||||
FF EN 00 -
|
|
||||||
FF EN 00 -
|
|
||||||
03 GR 00 - # STRUCTURE GROUP
|
|
||||||
01 US 01 - # Structure ID
|
|
||||||
02 US 03 - # Structure position in (x,y,z) coordinates
|
|
||||||
FF EN 00 -
|
|
||||||
04 US 01 9 # Some default value of 9
|
|
|
@ -1,14 +0,0 @@
|
||||||
#
|
|
||||||
# FORMAT: tag enum, value representation (VR), value multiplicity (VM), default value
|
|
||||||
# VR: ST for text, US for unsigned, SI for signed, FP for floating point, GR for group,
|
|
||||||
# EN for group end, BO for boolean
|
|
||||||
# VM: Must be no longer than the size given here; set to 00 for repeating groups
|
|
||||||
# default value cannot be set for VM > 1, ST, GR or EN
|
|
||||||
#
|
|
||||||
01 US 01 1
|
|
||||||
02 SI 01 2
|
|
||||||
03 FP 01 3
|
|
||||||
04 US 01 4
|
|
||||||
05 SI 01 5
|
|
||||||
06 ST 80 -
|
|
||||||
07 BO 01 1
|
|
|
@ -65,7 +65,6 @@ noinst_HEADERS = \
|
||||||
string_ext.h \
|
string_ext.h \
|
||||||
strres.h \
|
strres.h \
|
||||||
strresly.h \
|
strresly.h \
|
||||||
tagfile.h \
|
|
||||||
treap.h \
|
treap.h \
|
||||||
trig.h \
|
trig.h \
|
||||||
types.h \
|
types.h \
|
||||||
|
@ -100,7 +99,6 @@ libframework_a_SOURCES = \
|
||||||
SDL_framerate.cpp \
|
SDL_framerate.cpp \
|
||||||
stdio_ext.cpp \
|
stdio_ext.cpp \
|
||||||
strres.cpp \
|
strres.cpp \
|
||||||
tagfile.cpp \
|
|
||||||
treap.cpp \
|
treap.cpp \
|
||||||
trig.cpp \
|
trig.cpp \
|
||||||
utf.cpp
|
utf.cpp
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,102 +0,0 @@
|
||||||
// Written by Per I Mathisen, 2007
|
|
||||||
// Released into the public domain, no rights reserved.
|
|
||||||
//
|
|
||||||
// The tagfile format is portable, nested, tagged binary format that should be
|
|
||||||
// useful for storing information that needs to be accessible several years
|
|
||||||
// into the future. That is, it is an easily extensible binary format, a feature
|
|
||||||
// usually reserved for text based formats. It also uses default values to
|
|
||||||
// reduce space, and despite its tagged nature, it consumes only a minimal overhead
|
|
||||||
// through the use a well-defined protocol file that is loaded separately.
|
|
||||||
//
|
|
||||||
// Each user of this code should define a protocol that is henceforth called
|
|
||||||
// the defined format. This consists of a series of tags that may contain either
|
|
||||||
// information or new tag groups. The tag groups can be nested until you run out
|
|
||||||
// of memory. Each tag group has its own namespace of tags. Each tag has a defined
|
|
||||||
// value representation (VR), a defined value multiplicity (VM), and an optional
|
|
||||||
// default value.
|
|
||||||
//
|
|
||||||
// Tags that have the default value may be omitted, and the read code will simply
|
|
||||||
// insert the default value when the tag is read. A group must be present in order
|
|
||||||
// for the read code to enter it even if all tags inside have default values.
|
|
||||||
//
|
|
||||||
// Each group can contain multiple instances of the same tag set. These are
|
|
||||||
// separated by separator tags. You can have any number of instances in a group,
|
|
||||||
// but you must know the number of instances beforehand.
|
|
||||||
//
|
|
||||||
// When reading and writing tags, remember to ALWAYS do so with successively
|
|
||||||
// increasing tag value. Do not write tag number 3 before tag number 1.
|
|
||||||
//
|
|
||||||
// See the included defined format files for more information on how to write them.
|
|
||||||
|
|
||||||
#ifndef _tagfile_h
|
|
||||||
#define _tagfile_h
|
|
||||||
|
|
||||||
#include "lib/framework/types.h"
|
|
||||||
|
|
||||||
typedef uint8_t element_t;
|
|
||||||
|
|
||||||
/** Open definition file and data file; return true if successful. */
|
|
||||||
bool tagOpenWrite(const char *definition, const char *datafile);
|
|
||||||
|
|
||||||
/** Open definition file and data file; return true if successful. */
|
|
||||||
bool tagOpenRead(const char *definition, const char *datafile);
|
|
||||||
|
|
||||||
/** Clean up and close the tagfile system down. */
|
|
||||||
void tagClose(void);
|
|
||||||
|
|
||||||
/** Report last error, then zeroes the internal error variable. If it
|
|
||||||
* returns false, there is no error. */
|
|
||||||
bool tagGetError(void);
|
|
||||||
|
|
||||||
/** Built-in unit test. */
|
|
||||||
void tagTest(void);
|
|
||||||
|
|
||||||
/*** tagWrite ***/
|
|
||||||
|
|
||||||
/** Enter a group given by tag which contains the given number of elements. */
|
|
||||||
bool tagWriteEnter(element_t tag, uint16_t elements);
|
|
||||||
|
|
||||||
/** Leave the given group. The group is given for consistency checking only. */
|
|
||||||
bool tagWriteLeave(element_t tag);
|
|
||||||
|
|
||||||
/** Start writing a new instance of a group. */
|
|
||||||
bool tagWriteNext(void);
|
|
||||||
|
|
||||||
/* Write methods */
|
|
||||||
bool tagWrite(element_t tag, uint32_t val);
|
|
||||||
bool tagWrites(element_t tag, int32_t val);
|
|
||||||
bool tagWritef(element_t tag, float val);
|
|
||||||
bool tagWritefv(element_t tag, uint16_t count, const float *vals);
|
|
||||||
bool tagWrite8v(element_t tag, uint16_t count, const uint8_t *vals);
|
|
||||||
bool tagWrite16v(element_t tag, uint16_t count, const uint16_t *vals);
|
|
||||||
bool tagWrites32v(element_t tag, uint16_t count, const int32_t *vals);
|
|
||||||
bool tagWriteString(element_t tag, const char *string);
|
|
||||||
bool tagWriteBool(element_t tag, bool val);
|
|
||||||
|
|
||||||
/*** tagread ***/
|
|
||||||
|
|
||||||
/** Enter a group given by tag and return the number of elements in it. */
|
|
||||||
uint16_t tagReadEnter(element_t tag);
|
|
||||||
|
|
||||||
/** Leave the given group. The group is given for consistency checking only. */
|
|
||||||
void tagReadLeave(element_t tag);
|
|
||||||
|
|
||||||
/** Start reading a new instance of a group. Returns false if no more entities
|
|
||||||
* to read, which can be used for iteration, if desired. */
|
|
||||||
bool tagReadNext(void);
|
|
||||||
|
|
||||||
/* Read methods */
|
|
||||||
uint32_t tagRead(element_t tag);
|
|
||||||
int32_t tagReads(element_t tag);
|
|
||||||
bool tagReadBool(element_t tag);
|
|
||||||
float tagReadf(element_t tag);
|
|
||||||
bool tagReadfv(element_t tag, uint16_t size, float *vals);
|
|
||||||
uint8_t *tagRead8vDup(element_t tag, int *size);
|
|
||||||
bool tagRead8v(element_t tag, uint16_t size, uint8_t *vals);
|
|
||||||
bool tagRead16v(element_t tag, uint16_t size, uint16_t *vals);
|
|
||||||
bool tagReads16v(element_t tag, uint16_t size, int16_t *vals);
|
|
||||||
bool tagReads32v(element_t tag, uint16_t size, int32_t *vals);
|
|
||||||
bool tagReadString(element_t tag, uint16_t size, char *buffer);
|
|
||||||
char *tagReadStringDup(element_t tag);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -56,6 +56,7 @@ struct Vector3f
|
||||||
Vector3f() {}
|
Vector3f() {}
|
||||||
Vector3f(float x, float y, float z) : x(x), y(y), z(z) {}
|
Vector3f(float x, float y, float z) : x(x), y(y), z(z) {}
|
||||||
Vector3f(Vector3i const &v) : x(v.x), y(v.y), z(v.z) {}
|
Vector3f(Vector3i const &v) : x(v.x), y(v.y), z(v.z) {}
|
||||||
|
Vector3f(Vector3f const &v) : x(v.x), y(v.y), z(v.z) {}
|
||||||
Vector3f(Vector2f const &xy, int z) : x(xy.x), y(xy.y), z(z) {}
|
Vector3f(Vector2f const &xy, int z) : x(xy.x), y(xy.y), z(z) {}
|
||||||
|
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
|
|
@ -1317,3 +1317,45 @@ static int WZkeyToQtKey(int code)
|
||||||
|
|
||||||
return 0; // nothing found (should never happen)
|
return 0; // nothing found (should never happen)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WzConfig::setVector3f(const QString &name, const Vector3f &v)
|
||||||
|
{
|
||||||
|
QStringList l;
|
||||||
|
l.push_back(QString::number(v.x));
|
||||||
|
l.push_back(QString::number(v.y));
|
||||||
|
l.push_back(QString::number(v.z));
|
||||||
|
setValue(name, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3f WzConfig::vector3f(const QString &name)
|
||||||
|
{
|
||||||
|
Vector3f r;
|
||||||
|
ASSERT_OR_RETURN(r, contains(name), "Missing %s", name.toUtf8().constData());
|
||||||
|
QList<QVariant> v = value(name).toList();
|
||||||
|
ASSERT(v.size() == 3, "Bad list of %s", name.toUtf8().constData());
|
||||||
|
r.x = v[0].toDouble();
|
||||||
|
r.y = v[1].toDouble();
|
||||||
|
r.z = v[2].toDouble();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WzConfig::setVector3i(const QString &name, const Vector3i &v)
|
||||||
|
{
|
||||||
|
QStringList l;
|
||||||
|
l.push_back(QString::number(v.x));
|
||||||
|
l.push_back(QString::number(v.y));
|
||||||
|
l.push_back(QString::number(v.z));
|
||||||
|
setValue(name, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3i WzConfig::vector3i(const QString &name)
|
||||||
|
{
|
||||||
|
Vector3i r;
|
||||||
|
ASSERT_OR_RETURN(r, contains(name), "Missing %s", name.toUtf8().constData());
|
||||||
|
QList<QVariant> v = value(name).toList();
|
||||||
|
ASSERT(v.size() == 3, "Bad list of %s", name.toUtf8().constData());
|
||||||
|
r.x = v[0].toInt();
|
||||||
|
r.y = v[1].toInt();
|
||||||
|
r.z = v[2].toInt();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
|
@ -42,6 +42,10 @@ class WzConfig : public QSettings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WzConfig(const QString &name, QObject *parent = 0) : QSettings(QString("wz::") + name, QSettings::IniFormat, parent) {}
|
WzConfig(const QString &name, QObject *parent = 0) : QSettings(QString("wz::") + name, QSettings::IniFormat, parent) {}
|
||||||
|
Vector3f vector3f(const QString &name);
|
||||||
|
void setVector3f(const QString &name, const Vector3f &v);
|
||||||
|
Vector3i vector3i(const QString &name);
|
||||||
|
void setVector3i(const QString &name, const Vector3i &v);
|
||||||
};
|
};
|
||||||
|
|
||||||
class WzMainWindow : public QGLWidget
|
class WzMainWindow : public QGLWidget
|
||||||
|
|
159
src/effects.cpp
159
src/effects.cpp
|
@ -35,10 +35,9 @@
|
||||||
* STILL NEED TO REMOVE SOME MAGIC NUMBERS INTO #DEFINES!!! *
|
* STILL NEED TO REMOVE SOME MAGIC NUMBERS INTO #DEFINES!!! *
|
||||||
************************************************************
|
************************************************************
|
||||||
*/
|
*/
|
||||||
#include "lib/framework/frame.h"
|
#include "lib/framework/wzapp.h"
|
||||||
#include "lib/framework/frameresource.h"
|
#include "lib/framework/frameresource.h"
|
||||||
#include "lib/framework/input.h"
|
#include "lib/framework/input.h"
|
||||||
#include "lib/framework/tagfile.h"
|
|
||||||
#include "lib/framework/math_ext.h"
|
#include "lib/framework/math_ext.h"
|
||||||
|
|
||||||
#include "lib/ivis_opengl/ivisdef.h" //ivis matrix code
|
#include "lib/ivis_opengl/ivisdef.h" //ivis matrix code
|
||||||
|
@ -2537,134 +2536,98 @@ void effectResetUpdates(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const char FXData_tag_definition[] = "tagdefinitions/savegame/effects.def";
|
|
||||||
static const char FXData_file_identifier[] = "FXData";
|
|
||||||
|
|
||||||
/** This will save out the effects data */
|
/** This will save out the effects data */
|
||||||
bool writeFXData(const char* fileName)
|
bool writeFXData(const char *fileName)
|
||||||
{
|
{
|
||||||
EFFECT *it;
|
EFFECT *it;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
if (!tagOpenWrite(FXData_tag_definition, fileName))
|
WzConfig ini(fileName);
|
||||||
|
if (ini.status() != QSettings::NoError)
|
||||||
{
|
{
|
||||||
ASSERT(false, "writeFXData: error while opening file (%s)", fileName);
|
debug(LOG_ERROR, "Could not open %s", fileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
for (it = activeList.first; it != NULL; it = it->next, i++)
|
||||||
tagWriteString(0x01, FXData_file_identifier);
|
|
||||||
|
|
||||||
// Enter effects group and dump all active EFFECTs
|
|
||||||
tagWriteEnter(0x02, activeList.num);
|
|
||||||
|
|
||||||
for (it = activeList.first; it != NULL; it = it->next)
|
|
||||||
{
|
{
|
||||||
tagWrite(0x01, it->control);
|
ini.beginGroup("effect_" + QString::number(i));
|
||||||
tagWrite(0x02, it->group);
|
ini.setValue("control", it->control);
|
||||||
tagWrite(0x03, it->type);
|
ini.setValue("group", it->group);
|
||||||
tagWrite(0x04, it->frameNumber);
|
ini.setValue("type", it->type);
|
||||||
tagWrite(0x05, it->size);
|
ini.setValue("frameNumber", it->frameNumber);
|
||||||
tagWrite(0x06, it->baseScale);
|
ini.setValue("size", it->size);
|
||||||
tagWrite(0x07, it->specific);
|
ini.setValue("baseScale", it->baseScale);
|
||||||
|
ini.setValue("specific", it->specific);
|
||||||
|
ini.setVector3f("position", it->position);
|
||||||
|
ini.setVector3f("velocity", it->velocity);
|
||||||
|
ini.setVector3i("rotation", it->rotation);
|
||||||
|
ini.setVector3i("spin", it->spin);
|
||||||
|
ini.setValue("birthTime", it->birthTime);
|
||||||
|
ini.setValue("lastFrame", it->lastFrame);
|
||||||
|
ini.setValue("frameDelay", it->frameDelay);
|
||||||
|
ini.setValue("lifeSpan", it->lifeSpan);
|
||||||
|
ini.setValue("radius", it->radius);
|
||||||
|
|
||||||
tagWritefv (0x08, 3, &it->position.x);
|
const char *imd_name = resGetNamefromData("IMD", it->imd);
|
||||||
tagWritefv (0x09, 3, &it->velocity.x);
|
if (imd_name)
|
||||||
tagWrites32v (0x0A, 3, &it->rotation.x);
|
{
|
||||||
tagWrites32v (0x0B, 3, &it->spin.x);
|
ini.setValue("imd_name", imd_name);
|
||||||
|
}
|
||||||
|
|
||||||
tagWrite(0x0C, it->birthTime);
|
// Move on to reading the next effect
|
||||||
tagWrite(0x0D, it->lastFrame);
|
ini.endGroup();
|
||||||
tagWrite(0x0E, it->frameDelay);
|
|
||||||
tagWrite(0x0F, it->lifeSpan);
|
|
||||||
tagWrite(0x10, it->radius);
|
|
||||||
|
|
||||||
tagWriteString(0x11, resGetNamefromData("IMD", it->imd));
|
|
||||||
|
|
||||||
// Move on to reading the next effect group
|
|
||||||
tagWriteNext();
|
|
||||||
}
|
}
|
||||||
// Leave the effects group again...
|
|
||||||
tagWriteLeave(0x02);
|
|
||||||
|
|
||||||
// Close the file
|
|
||||||
tagClose();
|
|
||||||
|
|
||||||
// Everything is just fine!
|
// Everything is just fine!
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This will read in the effects data */
|
/** This will read in the effects data */
|
||||||
bool readFXData(const char* fileName)
|
bool readFXData(const char *fileName)
|
||||||
{
|
{
|
||||||
unsigned int count, i;
|
|
||||||
char strbuffer[25];
|
|
||||||
|
|
||||||
if (!tagOpenRead(FXData_tag_definition, fileName))
|
|
||||||
{
|
|
||||||
debug(LOG_ERROR, "readFXData: error while opening file (%s)", fileName);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read & verify the format header identifier
|
|
||||||
tagReadString(0x01, sizeof(strbuffer), strbuffer);
|
|
||||||
if (strncmp(strbuffer, FXData_file_identifier, sizeof(strbuffer)) != 0)
|
|
||||||
{
|
|
||||||
debug(LOG_ERROR, "readFXData: Weird file type found (in file %s)? Has header string: %s", fileName, strbuffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear out anything that's there already!
|
// Clear out anything that's there already!
|
||||||
initEffectsSystem();
|
initEffectsSystem();
|
||||||
|
|
||||||
// Enter effects group and load all EFFECTs
|
WzConfig ini(fileName);
|
||||||
count = tagReadEnter(0x02);
|
if (ini.status() != QSettings::NoError)
|
||||||
for(i = 0; i < count; ++i)
|
|
||||||
{
|
{
|
||||||
char imd_name[PATH_MAX];
|
debug(LOG_ERROR, "Could not open %s", fileName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QStringList list = ini.childGroups();
|
||||||
|
for (int i = 0; i < list.size(); ++i)
|
||||||
|
{
|
||||||
|
ini.beginGroup(list[i]);
|
||||||
EFFECT *curEffect = Effect_malloc();
|
EFFECT *curEffect = Effect_malloc();
|
||||||
|
|
||||||
/* Deal with out-of-memory conditions */
|
curEffect->control = ini.value("control").toInt();
|
||||||
if (curEffect == NULL) {
|
curEffect->group = (EFFECT_GROUP)ini.value("group").toInt();
|
||||||
debug(LOG_ERROR, "Out of memory");
|
curEffect->type = (EFFECT_TYPE)ini.value("type").toInt();
|
||||||
return false;
|
curEffect->frameNumber = ini.value("control").toInt();
|
||||||
}
|
curEffect->size = ini.value("control").toInt();
|
||||||
|
curEffect->baseScale = ini.value("control").toInt();
|
||||||
curEffect->control = tagRead(0x01);
|
curEffect->specific = ini.value("control").toInt();
|
||||||
curEffect->group = (EFFECT_GROUP)tagRead(0x02);
|
curEffect->position = ini.vector3f("position");
|
||||||
curEffect->type = (EFFECT_TYPE)tagRead(0x03);
|
curEffect->velocity = ini.vector3f("velocity");
|
||||||
curEffect->frameNumber = tagRead(0x04);
|
curEffect->rotation = ini.vector3i("rotation");
|
||||||
curEffect->size = tagRead(0x05);
|
curEffect->spin = ini.vector3i("spin");
|
||||||
curEffect->baseScale = tagRead(0x06);
|
curEffect->birthTime = ini.value("control").toInt();
|
||||||
curEffect->specific = tagRead(0x07);
|
curEffect->lastFrame = ini.value("control").toInt();
|
||||||
|
curEffect->frameDelay = ini.value("control").toInt();
|
||||||
tagReadfv (0x08, 3, &curEffect->position.x);
|
curEffect->lifeSpan = ini.value("control").toInt();
|
||||||
tagReadfv (0x09, 3, &curEffect->velocity.x);
|
curEffect->radius = ini.value("control").toInt();
|
||||||
tagReads32v (0x0A, 3, &curEffect->rotation.x);
|
if (ini.contains("imd_name"))
|
||||||
tagReads32v (0x0B, 3, &curEffect->spin.x);
|
|
||||||
|
|
||||||
curEffect->birthTime = tagRead(0x0C);
|
|
||||||
curEffect->lastFrame = tagRead(0x0D);
|
|
||||||
curEffect->frameDelay = tagRead(0x0E);
|
|
||||||
curEffect->lifeSpan = tagRead(0x0F);
|
|
||||||
curEffect->radius = tagRead(0x10);
|
|
||||||
tagReadString(0x11, sizeof(imd_name), imd_name);
|
|
||||||
|
|
||||||
if (imd_name[0] != '\0')
|
|
||||||
{
|
{
|
||||||
curEffect->imd = (iIMDShape*)resGetData("IMD", imd_name);
|
curEffect->imd = (iIMDShape*)resGetData("IMD", ini.value("imd_name").toString().toUtf8().constData());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
curEffect->imd = NULL;
|
curEffect->imd = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move on to reading the next effect group
|
// Move on to reading the next effect
|
||||||
tagReadNext();
|
ini.endGroup();
|
||||||
}
|
}
|
||||||
// Leave the effects group again...
|
|
||||||
tagReadLeave(0x02);
|
|
||||||
|
|
||||||
// Close the file
|
|
||||||
tagClose();
|
|
||||||
|
|
||||||
/* Hopefully everything's just fine by now */
|
/* Hopefully everything's just fine by now */
|
||||||
return true;
|
return true;
|
||||||
|
|
79
src/game.cpp
79
src/game.cpp
|
@ -17,7 +17,7 @@
|
||||||
along with Warzone 2100; if not, write to the Free Software
|
along with Warzone 2100; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
#include "lib/framework/frame.h"
|
#include "lib/framework/wzapp.h"
|
||||||
|
|
||||||
/* Standard library headers */
|
/* Standard library headers */
|
||||||
#include <physfs.h>
|
#include <physfs.h>
|
||||||
|
@ -29,7 +29,6 @@
|
||||||
#include "lib/framework/frameint.h"
|
#include "lib/framework/frameint.h"
|
||||||
#include "lib/framework/physfs_ext.h"
|
#include "lib/framework/physfs_ext.h"
|
||||||
#include "lib/framework/strres.h"
|
#include "lib/framework/strres.h"
|
||||||
#include "lib/framework/tagfile.h"
|
|
||||||
|
|
||||||
#include "lib/gamelib/gtime.h"
|
#include "lib/gamelib/gtime.h"
|
||||||
#include "lib/ivis_opengl/ivisdef.h"
|
#include "lib/ivis_opengl/ivisdef.h"
|
||||||
|
@ -2131,8 +2130,8 @@ static bool loadSaveStructLimits(char *pFileData, UDWORD filesize);
|
||||||
static bool loadSaveStructLimitsV(char *pFileData, UDWORD filesize, UDWORD numLimits);
|
static bool loadSaveStructLimitsV(char *pFileData, UDWORD filesize, UDWORD numLimits);
|
||||||
static bool writeStructLimitsFile(char *pFileName);
|
static bool writeStructLimitsFile(char *pFileName);
|
||||||
|
|
||||||
static bool readFiresupportDesignators(char *pFileName);
|
static bool readFiresupportDesignators(const char *pFileName);
|
||||||
static bool writeFiresupportDesignators(char *pFileName);
|
static bool writeFiresupportDesignators(const char *pFileName);
|
||||||
|
|
||||||
static bool writeScriptState(char *pFileName);
|
static bool writeScriptState(char *pFileName);
|
||||||
|
|
||||||
|
@ -2809,7 +2808,7 @@ bool loadGame(const char *pGameToLoad, bool keepObjects, bool freeMem, bool User
|
||||||
{
|
{
|
||||||
//load in the message list file
|
//load in the message list file
|
||||||
aFileName[fileExten] = '\0';
|
aFileName[fileExten] = '\0';
|
||||||
strcat(aFileName, "fxstate.tag");
|
strcat(aFileName, "fxstate.ini");
|
||||||
|
|
||||||
// load the fx data from the file
|
// load the fx data from the file
|
||||||
if (!readFXData(aFileName))
|
if (!readFXData(aFileName))
|
||||||
|
@ -3126,7 +3125,7 @@ bool loadGame(const char *pGameToLoad, bool keepObjects, bool freeMem, bool User
|
||||||
{
|
{
|
||||||
//load in the message list file
|
//load in the message list file
|
||||||
aFileName[fileExten] = '\0';
|
aFileName[fileExten] = '\0';
|
||||||
strcat(aFileName, "score.tag");
|
strcat(aFileName, "score.ini");
|
||||||
|
|
||||||
// Load the fx data from the chosen file
|
// Load the fx data from the chosen file
|
||||||
if (!readScoreData(aFileName))
|
if (!readScoreData(aFileName))
|
||||||
|
@ -3175,7 +3174,7 @@ bool loadGame(const char *pGameToLoad, bool keepObjects, bool freeMem, bool User
|
||||||
{
|
{
|
||||||
//load in the command list file
|
//load in the command list file
|
||||||
aFileName[fileExten] = '\0';
|
aFileName[fileExten] = '\0';
|
||||||
strcat(aFileName, "firesupport.tag");
|
strcat(aFileName, "firesupport.ini");
|
||||||
|
|
||||||
if (!readFiresupportDesignators(aFileName))
|
if (!readFiresupportDesignators(aFileName))
|
||||||
{
|
{
|
||||||
|
@ -3532,7 +3531,7 @@ bool saveGame(char *aFileName, GAME_TYPE saveType)
|
||||||
|
|
||||||
//create the message filename
|
//create the message filename
|
||||||
CurrentFileName[fileExtension] = '\0';
|
CurrentFileName[fileExtension] = '\0';
|
||||||
strcat(CurrentFileName, "fxstate.tag");
|
strcat(CurrentFileName, "fxstate.ini");
|
||||||
/*Write the data to the file*/
|
/*Write the data to the file*/
|
||||||
if (!writeFXData(CurrentFileName))
|
if (!writeFXData(CurrentFileName))
|
||||||
{
|
{
|
||||||
|
@ -3543,7 +3542,7 @@ bool saveGame(char *aFileName, GAME_TYPE saveType)
|
||||||
//added at V15 save
|
//added at V15 save
|
||||||
//create the message filename
|
//create the message filename
|
||||||
CurrentFileName[fileExtension] = '\0';
|
CurrentFileName[fileExtension] = '\0';
|
||||||
strcat(CurrentFileName, "score.tag");
|
strcat(CurrentFileName, "score.ini");
|
||||||
/*Write the data to the file*/
|
/*Write the data to the file*/
|
||||||
if (!writeScoreData(CurrentFileName))
|
if (!writeScoreData(CurrentFileName))
|
||||||
{
|
{
|
||||||
|
@ -3563,7 +3562,7 @@ bool saveGame(char *aFileName, GAME_TYPE saveType)
|
||||||
|
|
||||||
//create the message filename
|
//create the message filename
|
||||||
CurrentFileName[fileExtension] = '\0';
|
CurrentFileName[fileExtension] = '\0';
|
||||||
strcat(CurrentFileName, "firesupport.tag");
|
strcat(CurrentFileName, "firesupport.ini");
|
||||||
/*Write the data to the file*/
|
/*Write the data to the file*/
|
||||||
if (!writeFiresupportDesignators(CurrentFileName))
|
if (!writeFiresupportDesignators(CurrentFileName))
|
||||||
{
|
{
|
||||||
|
@ -9912,82 +9911,50 @@ bool writeStructLimitsFile(char *pFileName)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char FireSupport_tag_definition[] = "tagdefinitions/savegame/firesupport.def";
|
|
||||||
static const char FireSupport_file_identifier[] = "FIRESUPPORT";
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Load the current fire-support designated commanders (the one who has fire-support enabled)
|
* Load the current fire-support designated commanders (the one who has fire-support enabled)
|
||||||
*/
|
*/
|
||||||
bool readFiresupportDesignators(char *pFileName)
|
bool readFiresupportDesignators(const char *pFileName)
|
||||||
{
|
{
|
||||||
unsigned int numPlayers, player;
|
WzConfig ini(pFileName);
|
||||||
char formatIdentifier[12] = "";
|
if (ini.status() != QSettings::NoError)
|
||||||
|
|
||||||
if (!tagOpenRead(FireSupport_tag_definition, pFileName))
|
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "readFiresupportDesignators: Failed to open savegame %s", pFileName);
|
debug(LOG_ERROR, "Could not open %s", pFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
debug(LOG_MAP, "Reading tagged savegame %s with definition %s:", pFileName, FireSupport_tag_definition);
|
QStringList list = ini.childGroups();
|
||||||
|
for (int i = 0; i < list.size(); ++i)
|
||||||
tagReadString(0x01, 12, formatIdentifier);
|
|
||||||
if (strcmp(formatIdentifier, FireSupport_file_identifier) != 0)
|
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "readFiresupportDesignators: Incompatble %s, 'FIRESUPPORT' expected", pFileName);
|
uint32_t id = ini.value("Player_" + QString::number(i) + "/id", NULL_ID).toInt();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
numPlayers = tagReadEnter(0x02);
|
|
||||||
for (player = 0; player < numPlayers; player++)
|
|
||||||
{
|
|
||||||
uint32_t id = tagRead(0x01);
|
|
||||||
if (id != NULL_ID)
|
if (id != NULL_ID)
|
||||||
{
|
{
|
||||||
cmdDroidSetDesignator((DROID*)getBaseObjFromId(id));
|
cmdDroidSetDesignator((DROID*)getBaseObjFromId(id));
|
||||||
}
|
}
|
||||||
tagReadNext();
|
|
||||||
}
|
}
|
||||||
tagReadLeave(0x02);
|
|
||||||
|
|
||||||
tagClose();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Save the current fire-support designated commanders (the one who has fire-support enabled)
|
* Save the current fire-support designated commanders (the one who has fire-support enabled)
|
||||||
*/
|
*/
|
||||||
bool writeFiresupportDesignators(char *pFileName)
|
bool writeFiresupportDesignators(const char *pFileName)
|
||||||
{
|
{
|
||||||
unsigned int player;
|
int player;
|
||||||
|
|
||||||
if (!tagOpenWrite(FireSupport_tag_definition, pFileName))
|
WzConfig ini(pFileName);
|
||||||
|
if (ini.status() != QSettings::NoError)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "writeFiresupportDesignators: Failed to create savegame %s", pFileName);
|
debug(LOG_ERROR, "Could not open %s", pFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
debug(LOG_MAP, "Creating tagged savegame %s with definition %s:", pFileName, FireSupport_tag_definition);
|
|
||||||
|
|
||||||
tagWriteString(0x01, FireSupport_file_identifier);
|
|
||||||
tagWriteEnter(0x02, MAX_PLAYERS);
|
|
||||||
for (player = 0; player < MAX_PLAYERS; player++)
|
for (player = 0; player < MAX_PLAYERS; player++)
|
||||||
{
|
{
|
||||||
DROID * psDroid = cmdDroidGetDesignator(player);
|
DROID *psDroid = cmdDroidGetDesignator(player);
|
||||||
if (psDroid != NULL)
|
if (psDroid != NULL)
|
||||||
{
|
{
|
||||||
tagWrite(0x01, psDroid->id);
|
ini.setValue("Player_" + QString::number(player) + "/id", psDroid->id);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
tagWrite(0x01, NULL_ID);
|
|
||||||
}
|
|
||||||
tagWriteNext();
|
|
||||||
}
|
}
|
||||||
tagWriteLeave(0x02);
|
|
||||||
|
|
||||||
tagClose();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include "lib/framework/configfile.h"
|
#include "lib/framework/configfile.h"
|
||||||
#include "lib/framework/input.h"
|
#include "lib/framework/input.h"
|
||||||
#include "lib/framework/physfs_ext.h"
|
#include "lib/framework/physfs_ext.h"
|
||||||
#include "lib/framework/tagfile.h"
|
|
||||||
#include "lib/framework/wzapp_c.h"
|
#include "lib/framework/wzapp_c.h"
|
||||||
#include "lib/exceptionhandler/exceptionhandler.h"
|
#include "lib/exceptionhandler/exceptionhandler.h"
|
||||||
#include "lib/exceptionhandler/dumpinfo.h"
|
#include "lib/exceptionhandler/dumpinfo.h"
|
||||||
|
@ -1305,7 +1304,6 @@ int finalInitialization()
|
||||||
/* Runtime unit testing */
|
/* Runtime unit testing */
|
||||||
if (selfTest)
|
if (selfTest)
|
||||||
{
|
{
|
||||||
tagTest();
|
|
||||||
parseTest();
|
parseTest();
|
||||||
levTest();
|
levTest();
|
||||||
mapTest();
|
mapTest();
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include "lib/framework/endian_hack.h"
|
#include "lib/framework/endian_hack.h"
|
||||||
#include "lib/framework/file.h"
|
#include "lib/framework/file.h"
|
||||||
#include "lib/framework/physfs_ext.h"
|
#include "lib/framework/physfs_ext.h"
|
||||||
#include "lib/framework/tagfile.h"
|
|
||||||
#include "lib/ivis_opengl/tex.h"
|
#include "lib/ivis_opengl/tex.h"
|
||||||
#include "lib/netplay/netplay.h" // For syncDebug
|
#include "lib/netplay/netplay.h" // For syncDebug
|
||||||
|
|
||||||
|
|
|
@ -27,10 +27,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
#include "lib/framework/frame.h"
|
#include "lib/framework/wzapp.h"
|
||||||
#include "lib/framework/math_ext.h"
|
#include "lib/framework/math_ext.h"
|
||||||
#include "lib/framework/strres.h"
|
#include "lib/framework/strres.h"
|
||||||
#include "lib/framework/tagfile.h"
|
|
||||||
#include "lib/gamelib/gtime.h"
|
#include "lib/gamelib/gtime.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "scores.h"
|
#include "scores.h"
|
||||||
|
@ -556,36 +555,29 @@ void fillUpStats( void )
|
||||||
infoBars[STAT_STR_BUILT].number = missionData.strBuilt;
|
infoBars[STAT_STR_BUILT].number = missionData.strBuilt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char ScoreData_tag_definition[] = "tagdefinitions/savegame/score.def";
|
|
||||||
static const char ScoreData_file_identifier[] = "ScoreData";
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
/* This will save out the score data */
|
/* This will save out the score data */
|
||||||
bool writeScoreData(const char* fileName)
|
bool writeScoreData(const char* fileName)
|
||||||
{
|
{
|
||||||
if (!tagOpenWrite(ScoreData_tag_definition, fileName))
|
WzConfig ini(fileName);
|
||||||
|
if (ini.status() != QSettings::NoError)
|
||||||
{
|
{
|
||||||
ASSERT(false, "writeScoreData: error while opening file (%s)", fileName);
|
debug(LOG_ERROR, "Could not open %s", fileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tagWriteString(0x01, ScoreData_file_identifier);
|
|
||||||
|
|
||||||
// Dump the scores for the current player
|
// Dump the scores for the current player
|
||||||
tagWrite(0x02, missionData.unitsBuilt);
|
ini.setValue("unitsBuilt", missionData.unitsBuilt);
|
||||||
tagWrite(0x03, missionData.unitsKilled);
|
ini.setValue("unitsKilled", missionData.unitsKilled);
|
||||||
tagWrite(0x04, missionData.unitsLost);
|
ini.setValue("unitsLost", missionData.unitsLost);
|
||||||
tagWrite(0x05, missionData.strBuilt);
|
ini.setValue("strBuilt", missionData.strBuilt);
|
||||||
tagWrite(0x06, missionData.strKilled);
|
ini.setValue("strKilled", missionData.strKilled);
|
||||||
tagWrite(0x07, missionData.strLost);
|
ini.setValue("strLost", missionData.strLost);
|
||||||
tagWrite(0x08, missionData.artefactsFound);
|
ini.setValue("artefactsFound", missionData.artefactsFound);
|
||||||
tagWrite(0x09, missionData.missionStarted);
|
ini.setValue("missionStarted", missionData.missionStarted);
|
||||||
tagWrite(0x0A, missionData.shotsOnTarget);
|
ini.setValue("shotsOnTarget", missionData.shotsOnTarget);
|
||||||
tagWrite(0x0B, missionData.shotsOffTarget);
|
ini.setValue("shotsOffTarget", missionData.shotsOffTarget);
|
||||||
tagWrite(0x0C, missionData.babasMowedDown);
|
ini.setValue("babasMowedDown", missionData.babasMowedDown);
|
||||||
|
|
||||||
// Close the file
|
|
||||||
tagClose();
|
|
||||||
|
|
||||||
// Everything is just fine!
|
// Everything is just fine!
|
||||||
return true;
|
return true;
|
||||||
|
@ -595,37 +587,25 @@ bool writeScoreData(const char* fileName)
|
||||||
/* This will read in the score data */
|
/* This will read in the score data */
|
||||||
bool readScoreData(const char* fileName)
|
bool readScoreData(const char* fileName)
|
||||||
{
|
{
|
||||||
char strbuffer[25];
|
WzConfig ini(fileName);
|
||||||
|
if (ini.status() != QSettings::NoError)
|
||||||
if (!tagOpenRead(ScoreData_tag_definition, fileName))
|
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "readFXData: error while opening file (%s)", fileName);
|
debug(LOG_ERROR, "Could not open %s", fileName);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read & verify the format header identifier
|
|
||||||
tagReadString(0x01, sizeof(strbuffer), strbuffer);
|
|
||||||
if (strncmp(strbuffer, ScoreData_file_identifier, sizeof(strbuffer)) != 0)
|
|
||||||
{
|
|
||||||
debug(LOG_ERROR, "readScoreData: Weird file type found (in file %s)? Has header string: %s", fileName, strbuffer);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the score data for the current player
|
// Retrieve the score data for the current player
|
||||||
missionData.unitsBuilt = tagRead(0x02);
|
missionData.unitsBuilt = ini.value("unitsBuilt").toInt();
|
||||||
missionData.unitsKilled = tagRead(0x03);
|
missionData.unitsKilled = ini.value("unitsKilled").toInt();
|
||||||
missionData.unitsLost = tagRead(0x04);
|
missionData.unitsLost = ini.value("unitsLost").toInt();
|
||||||
missionData.strBuilt = tagRead(0x05);
|
missionData.strBuilt = ini.value("strBuilt").toInt();
|
||||||
missionData.strKilled = tagRead(0x06);
|
missionData.strKilled = ini.value("strKilled").toInt();
|
||||||
missionData.strLost = tagRead(0x07);
|
missionData.strLost = ini.value("strLost").toInt();
|
||||||
missionData.artefactsFound = tagRead(0x08);
|
missionData.artefactsFound = ini.value("artefactsFound").toInt();
|
||||||
missionData.missionStarted = tagRead(0x09);
|
missionData.missionStarted = ini.value("missionStarted").toInt();
|
||||||
missionData.shotsOnTarget = tagRead(0x0A);
|
missionData.shotsOnTarget = ini.value("shotsOnTarget").toInt();
|
||||||
missionData.shotsOffTarget = tagRead(0x0B);
|
missionData.shotsOffTarget = ini.value("shotsOffTarget").toInt();
|
||||||
missionData.babasMowedDown = tagRead(0x0C);
|
missionData.babasMowedDown = ini.value("babasMowedDown").toInt();
|
||||||
|
|
||||||
// Close the file
|
|
||||||
tagClose();
|
|
||||||
|
|
||||||
/* Hopefully everything's just fine by now */
|
/* Hopefully everything's just fine by now */
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue