123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- // ATTRIBUTE.H
- //
- // Created on 10/03/96 JMI
- // Implemented 03/14/97 JRD
- //
- // 03/18/97 JRD Started this file to remove the Postal specific
- // interpretation of RAttribute out of the orange
- // layer to allow a second attribute grid with different
- // interpretations.
- //
- //////////////////////////////////////////////////////////////////////
- // After Postal, this class will be renamed to something more general
- // such as "RMultiGrid", since attribute data can be stored in many ways
- #ifndef ATTRIBUTE_H
- #define ATTRIBUTE_H
- #include "System.h"
- #ifdef PATHS_IN_INCLUDES
- #include "BLUE/Blue.h"
- #include "ORANGE/File/file.h"
- #else
- #include "Blue.h"
- #include "file.h"
- #endif // PATHS_IN_INCLUDES
- #define ATTRIBUTE_MAP_COOKIE 0x4d525441 //Looks like "ATRM" in the file
- #define ATTRIBUTE_CURRENT_VERSION 6
- //////////////////////////////////////////////////////////////////////
- // Here are the Postal attribute masks, grouped by word.
- //////////////////////////////////////////////////////////////////////
- //
- // NOTE: FOR SPEED REASONS, do NOT SHIFT values unless ABSOLUTELY
- // necessary. This is not needed for flags, or numeric fields when
- // only relative values are important. If a field TRULY needs to
- // have absolute values, it should be stored in the correct place in
- // the attribute mask.
- //
- // ALSO: AVOID using fields which need both OFFSETS and SCALING!
- // (To create a signed field, just subtract half)
- //
- // NOTE: MACROS for VALUES are for comparison ONLY - they cannot be
- // used for ANDing and ORing
- //
- //////////////////////////////////////////////////////////////////////
- // Postal Attribute Map ONE:
- //////////////////////////////////////////////////////////////////////
- // BITS 0-7, signed numeric field
- #define ATTRIBUTE_HEIGHT_MASK 0x00FF // Mask of height bits.
- // BITS 8-11, unsigned numeric field
- #define ATTRIBUTE_LAYER_MASK 0x0F00 // Mask of layer cue
- // BIT 12, flag
- #define ATTRIBUTE_CLIFF 0x1000 // cliff attribute
- // BIT 13, flag
- #define ATTRIBUTE_NOT_WALKABLE 0x2000 // Flag for no-walk areas.
- // BIT 14, flag
- #define ATTRIBUTE_LIGHT_EFFECT 0x4000 // Flag for light
- //////////////////////////////////////////////////////////////////////
- // Postal Attribute Map TWO:
- //////////////////////////////////////////////////////////////////////
- // BITS 0-10 OPENED FOR ALL POSTAL DUDES!
- // That's 2048 possibilities opened up for the postal crew!
- // BITS 11-12, unsigned numeric field
- #define ATTRIBUTE_RESERVED1_MASK 0x1800 // I reserve two for later
- // BITS 13-14, unsigned numberic field
- #define ATTRIBUTE_FLUID_MASK 0x6000 // Mask of fluids
- #define ATTRIBUTE_BLOOD_VALUE 0x2000 // Value of BLOOD
- #define ATTRIBUTE_OIL_VALUE 0x4000 // Value of GASOLINE
- #define ATTRIBUTE_WATER_VALUE 0x6000 // Value of WATER
- //////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////
- // The goal was to make getting the field of an attribute have ZERO
- // cost to the user. One change is that since BIT15 is removed
- // from the attribute on decompression, all values deal with
- // SIGNED shorts. The meaning is uneffected, but it provides greater
- // compatibility and options with comparing external values.
- //////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////
- // Here are Postal specific interpretations of fields:
- // Add as many as you like, but consolidate them here.
- // All will be considered DYNAMIC -> changeable like the wind!
- //////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////
- // Somewhat general macros
- //////////////////////////////////////////////////////////////////////
- // interpret a flag as 1 or zero
- inline short GetFlag(short sMaskedValue)
- {
- // faster than : ? assembly.
- if (sMaskedValue) return 1;
- return 0;
- }
- // interpret a field as a signed range:
- inline short GetField(short sMaskedValue,short sLowValue)
- {
- return sMaskedValue + sLowValue;
- }
- // interpret a field as a signed, scaled range:
- // FIRST scale it, THEN offset it!
- // DO NOT shift left more than 2 bits!
- //
- inline short GetFieldMul(short sMaskedValue,short sLowValue,short sMulBits)
- {
- return (sMaskedValue<<sMulBits) + sLowValue;
- }
- // interpret a field as a signed, scaled range:
- // FIRST scale it, THEN offset it!
- // DO NOT shift right more than 8 bits!
- //
- inline short GetFieldDiv(short sMaskedValue,short sLowValue,short sDivBits)
- {
- return (sMaskedValue>>sDivBits) + sLowValue;
- }
- //////////////////////////////////////////////////////////////////////
- // very specific macros (try to design attribute position to optimize!)
- //////////////////////////////////////////////////////////////////////
- // As always, these are PRE-MASKED fields!
- // range is -512 to +511 from 8 bits
- //
- inline short GetHeight(short sMaskedValue)
- {
- return GetFieldMul(sMaskedValue,-512,2);
- }
- // range is 0 to 15
- //
- inline short GetLayer(short sMaskedValue))
- {
- return (sMaskedValue >> 8);
- }
- //-------//-----//
- #endif // EOF //
- //-------//-----//
|