From c088fd5064c706837e1c3812b8b323ab2b5fe1a4 Mon Sep 17 00:00:00 2001
From: Rtch90 <ritchie.cunningham@protonmail.com>
Date: Tue, 21 Aug 2018 20:34:34 +0100
Subject: [PATCH] [Add] More scrolling work and laying some additional
 groundwork for GUI.

---
 src/gui.cpp                | 80 ++++++++++++++++++++++++++++++++++----
 src/gui.h                  | 13 +++++--
 src/gui_button.cpp         | 46 ++++++----------------
 src/gui_button.h           |  2 +-
 src/gui_fixed.cpp          |  3 +-
 src/gui_screen.cpp         | 12 +++++-
 src/gui_toggle_button.cpp  | 43 +++-----------------
 src/gui_vscroll_bar.cpp    | 25 ++----------
 src/gui_vscroll_bar.h      |  4 +-
 src/gui_vscroll_portal.cpp | 21 ++++++++++
 src/gui_vscroll_portal.h   |  4 ++
 src/ship_type.cpp          | 35 ++++++++++++++---
 src/ship_type.h            |  6 ++-
 src/space_station.cpp      | 14 +++++++
 src/space_station.h        |  3 ++
 src/space_station_view.cpp | 69 ++++++++++++++++++++++++++------
 16 files changed, 250 insertions(+), 130 deletions(-)

diff --git a/src/gui.cpp b/src/gui.cpp
index 8631e6d..95fbbfe 100644
--- a/src/gui.cpp
+++ b/src/gui.cpp
@@ -3,9 +3,9 @@
 
 namespace Gui {
 namespace RawEvents {
-  sigc::signal<void, SDL_MouseMotionEvent*> onMouseMotion;
-  sigc::signal<void, SDL_MouseButtonEvent*> onMouseDown;
-  sigc::signal<void, SDL_MouseButtonEvent*> onMouseUp;
+  sigc::signal<void, MouseMotionEvent*> onMouseMotion;
+  sigc::signal<void, MouseButtonEvent*> onMouseDown;
+  sigc::signal<void, MouseButtonEvent*> onMouseUp;
   sigc::signal<void, SDL_KeyboardEvent*>    onKeyDown;
   sigc::signal<void, SDL_KeyboardEvent*>    onKeyUp;
 }
@@ -19,22 +19,18 @@ void HandleSDLEvent(SDL_Event* event) {
   switch(event->type) {
   case SDL_MOUSEBUTTONDOWN:
     Screen::OnClick(&event->button);
-    RawEvents::onMouseDown.emit(&event->button);
     break;
   case SDL_MOUSEBUTTONUP:
     Screen::OnClick(&event->button);
-    RawEvents::onMouseUp.emit(&event->button);
     break;
   case SDL_KEYDOWN:
     Screen::OnKeyDown(&event->key.keysym);
-    RawEvents::onKeyDown.emit(&event->key);
     break;
   case SDL_KEYUP:
     RawEvents::onKeyUp.emit(&event->key);
     break;
   case SDL_MOUSEMOTION:
     Screen::OnMouseMotion(&event->motion);
-    RawEvents::onMouseMotion.emit(&event->motion);
     break;
   }
 }
@@ -86,5 +82,75 @@ void Init(int screen_width, int screen_height, int ui_width, int ui_height) {
   Screen::Init(screen_width, screen_height, ui_width, ui_height);
 }
 
+namespace Theme {
+  static const float BORDER_WIDTH = 2.0;
+
+  void DrawHollowRect(const float size[2]) {
+    GLfloat vertices[] = { 0,0,
+      0, size[1],
+      size[0], size[1],
+      size[0], 0,
+      BORDER_WIDTH, BORDER_WIDTH,
+      BORDER_WIDTH, size[1]-BORDER_WIDTH,
+      size[0]-BORDER_WIDTH, size[1]-BORDER_WIDTH,
+      size[0]-BORDER_WIDTH, BORDER_WIDTH };
+    GLubyte indices[] = {
+      0,1,5,4, 0,4,7,3,
+      3,7,6,2, 1,2,6,5 };
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glVertexPointer(w, GL_FLOAT, 0, vertices);
+    glDrawElements(GL_QUADS, 16, GL_UNSIGNED_BYTE, indices);
+    glDisableClientState(GL_VERTEX_ARRAY);
+  }
+
+  void DrawIndent(const float size[2]) {
+    GLfloat vertices[] = { 0,0,
+      0, size[1],
+      size[0], size[1],
+      size[0], 0,
+      BORDER_WIDTH, BORDER_WIDTH,
+      BORDER_WIDTH, size[1]-BORDER_WIDTH,
+      size[0]-BORDER_WIDTH, size[1]-BORDER_WIDTH,
+      size[0]-BORDER_WIDTH, BORDER_WIDTH };
+    GLubyte indices[] = {
+      0,1,5,4, 0,4,7,3,
+      3,7,6,2, 1,2,6,5,
+      4,5,6,7 };
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glVertexPointer(2, GL_FLOAT, 0, vertices);
+    glColor3fv(Color::bgShadow);
+    glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices);
+    glColor3f(.6, .6, .6);
+    glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices+8);
+    glColor3fv(Color::bg);
+    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, indices+16);
+    glDisableClientState(GL_VERTEX_ARRAY);
+  }
+
+  void DrawOutdent(const float size[2]) {
+    GLfloat vertices[] = {0,0,
+      0, size[1],
+      size[0], size[1],
+      size[0], 0,
+      BORDER_WIDTH, BORDER_WIDTH,
+      BORDER_WIDTH, size[1]-BORDER_WIDTH,
+      size[0] - BORDER_WIDTH, size[1] - BORDER_WIDTH,
+      size[0] - BORDER_WIDTH, BORDER_WIDTH };
+    GLubyte indices = {
+      0,1,5,4, 0,4,7,3,
+      3,7,6,2, 1,2,6,5,
+      4,5,6,7 };
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glVertexPointer(2, GL_FLOAT, 0, vertices);
+    glColor3f(.6, .6, .6);
+    glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices);
+    glColor3fv(Color::bgShadow);
+    glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices+8);
+    glColor3fv(Color::bg);
+    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, indices+16);
+    glDisableClientState(GL_VERTEX_ARRAY);
+  }
+}
+
 }
 
diff --git a/src/gui.h b/src/gui.h
index 86a6551..7150cc7 100644
--- a/src/gui.h
+++ b/src/gui.h
@@ -2,6 +2,13 @@
 #include "libs.h"
 
  namespace Gui {
+
+  namespace Theme {
+    void DrawIndent(const float size[2]);
+    void DrawOutdent(const float size[2]);
+    void DrawHollowRect(const float size[2]);
+  }
+
   namespace Color {
     extern const float bg[];
     extern const float bgShadow[];
@@ -18,9 +25,9 @@
 
 namespace Gui {
   namespace RawEvents {
-    extern sigc::signal<void, SDL_MouseMotionEvent*>  onMouseMotion;
-    extern sigc::signal<void, SDL_MouseButtonEvent*>  onMouseDown;
-    extern sigc::signal<void, SDL_MouseButtonEvent*>  onMouseUp;
+    extern sigc::signal<void, MouseMotionEvent*>  onMouseMotion;
+    extern sigc::signal<void, MouseButtonEvent*>  onMouseDown;
+    extern sigc::signal<void, MouseButtonEvent*>  onMouseUp;
     extern sigc::signal<void, SDL_KeyboardEvent*>     onKeyDown;
     extern sigc::signal<void, SDL_KeyboardEvent*>     onKeyUp;
   }
diff --git a/src/gui_button.cpp b/src/gui_button.cpp
index f2d7e5c..0dacbf5 100644
--- a/src/gui_button.cpp
+++ b/src/gui_button.cpp
@@ -45,7 +45,7 @@ void Button::OnRawKeyUp(SDL_KeyboardEvent* e) {
   }
 }
 
-void Button::OnRawMouseUp(SDL_MouseButtonEvent* e) {
+void Button::OnRawMouseUp(MouseButtonEvent* e) {
   if(e->button == 1) {
     m_isPressed = false;
     _m_release.disconnect();
@@ -62,43 +62,19 @@ void TransparentButton::GetSizeRequested(float size[2]) {
 }
 
 void SolidButton::Draw(void) {
-  glBegin(GL_QUADS);
-    glColor3f(.6, .6, .6);
-    glVertex2f(0, 15);
-    glVertex2f(15, 15);
-    glVertex2f(15, 0);
-    glVertex2f(0, 0);
-
-    glColor3fv(Color::bgShadow);
-    glVertex2f(2, 15);
-    glVertex2f(15, 15);
-    glVertex2f(15, 2);
-    glVertex2f(2, 2);
-
-    glColor3fv(Color::bg);
-    glVertex2f(2, 13);
-    glVertex2f(13, 13);
-    glVertex2f(13, 2);
-    glVertex2f(2, 2);
-  glEnd();
+  float size[2];
+  GetSize(size);
+  if(IsPressed()) {
+    Theme::DrawIndent(size);
+  } else {
+    Theme::DrawOutdent(size);
+  }
 }
 
 void TransparentButton::Draw(void) {
-  glColor3f(1, 1, 1);
-  glBegin(GL_LINE_LOOP);
-    glVertex2f(0, 0);
-    glVertex2f(15, 0);
-    glVertex2f(15, 15);
-    glVertex2f(0, 15);
-  glEnd();
-
-  glBegin(GL_LINE_LOOP);
-    glVertex2f(1, 1);
-    glVertex2f(14, 1);
-    glVertex2f(14, 14);
-    glVertex2f(1, 14);
-  glEnd();
-}
+  float size[2];
+  GetSize(size);
 
+  Theme::DrawHollowRect(size);
 }
 
diff --git a/src/gui_button.h b/src/gui_button.h
index b85ebca..470dd18 100644
--- a/src/gui_button.h
+++ b/src/gui_button.h
@@ -20,7 +20,7 @@ namespace Gui {
     sigc::signal<void> onClick;
     bool IsPressed(void) { return m_isPressed; }
   private:
-    void OnRawMouseUp(SDL_MouseButtonEvent* e);
+    void OnRawMouseUp(MouseButtonEvent* e);
     void OnRawKeyUp(SDL_KeyboardEvent* e);
 
     bool m_isPressed;
diff --git a/src/gui_fixed.cpp b/src/gui_fixed.cpp
index e08cac0..3f2e4a4 100644
--- a/src/gui_fixed.cpp
+++ b/src/gui_fixed.cpp
@@ -12,7 +12,8 @@ Fixed::Fixed(float w, float h): Container() {
 }
 
 void Fixed::GetSizeRequested(float size[2]) {
-  GetSize(size);
+  size[0] = m_w;
+  size[1] = m_h;
 }
 
 Fixed::~Fixed(void) {
diff --git a/src/gui_screen.cpp b/src/gui_screen.cpp
index 1bec217..66775ca 100644
--- a/src/gui_screen.cpp
+++ b/src/gui_screen.cpp
@@ -97,6 +97,9 @@ void Screen::OnMouseMotion(SDL_MouseMotionEvent* e) {
   ev.screenX = ev.x = x;
   ev.screenY = ev.y = y;
   baseContainer->OnMouseMotion(&ev);
+  ev.screenX = ev.x = x;
+  ev.screenY = ev.y = y;
+  RawEvents::onMouseMotion.emit(&ev);
 }
 
 void Screen::OnClick(SDL_MouseButtonEvent* e) {
@@ -108,8 +111,13 @@ void Screen::OnClick(SDL_MouseButtonEvent* e) {
   ev.screenX = ev.x = x;
   ev.screenY = ev.y = y;
   OnClickTestLabels(ev);
-  if(ev.isdown) baseContainer->OnMouseDown(&ev);
-  else baseContainer->OnMouseUp(&ev);
+  if(ev.isdown) {
+    baseContainer->OnMouseDown(&ev);
+    RawEvents::OnMouseDown.emit(&ev);
+  } else {
+    baseContainer->OnMouseUp(&ev);
+    RawEvents::onMouseUp.emit(&ev);
+  }
 }
 
 void Screen::OnClickTestLabels(const Gui::MouseButtonEvent& ev) {
diff --git a/src/gui_toggle_button.cpp b/src/gui_toggle_button.cpp
index 1d908d9..c432c4b 100644
--- a/src/gui_toggle_button.cpp
+++ b/src/gui_toggle_button.cpp
@@ -38,46 +38,13 @@ void ToggleButton::GetSizeRequested(float size[2]) {
 }
 
 void ToggleButton::Draw(void) {
+  float size[2];
+  GetSize(size);
+
   if(m_pressed) {
-    glBegin(GL_QUADS);
-      glColor3f(.6, .6, .6);
-      glVertex2f(0, 15);
-      glVertex2f(15, 15);
-      glVertex2f(15, 0);
-      glVertex2f(0, 0);
-
-      glColor3fv(Color::bgShadow);
-      glVertex2f(0, 13);
-      glVertex2f(13, 13);
-      glVertex2f(13, 0);
-      glVertex2f(0, 0);
-
-      glColor3fv(Color::bg);
-      glVertex2f(2, 13);
-      glVertex2f(13, 13);
-      glVertex2f(13, 2);
-      glVertex2f(2, 2);
-    glEnd();
+    Theme::DrawIndent(size);
   } else {
-    glBegin(GL_QUADS);
-      glColor3f(.6, .6, .6);
-      glVertex2f(0, 15);
-      glVertex2f(15, 15);
-      glVertex2f(15, 0);
-      glVertex2f(0, 0);
-
-      glColor3fv(Color::bgShadow);
-      glVertex2f(2, 15);
-      glVertex2f(15, 15);
-      glVertex2f(15, 2);
-      glVertex2f(2, 2);
-
-      glColor3fv(Color::bg);
-      glVertex2f(2, 13);
-      glVertex2f(13, 13);
-      glVertex2f(13, 2);
-      glVertex2f(2, 2);
-    glEnd();
+    Theme::DrawOutdent(size);
   }
 }
 
diff --git a/src/gui_vscroll_bar.cpp b/src/gui_vscroll_bar.cpp
index de76927..ae23f5b 100644
--- a/src/gui_vscroll_bar.cpp
+++ b/src/gui_vscroll_bar.cpp
@@ -24,7 +24,7 @@ bool VScrollBar::OnMouseDown(MouseButtonEvent* e) {
   return false;
 }
 
-void VScrollBar::OnRawMouseUp(SDL_MouseButtonEvent* e) {
+void VScrollBar::OnRawMouseUp(MouseButtonEvent* e) {
   if(e->button == 1) {
     m_isPressed = false;
     _m_released.disconnect();
@@ -32,7 +32,7 @@ void VScrollBar::OnRawMouseUp(SDL_MouseButtonEvent* e) {
   }
 }
 
-void VScrollBar::OnRawMouseMotion(SDL_MouseMotionEvent* e) {
+void VScrollBar::OnRawMouseMotion(MouseMotionEvent* e) {
   if(m_isPressed) {
     float pos[2];
     GetAbsolutePosition(pos);
@@ -44,27 +44,8 @@ void VScrollBar::OnRawMouseMotion(SDL_MouseMotionEvent* e) {
 
 void VScrollBar::Draw(void) {
   float size[2]; GetSize(size);
-  glColor3f(1,1,0);
-  glBegin(GL_QUADS);
-    glColor3f(.6, .6, .6);
-    glVertex2f(0, size[1]);
-    glVertex2f(size[0], size[1]);
-    glVertex2f(size[0], 0);
-    glVertex2f(0, 0);
-
-    glColor3fv(Color::bgShadow);
-    glVertex2f(0, size[1]-BORDER);
-    glVertex2f(size[0]-BORDER, size[1]-BORDER);
-    glVertex2f(size[0]-BORDER, 0);
-    glVertex2f(0, 0);
-
-    glColor3fv(Color::bg);
-    glVertex2f(BORDER, size[1]-BORDER);
-    glVertex2f(size[0]-BORDER, size[1]-BORDER);
-    glVertex2f(size[0]-BORDER, BORDER);
-    glVertex2f(BORDER, BORDER);
-  glEnd();
 
+  Theme::DrawIndent(size);
   float pos = m_adjustment->GetValue();
   glColor3f(1, 1, 1);
   glBegin(GL_LINES);
diff --git a/src/gui_vscroll_bar.h b/src/gui_vscroll_bar.h
index 0611a5c..5d9491b 100644
--- a/src/gui_vscroll_bar.h
+++ b/src/gui_vscroll_bar.h
@@ -16,8 +16,8 @@ public:
   }
 
 private:
-  void OnRawMouseUp(SDL_MousebuttonEvent* e);
-  void OnRawMOuseMotion(SDL_MouseMotionEvent* e);
+  void OnRawMouseUp(MouseButtonEvent* e);
+  void OnRawMOuseMotion(MouseMotionEvent* e);
   bool m_isPressed;
   sigc::connection m_release, _m_motion;
   Adjustment* m_sdjustment;
diff --git a/src/gui_vscroll_portal.cpp b/src/gui_vscroll_portal.cpp
index 85aa5bd..cc0c5d7 100644
--- a/src/gui_vscroll_portal.cpp
+++ b/src/gui_vscroll_portal.cpp
@@ -38,6 +38,27 @@ void VScrollPortal::Remove(Widget* child) {
   m_childSizeY = 0;
 }
 
+float VScrollPortal::GetScrollPixels(void) {
+  float size[2];
+  GetSize(size);
+  return m_scrollY * (m_childSizeY-size[1]);
+}
+
+bool VScrollPortal::OnMouseDown(MouseButtonEvent* e) {
+  e->y += GetScrollPixels();
+  return Container::OnMouseDown(e);
+}
+
+bool VScrollPortal::OnMouseUp(MouseButtonEvent* e) {
+  e->y += GetScollPixels();
+  return Container::OnMouseUp(e);
+}
+
+bool VScrollPortal::OnMouseMotion(MouseMotionEvent* e) {
+  e->y += GetSCrollPixels();
+  return Container::OnMouseMotion(e);
+}
+
 void VSrollPortal::Draw(void) {
   float size[2];
   GetSize(size);
diff --git a/src/gui_vscroll_portal.h b/src/gui_vscroll_portal.h
index 0dd48fd..d234905 100644
--- a/src/gui_vscroll_portal.h
+++ b/src/gui_vscroll_portal.h
@@ -7,6 +7,9 @@ public:
   VScrollPortal(float w, float h);
   void Add(Widget* child);
   void Remove(Widget* child);
+  virtual bool OnMouseDown(MouseButtonEvent* e);
+  virtual bool OnMouseUp(MouseButtonEvent* e);
+  virtual bool OnMouseMotion(MouseMotionEvent* e);
   virtual void Draw(void);
   virtual void GetSizeRequested(float size[2]);
   virtual void OnChildResizeRequest(Widget*);
@@ -14,6 +17,7 @@ public:
   void SetBgColor(float r, float g, float b);
   Adjustment vscrollAdjust;
 private:
+  float GetScrollPixels();
   void OnScroll(float);
   float m_scrollY, m_childSizeY;
   Widget* m_cild;
diff --git a/src/ship_type.cpp b/src/ship_type.cpp
index 275f8d9..8405768 100644
--- a/src/ship_type.cpp
+++ b/src/ship_type.cpp
@@ -55,27 +55,52 @@ const EquipType EquipType::types[] = {
   {
     "Interplanetary Drive",
     Equip::SLOT_ENGINE,
-    1, 0
+    4000, 1, 0
   },
   {
     "Class 1 Hyperdrive",
     Equip::SLOT_ENGINE,
-    4, 1
+    7000, 4, 1
+  },
+  {
+    "Class 2 Hyperdrive",
+    Equip::SLOT_ENGINE,
+    13000, 10, 2
+  },
+  {
+    "Class 3 Hyperdrive",
+    Equip::SLOT_ENGINE,
+    25000, 20, 3
+  },
+  {
+    "Class 4 Hyperdrive",
+    Equip::SLOT_ENGINE,
+    50000, 40, 4
+  },
+  {
+    "Class 5 Hyperdrive",
+    Equip::SLOT_ENGINE,
+    100000, 120, 4
+  },
+  {
+    "Class 6 Hyperdrive",
+    Equip::SLOT_ENGINE,
+    200000, 225, 4
   },
   {
     "1MW beam laser",
     Equip::SLOT_LASER,
-    1, 1
+    6000, 1, 1
   },
   {
     "2MW beam laser",
     Equip::SLOT_LASER,
-    1, 2
+    10000, 1, 2
   },
   {
     "4MW beam laser",
     Equip::SLOT_LASER,
-    1, 4
+    22000, 1, 4
   }
 };
 
diff --git a/src/ship_type.h b/src/ship_type.h
index afc6100..3c6d591 100644
--- a/src/ship_type.h
+++ b/src/ship_type.h
@@ -5,8 +5,9 @@
 
 namespace Equip {
   enum Slot { SLOT_ENGINE, SLOT_LASER, SLOT_MISSILE, SLOT_MAX };
-  enum Type { NONE, DRIVE_INTERPLANETARY, DRIVE_CLASS1,
-              LASER_1MW_BEAM, LASER_2MW_BEAM, LASER_4MW_BEAM };
+  enum Type { NONE, DRIVE_INTERPLANETARY, DRIVE_CLASS1, DRIVE_CLASS2,
+              DRIVE_CLASS3, DRIVE_CLASS4, DRIVE_CLASS5, DRIVE_CLASS6,
+              LASER_1MW_BEAM, LASER_2MW_BEAM, LASER_4MW_BEAM, TYPE_MAX };
 };
 
 struct ShipType {
@@ -58,6 +59,7 @@ private:
 struct EquipType {
   const char* name;
   Equip::Slot slot;
+  int         basePrice;
   int         mass;
   int         pval; /* Used for general 'power' attribute.. */
   static const EquipType types[];
diff --git a/src/space_station.cpp b/src/space_station.cpp
index d071f97..3126cd2 100644
--- a/src/space_station.cpp
+++ b/src/space_station.cpp
@@ -4,6 +4,7 @@
 #include "gameconsts.h"
 #include "star_system.h"
 #include "serializer.h"
+#include "l3d.h"
 
 struct SpaceStationType {
   Uint32 sbreModel;
@@ -19,6 +20,9 @@ void SpaceStation::Save(void) {
   using namespace Serializer::Write;
   ModelBody::Save();
   wr_int((int)m_type);
+  for(int i = 0; i < Equip::TYPE_MAX; i++) {
+    wr_int((int)m_equipmentStock[i]);
+  }
 }
 
 void SpaceStation::Load(void) {
@@ -26,6 +30,9 @@ void SpaceStation::Load(void) {
   ModelBody::Load();
   m_type = (TYPE)rd_int();
   m_numPorts = 0;
+  for(int i = 0; i < Equip::TYPE_MAX; i++) {
+    m_equipmentStock[i] = static_cast<Equip::Type>(rd_int());
+  }
   Init();
 }
 
@@ -88,6 +95,9 @@ void SpaceStation::GetDockingSurface(CollMeshSet* mset, int midx) {
 SpaceStation::SpaceStation(TYPE type) : ModelBody() {
   m_type = type;
   m_numPorts = 0;
+  for(int i = 1; i < Equip::TYPE_MAX; i++) {
+    m_equipmentStock[i] = L3D::rng.Int32(0, 100);
+  }
   Init();
 }
 
@@ -176,6 +186,10 @@ bool SpaceStation::GetDockingClearance(Ship* s) {
   return true;
 }
 
+int SpaceStation::GetEquipmentPrice(Equip::Type t) const {
+  return EquipType::types[t].basePrice;
+}
+
 bool SpaceStation::OnCollision(Body* b, Uint32 flags) {
   if(flags & 0x10) {
     dockingport_t* dport = &port[flags & 0xf];
diff --git a/src/space_station.h b/src/space_station.h
index 0747ba0..bd309d5 100644
--- a/src/space_station.h
+++ b/src/space_station.h
@@ -26,6 +26,8 @@ public:
     vector3d normal;
     vector3d horiz;
   } port[MAX_DOCKING_PORTS];
+  int GetEquipmentStock(Equip::TYPE t) const { return m_equipmentStock[t]; }
+  int GetEquipmentPrice(Equip::Type t) const;
 
 protected:
   virtual void Save(void);
@@ -35,5 +37,6 @@ private:
   void Init(void);
   TYPE m_type;
   int m_numPorts;
+  int m_equipmentStock[Equip::TYPE_MAX];
 };
 
diff --git a/src/space_station_view.cpp b/src/space_station_view.cpp
index b82f3dd..b6e81e8 100644
--- a/src/space_station_view.cpp
+++ b/src/space_station_view.cpp
@@ -31,13 +31,6 @@ private:
 StationFrontView::StationFrontView(SpaceStationView* parent): StationSubView(parent) {
   SetTransparency(false);
 
-  Gui::Fixed* fbox = new Gui::Fixed(720, 150);
-  Add(fbox, 40, 100);
-
-  Gui::VScrollBar* scroll = new Gui::VScrollBar();
-  Gui::VScrollPortal* box = new Gui::VScrollPortal(400, 150);
-  scroll->SetAdjustment(&box->vscollAdjust);
-
   Gui::Label* l = new Gui::Label("Hello friend! Thankyou for docking with this space station! "
     "You may have noticed that the docking procedure was not entirely "
     "physically correct. this is a result of unimplemented physics in this "
@@ -49,10 +42,9 @@ StationFrontView::StationFrontView(SpaceStationView* parent): StationSubView(par
     "         ADOPT A CAT: THEY CHEW IMPORTANT CABLES!");
 
 
-  fbox->Add(box, 0, 0);
-  fbox->Add(scroll, 405, 0);
-  box->Add(l);
-  box->ShowAll();
+  Gui::Fixed* fbox = new Gui::Fixed(720, 400);
+  fbox->Add(l, 0, 0);
+  Add(fbox, 40, 100);
   fbox->ShowAll();
 
   Gui::SolidButton* b = new Gui::SolidButton();
@@ -73,12 +65,65 @@ class StationShipyardView: public StationSubView {
 public:
   StationShipyardView(SpaceStationView* parent);
 private:
-  
+  virtual void ShowAll(void);  
 };
 
 StationShipyardView::StationShipyardView(SpaceStationView* parent): StationSubView(parent) {
   SetTransparency(false);
 }
+
+void StationShipyardView::ShowAll(void) {
+  DeleteAllChildren();
+
+  SpaceStation* station = L3D::player->GetDockedWith();
+  assert(station);
+  SetTransparency(false);
+
+  Gui::Fixed* fbox = new Gui::Fixed(500, 200);
+  Add(fbox, 300, 100);
+
+  Gui::VScrollBar* scroll = new Gui::VScrollBar();
+  Gui::VScrollPortal* portal = new Gui::VScrollPortal(450, 200);
+  scroll->SetAdjustment(&portal->vscollAdjust);
+  //int GetEquipmentStock(Equip::Type t) cosnt { return m_equipmentStock[t]; }
+
+  int NUM_ITEMS = 0;
+  const float YSEP = Gui::Screen::GetFontHeight() * 1.5;
+  for(int i = 1; i < Equip::TYPE_MAX; i++) {
+    if(station->GetEquipmentStock(static_cast<Equip::Type>(i))) NUM_ITEMS++;
+  }
+
+  Gui::Fixed* innerbox = new Gui::Fixed(400, NUM_ITEMS*YSEP);
+  for(int i = 1, num = 0; i < Equip::TYPE_MAX; i++) {
+    int stock = station->GetEquipmentStock(static_cast<Equip::Type>(i));
+    if(!stock) continue;
+    Gui::Label* l = new Gui::Label(EquipType::types[i].name);
+    innerbox->Add(l, 0, num*YSEP);
+    innerbox->Add(new Gui::SolidButton(), 275, num*YSEP);
+    innerbox->Add(new Gui::SolidButton(), 300, num*YSEP);
+    char buf[128];
+    snprintf(buf, sizeof(buf), "$%d", station->GetEquipmentPrice(static_cast<Equip::Type(i)));
+    innerbox->Add(new Gui::Label(buf), 200, num*YSEP);
+    snprintf(buf, sizeof(buf), sizeof(buf), "%dt", EquipType::types[i].mass);
+    innerbox->Add(new Gui::Label(buf), 370, num*YSEP);
+    num++;
+  }
+  innerbox->ShowAll();
+
+  fbox->Add(new Gui::Label("Item"),     0, 0);
+  fbox->Add(new Gui::Label("Price"),  200, 0);
+  fbox->Add(new Gui::Label("Fit"),    275, 0);
+  fbox->Add(new Gui::Label("Remove"), 300, 0);
+  fbox->Add(new Gui::Label("Wt"),     370, 0);
+  fbox->Add(new Gui::Label("Portal"),   0, YSEP);
+  fbox->Add(new Gui::Label("Scroll"), 455, YSEP);
+  portal->Add(innerbox);
+  portal->ShowAll();
+  fbox->ShowAll();
+
+  Gui::Fixed::ShowAll();
+
+}
 /**********************************************************/