/* $Id: Observer.h,v 1.7 1996/10/12 08:38:18 swetland Exp $
**
** Observer header file
**
** Copyright 1996, Brian J. Swetland <swetland@uiuc.edu> and ACM@UIUC.
** Free for non-commercial use.  Share and Enjoy!
*/

#ifndef _Observer_H
#define _Observer_H

#include "Auth.h"
#include "Map.h"

#include "Events.h"
#include "GameObject.h"
#include "Socket.h"
#include "Message.h"

struct StarGlyph
{
    struct StarGlyph *next;

    Word x,y;
    Word id, owner;
    Glyph *flag,*noflag;
    
    Marker *marker;
    Text *number;
};

struct ShipGlyph
{
    struct ShipGlyph *next;

    int pennum;
    
    Word id;
    Marker *marker;
    Line *vector;

    StarGlyph *star, *oldstar;

    Text *text,*text2;
    char *str,*str2;
    
    Word owner, dist, eta, power, engines, shields, weapons, transport;
    Word flags;
};

#define sc 24

#define CCOUNT 6

int penlist[CCOUNT] = {
    PEN_MAGENTA,
    PEN_YELLOW,
    PEN_CYAN,
    PEN_GREENX,
    PEN_BLUE,
    PEN_GREEN2,
};

class Observer : public MessageHandler
{
    Map *map;
    int map_w, map_h, text_x0, nextline, linestep;
    int dirty_status,dirty_map;

    struct star 
    {
        int x,y;
        int c;
        lCnxn *list;
    } stars[MAXSTARS+1];

    char statline[64];
    Text *status;
    
    Glyph *shipG[CCOUNT], *shipG2[CCOUNT];
    Glyph *systemG[CCOUNT], *system2G[CCOUNT];
    Glyph *systemGX, *system2GX;
    Word shipN[CCOUNT];
    int shipP[CCOUNT];
    
    StarGlyph *first_star;
    ShipGlyph *first_ship;
    
    MessageSocket *connection;
    EventLoop *el;

    Word myid;

    void DoShip(Word shipid, Word owner, Word star, Word eta,
                Word power, Word engines, Word shields, Word weapons,
                Word transport, Word flags);
    void DoStar(Word id, Word flags,
                Word x, Word y, Word c, lCnxn *list);
    void DoHit(Word shipid, Word enemyid, Word what);
    void DoTurn(Word year);
    void DoFlags(Word starid, Word flags);

    void DrawMap(void);

public:
    Observer(MessageSocket *ms);
    void Receive(int src, int dst, Message *msg);
    void Run(void);
};

#endif /* _Observer_H */


