view src/liblocfile.h @ 2470:d0aad04c3e61

th-libs now uses stdbool.h if possible, so we need to rename all BOOL/TRUE/FALSE to bool/true/false.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 07 Dec 2022 13:23:46 +0200
parents eba783bef2ee
children 2fd719592d89
line wrap: on
line source

/*
 * liblocfile - Location file format handling
 * Programmed by Matti 'ccr' Hämäläinen <ccr@tnsp.org>
 * (C) Copyright 2006-2022 Tecnic Software productions (TNSP)
 */
#ifndef LIBLOCFILE_H
#define LIBLOCFILE_H

#include "libutil.h"
#include <time.h>
#include <stdio.h>


/* Version string
 */
#define LOC_MAGIC           "MapUtils LOC file"
#define LOC_VERSION_MAJOR   (4)
#define LOC_VERSION_MINOR   (0)


/* LOCD_* is an enum describing the preferred orientation of the
 * location marker _label_ in relation to the marker spot.
 */
enum {
    LOCD_NONE = 0,
    LOCD_LEFT,
    LOCD_LEFTDOWN,
    LOCD_DOWN
};


/* Timestamp used in loc-files, in sscanf() format.
 */
#define LOC_TIMEFMT         "%02d.%02d.%04d"


/* These flags are used to describe the marker/location  type and label
 * related information: [LOCF_M_*] Draw marker of specified type (by default,
 * no marker is drawn). LOCF_M_CITY and LOCF_M_PCITY are special, they also
 * work as aliases to LOCF_T_CITY/PCITY and thus have similar functionality.
 *
 * [LOCF_T_*] specify the type of the location/marker. Currently the effect
 * of this settings is addition of "GUILD", "SHRINE"-type strings to labels,
 * but this information can be used in other ways too.
 */
#define LOCF_NONE           (0x00000)

// Marker types
#define LOCF_M_SCENIC1      (0x000001)   // '?' Scenic marker
#define LOCF_M_SCENIC2      (0x000002)   // '%' Shrine marker/etc
#define LOCF_M_PCITY        (0x000004)   // 'C' Player city
#define LOCF_M_CITY         (0x000008)   // 'c' Major city
#define LOCF_M_MASK         (0x00000F)

// Location types
#define LOCF_T_SHRINE       (0x000010)   // 'S' Raceshrine
#define LOCF_T_GUILD        (0x000020)   // 'G' Guild
#define LOCF_T_SS           (0x000040)   // 'P' Player guild/Secret Society
#define LOCF_T_MONSTER      (0x000080)   // 'M' Special monster
#define LOCF_T_TRAINER      (0x000100)   // 'T' Guild-related trainer
#define LOCF_T_FORT         (0x000200)   // 'F' Regional fort
#define LOCF_T_MASK         (0x00FFF0)
#define LOCF_MASK           (LOCF_M_MASK | LOCF_T_MASK)

// Extra flags
#define LOCF_INVIS          (0x010000)   // '-' Invisible marker / Don't show label
#define LOCF_CLOSED         (0x020000)   // '!' Location is CLOSED
#define LOCF_INSTANCED      (0x040000)   // 'I' Location is "instanced" for each player
#define LOCF_INVALID        (0x400000)   // Possibly invalid location
#define LOCF_NOMARKER       (0x800000)   // Location has no marker in mapdata or explicitly defined
#define LOCF_Q_MASK         (0xFF0000)


/* Misc constants
 */
#define LOC_MAX_NAMES       (64)        // Probably more than enough?
#define LOC_MARKERS         "?%C"
#define LOC_MAX_FILES       (64)


/* Creator roles
 */
#define CREATOR_ORIG        (0x00001)   // '@' Original area creator
#define CREATOR_RECODER     (0x00002)   // '!' Converter or recoder of area
#define CREATOR_MAINTAINER  (0x00004)   // '%' Maintainer
#define CREATOR_EXPANDER    (0x00008)   // '&' Expander, adding new things


/* Area name flags
 */
#define NAME_ORIG           (0x00001)   // '@' Original area name


/* Structures
 */
typedef struct
{
    int day, month, year;
} LocDateStruct;


typedef struct
{
    char *filename;
    char *continent;
    int xoffs, yoffs;
} LocFileInfo;


typedef struct
{
    char *name;
    int flags;
} LocName;


typedef struct
{
    LocFileInfo *file;   // Reference to file/continent data

    int xc, yc, ox, oy;  // Location coordinates
    int align;           // Label alignment value
    int flags;           // Flags (see LOCF_*)

    LocDateStruct added; // Date / time information
    bool valid;

    int nnames, ncreators;
    LocName names[LOC_MAX_NAMES], creators[LOC_MAX_NAMES];

    char *uri, *freeform;

    union
    {
        int v_int;
        float v_float;
    } vsort;
} LocMarker;


typedef struct
{
    int    nlocations;
    LocMarker **locations;
} MapLocations;


/* Location file parsing and data handling
 */
const char * locGetAreaNameType(const int flags, const bool type);
const char * locGetAreaCreatorRole(const int flags, const bool type);
const char * locGetTypePrefix(const int flags);
const char * locGetTypeName(const int flags);


LocMarker *locCopyLocMarker(const LocMarker *);
void   locCopyLocations(MapLocations *dst, const MapLocations *src);

bool   locAddNew(MapLocations *l, int xc, int yc, int dir, int flags,
           LocName *names, LocName *creators, LocDateStruct *added, bool valid,
           const char *uri, const char *freeform, LocFileInfo *file);

bool   locParseLocStream(FILE *fp, LocFileInfo *file, MapLocations *l, const int offX, const int offY);
void   locFreeMarkerData(LocMarker *marker);
void   locFreeMapLocations(MapLocations *loc);

int    locFindByCoords(const MapLocations *l, const int x, const int y, const bool locTrue);

void   locSetFileInfo(LocFileInfo *file, const char *filename, const char *continent);
void   locFreeFileInfo(LocFileInfo *file);


#endif