
/** main.c ************************************/
/*                                            */
/* Copyright © 1988 by Digital Artists (DgA). */
/* All Rights reserved.                       */
/*                                            */
/**********************************************/

/*
Firma   : Digital Artists (DgA)
Objekt  : reederei/main.c
Version : 1.0
Autor   : [RK]
Datum   : 09-18-1988
Status  : geheim
*/

#include <exec/types.h>
#include <exec/memory.h>

#include <graphics/gfx.h>
#include <graphics/rastport.h>
#include <graphics/view.h>
#include <graphics/text.h>

#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/diskfont.h>

#include "reederei.h"

extern struct Library *OpenLibrary();
extern struct Screen *OpenScreen();
extern struct Window *OpenWindow();
extern struct TextFont *OpenDiskFont();
extern struct IntuiMessage *GetMsg();
extern float rnd();

struct Library *GfxBase,*DiskfontBase,*DosBase;
struct IntuitionBase *IntuitionBase;
struct Screen *Screen;
struct Window *Window;
struct NewWindow rwindow;
struct RastPort *rp;
struct BitMap bm[2],bkpbm[2];
struct IntuiMessage *msg;

UBYTE Waren[6][7] =
 {"Weizen","Kaffee","Kakao","Erdöl","Tee","Reis"};

USHORT Warenpreis[6] =
 {174,620,417,2152,809,278};

UBYTE CompFirms[5][16] =
 {"Worldline","Transocean","Wölkilinie","White Star","Stahlbau AG"};

struct Schiff schiffstyp[6] =
 {
  {(UBYTE *)"Tankschiff",4000,10000,0,0,32,NULL,0,0,0},
  {(UBYTE *)"Frachtschiff",4000,6000,0,0,10,NULL,0,0,0},
  {(UBYTE *)"Passagierschiff",0,0,300,800,51,NULL,0,0,0},
  {(UBYTE *)"Frachtdampfer",1000,3000,0,0,9,NULL,0,0,0},
  {(UBYTE *)"Kombi-Schiff",6000,9000,200,400,27,NULL,0,0,0},
  {(UBYTE *)"Großes Frachtschiff",7000,10000,0,0,14,NULL,0,0,0}
 };

struct Hafen Hafen[14] =
 {
  {(UBYTE *)"New York",19200,1,154,6},
  {(UBYTE *)"Houston",18000,4,2732,4},
  {(UBYTE *)"Honduras",5300,2,580,1},
  {(UBYTE *)"Caracas",14400,4,2712,3},
  {(UBYTE *)"Rio de J.",22800,2,590,4},
  {(UBYTE *)"Accra",5600,3,477,1},
  {(UBYTE *)"Kapstadt",18000,1,174,3},
  {(UBYTE *)"Mombasa",12400,5,802,2},
  {(UBYTE *)"Bahrein",6700,4,2752,1},
  {(UBYTE *)"Bombay",19800,5,809,3},
  {(UBYTE *)"Kalkutta",19200,5,813,3},
  {(UBYTE *)"Perth",23400,1,169,3},
  {(UBYTE *)"Hong Kong",20500,6,277,3},
  {(UBYTE *)"Peking",22000,6,268,3}
 };

char iffname [3][19] =
 {"reederei:pic/1.pic","reederei:pic/2.pic","reederei:pic/3.pic"};

struct TextFont *tfont,*nfont;

struct TextAttr font[2] =
 {
  {(UBYTE *)"garnet.font",9,FS_NORMAL,FPF_DISKFONT},
  {(UBYTE *)"topaz.font",TOPAZ_SIXTY,FS_NORMAL,FPF_ROMFONT}
 };

struct IntuiText Anzeige[8] =
 {
  {1,0,JAM1,0,0,&font[0],"Reeder",&Anzeige[1]},
  {1,0,JAM1,70,0,&font[0],NULL,&Anzeige[2]},
  {1,0,JAM1,0,0,&font[0],"(",&Anzeige[3]},
  {1,0,JAM1,0,0,&font[0],NULL,&Anzeige[4]},
  {1,0,JAM1,0,0,&font[0],")",&Anzeige[5]},
  {1,0,JAM1,500,0,&font[0],"1.",&Anzeige[6]},
  {1,0,JAM1,0,0,&font[0],"Quartal",&Anzeige[7]},
  {1,0,JAM1,0,0,&font[0],"1988",NULL}
 };

USHORT black[16] =
 {0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000};

USHORT cmap[2][16];

struct Spieler Spieler[4] =
 {
  {"Digital Artists","Digital Artists",0,0,NULL,NULL,NULL,NULL},
  {"Digital Artists","Digital Artists",0,0,NULL,NULL,NULL,NULL},
  {"Digital Artists","Digital Artists",0,0,NULL,NULL,NULL,NULL},
  {"Digital Artists","Digital Artists",0,0,NULL,NULL,NULL,NULL}
 };

struct Quartal Quartal[8];

int Aktienzahl[5] =
 {1000000,1000000,1000000,1000000,1000000};

int w,n;
int quartal = 1;
int jahr = 1987;
int players;
int level;

main()
 {
  int i,j,pl;
  float f;
  int x,y;
  USHORT Kab,Lad,GPr;
  SHORT Alt;
  BOOL next;
  LONG stahlbau;
  int Vorhersage[6];
  int experte[4];
  int Wahr,ZuAb;
  float Ware;

  OpenAll();
  initrnd();

  SetAPen(rp,1);
  SetBPen(rp,13);
  SetDrMd(rp,JAM1);

  players = GetNumber();

  for (i=0;i<players;i++)
   {
    strcpy(Spieler[i].Name,GetInput(0,i));
    strcpy(Spieler[i].Firma,GetInput(1,i));
    Spieler[i].Geld = 8000;
    Spieler[i].Schiffsanzahl = 1;
    Spieler[i].Schiffsdaten[0] = schiffstyp[5];
    Spieler[i].Schiffsdaten[0].Ladung = 10000;
    Spieler[i].Aktien[i] = 100000;
    Aktienzahl[i] -= 100000;
    experte[i] = -1;
    if ((strcmp(Spieler[i].Name,"Softbär") == 0) && (strcmp(Spieler[i].Firma,"Phönix GmbH") == 0))
     {
      Spieler[i].Geld = 50000;
      Spieler[i].Schiffsdaten[1] = schiffstyp[0];
      Spieler[i].Schiffsdaten[1].Ladung = 10000;
      Spieler[i].Schiffsanzahl++;
     }
   }

  for (i=players;i<4;i++)
   {
    strcpy(Spieler[i].Name,"Computer");
    strcpy(Spieler[i].Firma,&CompFirms[i][0]);
    Spieler[i].Geld = 8000;
   }

  level = GetLevel();

  for (i=0;i<4;i++)
   {
    Quartal[i+4].Quartal = (((((i+1)%4)+1)*100)+(86+(USHORT)i/3));
    for (j=0;j<6;j++)
     Quartal[i+4].WarenWMPreis[j] = (USHORT)(((1+(.7 * rnd()))*Warenpreis[j])*((USHORT)i/3));
    for (j=0;j<4;j++)
     Quartal[i+4].Aktienwert[j] = 50 * ((USHORT)i/3);
    Quartal[i+4].Aktienwert[4] = 180 * ((USHORT)i/3);
   }

  for (i=0;i<14;i++)
   {
    x = 18000/Quartal[7].WarenWMPreis[Hafen[i].Ware-1];
    if (x > 70)
     x = 70;
    Hafen[i].WarenKaufPreis = ((96-((float)rnd()*(x/3)) -2 * (x/3))/100) * Quartal[7].WarenWMPreis[Hafen[i].Ware-1];
   }

  for (;;)
   {
    stahlbau = 0;
    for (i=0;i<6;i++)
     Vorhersage[i] = 0;

    for (pl=0;pl<players;pl++)
     {
      MainMenuDisplay(pl);
      next = FALSE;

      if ((jahr == 1987) && (quartal == 1))
       PrintEvent(pl,1,0,0);
      else
       {
        Expend(pl);
        Income(pl);
       }

      for(i=0;i<Spieler[pl].Schiffsanzahl;i++)
       {
        Spieler[pl].Schiffsdaten[i].Alter += 3;
        if ((Spieler[pl].Schiffsdaten[i].Alter > -1) && (Spieler[pl].Schiffsdaten[i].Alter < 3))
         {
          GPr = Spieler[pl].Schiffsdaten[i].Grundpreis;
          Lad = Spieler[pl].Schiffsdaten[i].Ladung;
          Kab = Spieler[pl].Schiffsdaten[i].Kabinen;
          f = (float)((GPr+.025*Kab+.0015*Lad)*8)/10;
          Spieler[pl].Geld -= (LONG)f*1000;
          stahlbau += f/1000;
          PrintEvent(pl,2,i,f);
         }
       }

      if (experte[pl] != -1)
       {
        experte[pl]++;
        if (((int)((float)rnd()*100)) <= 30)
         {
          Ware = (float) rnd()*6;
          Wahr = (int)((float)rnd()*100);

          if (Wahr <= (100-((level-1)*25)))
           Wahr = 1;
          else
           Wahr = -1;

          if (Vorhersage[(int)Ware] == 0)
           {
            ZuAb = (int) (rnd()*100);
            if (ZuAb <= 50)
             ZuAb = -1;
            else
             ZuAb = 1;
            Vorhersage[(int)Ware] = Wahr * ZuAb;
           }
          else
           ZuAb = Wahr * Vorhersage[(int)Ware];

          PrintEvent(pl,4,ZuAb,Ware);

          experte[pl] = -1;
         }
        if (experte[pl] == 4)
         experte[pl] = -1;
       }
      else
       experte[pl]++;

      if (Spieler[pl].Geld < (Quartal[7].Aktienwert[pl]/1000) * -.1)
       PrintEvent(pl,3,0,0);

      while (!(next))
       {
        while((msg=GetMsg(Window->UserPort))==NULL);
        ReplyMsg(msg);
        if ((msg->Class == MOUSEBUTTONS) && (msg->Code == SELECTDOWN))
         {
          x = msg->MouseX;
          y = msg->MouseY;
           
          if ((x >= 39) && (x <= 148) && (y >= 24) && (y <= 86))
           {
            Routen(pl);
            MainMenuDisplay(pl);
           }
          if ((x >= 183) && (x <= 293) && (y >= 24) && (y <= 86))
           {
            Aktien(pl);
            msg = GetMsg(Window->UserPort);
            if (msg != NULL)
             ReplyMsg(msg);
           }
          if ((x >= 331) && (x <= 441) && (y >= 24) && (y <= 86) && (Spieler[pl].Geld > 0))
           {
            BuyShip(pl);
            MainMenuDisplay(pl);
           }
          if ((x >= 481) && (x <= 593) && (y >= 24) && (y <= 86))
           {
            Achse(pl);
            msg = GetMsg(Window->UserPort);
            if (msg != NULL)
             ReplyMsg(msg);
           }
          if ((x >= 37) && (x <= 147) && (y >= 111) && (y <= 173))
           {
            Market(pl);
            msg = GetMsg(Window->UserPort);
            if (msg != NULL)
             ReplyMsg(msg);
           }
          if ((x >= 183) && (x <= 293) && (y >= 111) && (y <= 173))
           {
            Diagramm(pl);
            msg = GetMsg(Window->UserPort);
            if (msg != NULL)
             ReplyMsg(msg);
           }
          if ((x >= 331) && (x <= 441) && (y >= 111) && (y <= 173))
           {
            Auktion(pl);
            msg = GetMsg(Window->UserPort);
            if (msg != NULL)
             ReplyMsg(msg);
           }
          if ((x >= 483) && (x <= 592) && (y >= 111) && (y <= 173))
           next = TRUE;
         }
       }
     }
    if (++quartal == 5)
     {
      quartal = 1;
      jahr++;
     }
    for(i=0;i<7;i++)
     Quartal[i] = Quartal[i+1];
    for(i=0;i<6;i++)
     Quartal[7].WarenWMPreis[i] = (ULONG)(((21 * rnd())+90+(Vorhersage[i]*20))*Quartal[6].WarenWMPreis[i]/100);
    for(i=0;i<4;i++)
     {
      if (i < players)
       {
        Quartal[7].Aktienwert[i] = 10000+Spieler[i].Geld;
        for(j=0;j<5;j++)
         Quartal[7].Aktienwert[i] += (ULONG)(Quartal[6].Aktienwert[j] * Spieler[i].Aktien[j])/1000;
        for(j=0;j<6;j++)
         Quartal[7].Aktienwert[i] += (ULONG)(Quartal[7].WarenWMPreis[j] * Spieler[i].WarenBesitz[j])/1000;
        Quartal[7].Aktienwert[i] /= 1000;
        for(j=0;j<Spieler[i].Schiffsanzahl;j++)
         {
          GPr = Spieler[i].Schiffsdaten[j].Grundpreis;
          Lad = Spieler[i].Schiffsdaten[j].Ladung/1000;
          Kab = Spieler[i].Schiffsdaten[j].Kabinen/10;
          Alt = Spieler[i].Schiffsdaten[j].Alter;
          if (Alt >= 0)
           Quartal[7].Aktienwert[i] += (ULONG)((GPr+.025*Kab+1.5*Lad)*(90-Alt/6)/100);
         }
        if ((Quartal[7].Aktienwert[i] < 0) || (Quartal[7].Aktienwert[i] > 10000))
         Quartal[7].Aktienwert[i] = 0;
       }
      else
       {
        Quartal[7].Aktienwert[i] += (LONG)((float)rnd()*(level*5+11))-(level*2+4);
        if (Quartal[7].Aktienwert[i] < 20)
         Quartal[7].Aktienwert[i] = 20;
       }
      if (Quartal[7].Aktienwert[i] >= 250)
       ende(i);
     }
    for (i=0;i<14;i++)
     {
      x = 18000/Quartal[7].WarenWMPreis[Hafen[i].Ware-1];
      if (x > 70)
       x = 70;
      Hafen[i].WarenKaufPreis = ((96-((float)rnd()*(x/3)) -2 * (x/3))/100) * Quartal[7].WarenWMPreis[Hafen[i].Ware-1];
     }
    Quartal[7].Aktienwert[4] += (ULONG)(rnd()*60)-30+stahlbau;
    Quartal[7].Quartal = ((quartal * 100) + ((USHORT)(jahr-((USHORT)(jahr/100)*100))));
   }
 }

OpenAll()
 {
  struct NewScreen rscreen;
  int i,j;
  BOOL result;

  if ((IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0L)) == NULL)
   {
    printf("Error : Can't open 'intuition.library'.\n");
    exit(FALSE);
   }

  if ((GfxBase = OpenLibrary("graphics.library",0L)) == NULL)
   {
    printf("Error : Can't open 'graphics.library'.\n");
    exit(FALSE);
   }

  if ((DiskfontBase = OpenLibrary("diskfont.library",0L)) == NULL)
   {
    printf("Error : Can't open 'diskfont.library'.\n");
    exit(FALSE);
   }

  if ((DosBase = OpenLibrary("dos.library",0L)) == NULL)
   {
    printf("Error : Can't open 'dos.library'.\n");
    exit(FALSE);
   }

  rscreen.LeftEdge     = 0;
  rscreen.TopEdge      = 0;
  rscreen.Width        = 640;
  rscreen.Height       = 200;
  rscreen.Depth        = 4;
  rscreen.DetailPen    = 0;
  rscreen.BlockPen     = 1;
  rscreen.ViewModes    = HIRES|SPRITES;
  rscreen.Type         = CUSTOMSCREEN;
  rscreen.Font         = NULL;
  rscreen.DefaultTitle = (UBYTE *)"Reederei Version 1.0  AMIGA Version by [RK].";
  rscreen.Gadgets      = NULL;
  rscreen.CustomBitMap = NULL;

  Screen = OpenScreen(&rscreen);
  if (Screen == NULL)
   exit(FALSE);
  LoadRGB4(&Screen->ViewPort,&black[0],16);
  rp = &Screen->RastPort;
  ShowTitle(Screen,FALSE);

  CloseWindow(IntuitionBase->ActiveWindow);
  result = CloseWorkBench();

  if ((tfont = OpenDiskFont(&font[0])) == NULL)
   exit(FALSE);

  if ((nfont = OpenFont(&font[1])) == NULL)
   exit(FALSE);

  SetFont(rp,nfont);

  for (j=0;j<2;j++)
   {
    InitBitMap(&bm[j],4,640,200);
    for (i=0;i<4;i++)
     {
      bm[j].Planes[i] = (PLANEPTR)AllocRaster(640,200);
      if (bm[j].Planes[i] == NULL)
       exit(FALSE);
     }
   }

  for (j=0;j<2;j++)
   {
    InitBitMap(&bkpbm[j],4,640,13);
    for (i=0;i<4;i++)
     {
      bkpbm[j].Planes[i] = (PLANEPTR)AllocRaster(640,13);
      if (bkpbm[j].Planes[i] == NULL)
       exit(FALSE);
     }
   }

  for (i=0;i<2;i++)
   {
    result = iff(&iffname[i][0],&bm[i],&cmap[i][0]);
    if (result == FALSE)
     exit(FALSE);
   }

  rwindow.LeftEdge    = 0;
  rwindow.TopEdge     = 0;
  rwindow.Width       = 640;
  rwindow.Height      = 200;
  rwindow.DetailPen   = 0;
  rwindow.BlockPen    = 1;
  rwindow.IDCMPFlags  = MOUSEBUTTONS|GADGETDOWN|GADGETUP|/*ACTIVEWINDOW|*/REQSET|REQCLEAR;
  rwindow.Flags       = SUPER_BITMAP|BORDERLESS|/*ACTIVATE|*/RMBTRAP;
  rwindow.FirstGadget = NULL;
  rwindow.CheckMark   = NULL;
  rwindow.Title       = NULL;
  rwindow.Screen      = Screen;
  rwindow.BitMap      = &bm[0];
  rwindow.MinWidth    = 0;
  rwindow.MinHeight   = 0;
  rwindow.MaxWidth    = 0;
  rwindow.MaxHeight   = 0;
  rwindow.Type        = CUSTOMSCREEN;

  Window = OpenWindow(&rwindow);
  if (Window == NULL)
   {
    printf("Error : Can't open Window.\n");
    exit(FALSE);
   }
  w = 1;
  n = 2;

  LoadRGB4(&Screen->ViewPort,&cmap[0][0],16);
  BltBitMap(Window->RPort->BitMap,0,0,&bkpbm[0],0,0,640,13,0x0c0,0xff,NULL);
  BltBitMap(&bm[1],0,0,&bkpbm[1],0,0,640,13,0x0c0,0xff,NULL);

  return;
 }

MainMenuDisplay(i)
int i;
 {
  GetPicture(1);
  PrintPlayersName(i,0);

  return;
 }

PrintPlayersName(i,mode)
int i;
int mode;
 {
  if (mode == 0)
   BltBitMap(&bkpbm[0],0,0,Window->RPort->BitMap,0,0,640,13,0x0c0,0xff,NULL);
  else
   BltBitMap(&bkpbm[1],0,0,Window->RPort->BitMap,0,0,640,13,0x0c0,0xff,NULL);

  Anzeige[1].IText = Spieler[i].Name;
  Anzeige[3].IText = Spieler[i].Firma;
  sprintf(Anzeige[5].IText,"%1d.",quartal);
  sprintf(Anzeige[7].IText,"%4d",jahr);
  Anzeige[2].LeftEdge = 80+IntuiTextLength(&Anzeige[1]);
  Anzeige[3].LeftEdge = 90+IntuiTextLength(&Anzeige[1]);
  Anzeige[4].LeftEdge = 90+IntuiTextLength(&Anzeige[1])+IntuiTextLength(&Anzeige[3]);
  Anzeige[6].LeftEdge = 510+IntuiTextLength(&Anzeige[5]);
  Anzeige[7].LeftEdge = 580+IntuiTextLength(&Anzeige[5]);
  PrintIText(rp,&Anzeige[0],7,2);

  return;
 }

GetPicture(num)
int num;
 {
  if (num != w)
   {
    LoadRGB4(&Screen->ViewPort,&black[0],16);
    CloseWindow(Window);

    if (num == 1)
     {
      rwindow.BitMap = &bm[0];
      Window = OpenWindow(&rwindow);
      LoadRGB4(&Screen->ViewPort,&cmap[0][0],16);
     }
    else if (num == n)
     {
      rwindow.BitMap = &bm[1];
      Window = OpenWindow(&rwindow);
      LoadRGB4(&Screen->ViewPort,&cmap[1][0],16);
     }
    else
     {
      iff(&iffname[num-1][0],&bm[1],&cmap[1][0]);
      rwindow.BitMap = &bm[1];
      BltBitMap(&bm[1],0,0,&bkpbm[1],0,0,640,13,0x0c0,0xff,NULL);
      Window = OpenWindow(&rwindow);
      LoadRGB4(&Screen->ViewPort,&cmap[1][0],16);
      n = num;
     }
    w = num;
   }
  return;
 }
