X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FCapsuleNameMenu.cpp;h=58db75e89b9fddd81173e5c8f0df30907b0c25c8;hb=9666839d0ca6c794d28226a007870c82ef4ddb20;hp=14acd461fa2e491b8ec86686bb5c26b960d1a668;hpb=60e0fe29ce6cd033edc78b181d9d07fa72c11172;p=l2e.git diff --git a/src/menu/CapsuleNameMenu.cpp b/src/menu/CapsuleNameMenu.cpp index 14acd46..58db75e 100644 --- a/src/menu/CapsuleNameMenu.cpp +++ b/src/menu/CapsuleNameMenu.cpp @@ -25,9 +25,16 @@ namespace menu { CapsuleNameMenu::CapsuleNameMenu(CapsuleMenu *parent) : parent(parent) -, cursor(5) { +, select(*parent->Res().capsuleNameCharSelectTemplate) +, cursor(5) +, first(true) { + bzero(buffer, 6); std::strncpy(buffer, GetCapsule().Name(), 6); - buffer[5] = '\0'; + for (int i = 4; i > 0; --i) { + if (buffer[i] == '\0') { + buffer[i] = '_'; + } + } } @@ -54,11 +61,74 @@ void CapsuleNameMenu::OnResize(int width, int height) { void CapsuleNameMenu::HandleEvents(const Input &input) { - if (input.JustPressed(Input::START)) { + if (input.JustPressed(Input::PAD_UP)) { + select.PreviousRow(); + } + if (input.JustPressed(Input::PAD_RIGHT)) { + select.NextCol(); + } + if (input.JustPressed(Input::PAD_DOWN)) { + select.NextRow(); + } + if (input.JustPressed(Input::PAD_LEFT)) { + select.PreviousCol(); + } + + if (input.JustPressed(Input::ACTION_A)) { + AddChar(); + } + if (input.JustPressed(Input::ACTION_B)) { + RemoveChar(); + } + + if (input.JustPressed(Input::START) && cursor > 0) { + StoreName(); Ctrl().PopState(); } } +void CapsuleNameMenu::AddChar() { + if (first) { + cursor = 1; + buffer[0] = select.Selected(); + for (int i = 1; i < 5; ++i) { + buffer[i] = '_'; + } + first = false; + } else { + if (cursor < 5) { + buffer[cursor] = select.Selected(); + ++cursor; + } else { + // noise + } + } +} + +void CapsuleNameMenu::RemoveChar() { + first = false; + if (cursor > 0) { + --cursor; + buffer[cursor] = '_'; + } +} + +void CapsuleNameMenu::StoreName() { + // NOTE: this will leak the memory allocated for the new name + char *name = 0; + for (int i = 0; i < 6; ++i) { + if (buffer[i] == '_' || buffer[i] == '\0') { + buffer[i] = '\0'; + name = new char[i + 1]; + std::strncpy(name, buffer, i + 1); + break; + } + } + if (name != 0) { + GetCapsule().SetName(name); + } +} + void CapsuleNameMenu::UpdateWorld(float deltaT) { } @@ -94,8 +164,10 @@ void CapsuleNameMenu::RenderName(SDL_Surface *screen, const Vector &offset) void CapsuleNameMenu::RenderAlphabet(SDL_Surface *screen, const Vector &offset) const { const Font &font(*parent->Res().normalFont); const Frame &frame(*parent->Res().statusFrame); + const Vector selectOffset(2 * font.CharWidth(), 2 * font.CharHeight()); frame.Draw(screen, offset, 24 * font.CharWidth(), 17 * font.CharHeight()); + select.Draw(screen, offset + selectOffset); } @@ -107,6 +179,10 @@ int CapsuleNameMenu::Height() const { return parent->Height(); } +Capsule &CapsuleNameMenu::GetCapsule() { + return parent->GetCapsule(); +} + const Capsule &CapsuleNameMenu::GetCapsule() const { return parent->GetCapsule(); }