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 onMouseMotion; - sigc::signal onMouseDown; - sigc::signal onMouseUp; + sigc::signal onMouseMotion; + sigc::signal onMouseDown; + sigc::signal onMouseUp; sigc::signal onKeyDown; sigc::signal 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 onMouseMotion; - extern sigc::signal onMouseDown; - extern sigc::signal onMouseUp; + extern sigc::signal onMouseMotion; + extern sigc::signal onMouseDown; + extern sigc::signal onMouseUp; extern sigc::signal onKeyDown; extern sigc::signal 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 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(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(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(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_castAdd(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(); + +} /**********************************************************/