back to otclient dev, with new background!

* show otclient version in background
* disable about module (don't really need it)
* new function for formating strings like sprintf, Fw::formatString
* new nice background (taken from RPG maker XV)
* update contact information in README
* fix text rendering issues with opacity
master
Eduardo Bart 12 years ago
parent b46d4c4d5f
commit a24212d4de

@ -29,6 +29,11 @@ http://otclient.info/tracker
We encourage you to contribute to OTClient! Please check out We encourage you to contribute to OTClient! Please check out
{our website}[http://otclient.info/] for guidelines about how to proceed. Join us! {our website}[http://otclient.info/] for guidelines about how to proceed. Join us!
== Contact
You have 3 options, post at http://otclient.info/ , talk directly with us at #otclient irc.freenode.net or send
an email directly to the project leader edub4rt@gmail.com
== Authors == Authors
* edubart (project creator and leader developer) <edub4rt@gmail.com> * edubart (project creator and leader developer) <edub4rt@gmail.com>
@ -37,5 +42,5 @@ We encourage you to contribute to OTClient! Please check out
== License == License
OTClient is made available under the MIT License OTClient is made available under the MIT License, thus this means that you can do whatever you want, commercial, non-commercial, closed or open.

@ -9,7 +9,7 @@ Module
load-later: load-later:
- client_topmenu - client_topmenu
- client_background - client_background
- client_about //- client_about
- client_options - client_options
- client_terminal - client_terminal
- client_modulemanager - client_modulemanager

@ -8,6 +8,11 @@ function Background.init()
background = displayUI('background.otui') background = displayUI('background.otui')
background:lower() background:lower()
local clientVersionLabel = background:getChildById('clientVersionLabel')
clientVersionLabel:setText('OTClient ' .. g_app.getVersion() .. '\n' ..
'Built on ' .. g_app.getBuildDate())
Effects.fadeIn(clientVersionLabel, 1500)
connect(g_game, { onGameStart = Background.hide }) connect(g_game, { onGameStart = Background.hide })
connect(g_game, { onGameEnd = Background.show }) connect(g_game, { onGameEnd = Background.show })
end end

@ -1,6 +1,6 @@
Panel Panel
id: background id: background
image-source: /client_background/background.png image-source: /client_background/bg.png
image-smooth: true image-smooth: true
image-fixed-ratio: true image-fixed-ratio: true
anchors.top: topMenu.bottom anchors.top: topMenu.bottom
@ -9,3 +9,14 @@ Panel
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
margin-top: 1 margin-top: 1
focusable: false focusable: false
UILabel
background-color: #00000099
id: clientVersionLabel
anchors.right: parent.right
anchors.bottom: parent.bottom
text-offset: 4 2
height: 32
width: 120
color: #ffffff
font: verdana-11px-monochrome

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

@ -80,6 +80,7 @@ function EnterGame.init()
enterGame:getChildById('accountNameLineEdit'):focus() enterGame:getChildById('accountNameLineEdit'):focus()
-- only open entergame when app starts -- only open entergame when app starts
enterGame:hide()
if not g_app.isRunning() then if not g_app.isRunning() then
if #account > 0 and autologin then if #account > 0 and autologin then
addEvent(EnterGame.doLogin) addEvent(EnterGame.doLogin)

@ -1,13 +1,13 @@
Label < UILabel Label < UILabel
font: verdana-11px-antialised font: verdana-11px-antialised
color: #aaaaaa color: #bbbbbb
$disabled: $disabled:
color: #aaaaaa88 color: #bbbbbb88
GameLabel < UILabel GameLabel < UILabel
font: verdana-11px-antialised font: verdana-11px-antialised
color: #aaaaaa color: #bbbbbb
FrameCounter < UIFrameCounter FrameCounter < UIFrameCounter
size: 68 16 size: 68 16

@ -67,7 +67,7 @@ Application::~Application()
void Application::init(const std::vector<std::string>& args, int appFlags) void Application::init(const std::vector<std::string>& args, int appFlags)
{ {
m_appFlags = appFlags; m_appFlags = appFlags;
logInfo("Starting application..."); logInfo("Starting ", m_appName, " ", m_appVersion);
// capture exit signals // capture exit signals
signal(SIGTERM, exitSignalHandler); signal(SIGTERM, exitSignalHandler);

@ -47,7 +47,9 @@ public:
bool isRunning() { return m_running; } bool isRunning() { return m_running; }
bool isStopping() { return m_stopping; } bool isStopping() { return m_stopping; }
const std::string& getAppName() { return m_appName; } const std::string& getName() { return m_appName; }
const std::string& getVersion() { return m_appVersion; }
const std::string& getBuildDate() { return m_appBuildDate; }
protected: protected:
virtual void render(); virtual void render();
@ -55,6 +57,8 @@ protected:
virtual void inputEvent(const InputEvent& event); virtual void inputEvent(const InputEvent& event);
std::string m_appName; std::string m_appName;
std::string m_appVersion;
std::string m_appBuildDate;
int m_appFlags; int m_appFlags;
int m_pollCycleDelay; int m_pollCycleDelay;
Boolean<false> m_running; Boolean<false> m_running;

@ -64,7 +64,7 @@ void ModuleManager::discoverModulesPath()
std::string possibleModulesDirs[] = { "modules", std::string possibleModulesDirs[] = { "modules",
g_resources.getBaseDir() + "modules", g_resources.getBaseDir() + "modules",
g_resources.getBaseDir() + "../modules", g_resources.getBaseDir() + "../modules",
g_resources.getBaseDir() + "../share/" + g_app->getAppName() + "/modules", g_resources.getBaseDir() + "../share/" + g_app->getName() + "/modules",
"" }; "" };
bool found = false; bool found = false;
for(const std::string& dir : possibleModulesDirs) { for(const std::string& dir : possibleModulesDirs) {
@ -83,7 +83,7 @@ void ModuleManager::discoverModulesPath()
std::string possibleAddonsDirs[] = { "addons", std::string possibleAddonsDirs[] = { "addons",
g_resources.getBaseDir() + "addons", g_resources.getBaseDir() + "addons",
g_resources.getBaseDir() + "../addons", g_resources.getBaseDir() + "../addons",
g_resources.getBaseDir() + "../addons/" + g_app->getAppName() + "/modules", g_resources.getBaseDir() + "../addons/" + g_app->getName() + "/modules",
"" }; "" };
for(const std::string& dir : possibleAddonsDirs) { for(const std::string& dir : possibleAddonsDirs) {
// try to add module directory // try to add module directory

@ -418,6 +418,9 @@ void Application::registerLuaFunctions()
g_lua.bindClassStaticFunction("g_app", "exit", std::bind(&Application::exit, g_app)); g_lua.bindClassStaticFunction("g_app", "exit", std::bind(&Application::exit, g_app));
g_lua.bindClassStaticFunction("g_app", "isRunning", std::bind(&Application::isRunning, g_app)); g_lua.bindClassStaticFunction("g_app", "isRunning", std::bind(&Application::isRunning, g_app));
g_lua.bindClassStaticFunction("g_app", "isStopping", std::bind(&Application::isStopping, g_app)); g_lua.bindClassStaticFunction("g_app", "isStopping", std::bind(&Application::isStopping, g_app));
g_lua.bindClassStaticFunction("g_app", "getName", std::bind(&Application::getName, g_app));
g_lua.bindClassStaticFunction("g_app", "getVersion", std::bind(&Application::getVersion, g_app));
g_lua.bindClassStaticFunction("g_app", "getBuildDate", std::bind(&Application::getBuildDate, g_app));
// ConfigManager // ConfigManager
g_lua.registerStaticClass("g_configs"); g_lua.registerStaticClass("g_configs");

@ -41,7 +41,7 @@ void crashHandler(int signum, siginfo_t* info, void* secret)
char fileName[128]; char fileName[128];
time(&tnow); time(&tnow);
tm *ts = localtime(&tnow); tm *ts = localtime(&tnow);
strftime(fileName, 128, (g_app->getAppName() + "-crash_-%d-%m-%Y_%H:%M:%S.txt").c_str(), ts); strftime(fileName, 128, (g_app->getName() + "-crash_-%d-%m-%Y_%H:%M:%S.txt").c_str(), ts);
std::stringstream ss; std::stringstream ss;
ss.flags(std::ios::hex | std::ios::showbase); ss.flags(std::ios::hex | std::ios::showbase);

@ -46,7 +46,7 @@ LONG WINAPI crashHandler(EXCEPTION_POINTERS* exceptionPointers)
SYSTEMTIME systemTime; SYSTEMTIME systemTime;
GetSystemTime(&systemTime); GetSystemTime(&systemTime);
snprintf(fileName, 128, "%s_%02u-%02u-%04u_%02u-%02u-%02u.mdmp", g_app->getAppName().c_str(), snprintf(fileName, 128, "%s_%02u-%02u-%04u_%02u-%02u-%02u.mdmp", g_app->getName().c_str(),
systemTime.wDay, systemTime.wMonth, systemTime.wYear, systemTime.wDay, systemTime.wMonth, systemTime.wYear,
systemTime.wHour, systemTime.wMinute, systemTime.wSecond); systemTime.wHour, systemTime.wMinute, systemTime.wSecond);

@ -226,7 +226,7 @@ void WIN32Window::terminate()
} }
if(m_instance) { if(m_instance) {
if(!UnregisterClassA(g_app->getAppName().c_str(), m_instance)) if(!UnregisterClassA(g_app->getName().c_str(), m_instance))
logError("UnregisterClassA failed"); logError("UnregisterClassA failed");
m_instance = NULL; m_instance = NULL;
} }
@ -252,7 +252,7 @@ void WIN32Window::internalRegisterWindowClass()
wc.hCursor = m_defaultCursor; wc.hCursor = m_defaultCursor;
wc.hbrBackground = NULL; wc.hbrBackground = NULL;
wc.lpszMenuName = NULL; wc.lpszMenuName = NULL;
wc.lpszClassName = g_app->getAppName().c_str(); wc.lpszClassName = g_app->getName().c_str();
if(!RegisterClassA(&wc)) if(!RegisterClassA(&wc))
logFatal("Failed to register the window class."); logFatal("Failed to register the window class.");
@ -272,7 +272,7 @@ void WIN32Window::internalCreateWindow()
updateUnmaximizedCoords(); updateUnmaximizedCoords();
m_window = CreateWindowExA(dwExStyle, m_window = CreateWindowExA(dwExStyle,
g_app->getAppName().c_str(), g_app->getName().c_str(),
NULL, NULL,
dwStyle, dwStyle,
windowRect.left, windowRect.left,

@ -41,7 +41,7 @@ void UIFrameCounter::draw()
UIWidget::draw(); UIWidget::draw();
if(g_clock.ticksElapsed(m_lastFrameTicks) >= 1000) { if(g_clock.ticksElapsed(m_lastFrameTicks) >= 1000) {
m_fpsText = Fw::mkstr("FPS: ", m_frameCount); m_fpsText = Fw::formatString("FPS: %d", m_frameCount);
m_lastFrameTicks = g_clock.ticks(); m_lastFrameTicks = g_clock.ticks();
m_frameCount = 0; m_frameCount = 0;
} }

@ -61,9 +61,10 @@ void UIWidget::drawText(const Rect& screenCoords)
m_textFramebuffer->bind(); m_textFramebuffer->bind();
Rect virtualTextRect(0, 0, boxSize); Rect virtualTextRect(0, 0, boxSize);
virtualTextRect.translate(m_textOffset); virtualTextRect.translate(m_textOffset);
g_painter.saveAndResetState();
g_painter.setCompositionMode(Painter::CompositionMode_DestBlending); g_painter.setCompositionMode(Painter::CompositionMode_DestBlending);
m_font->renderText(m_text, virtualTextRect, m_textAlign, Fw::white); m_font->renderText(m_text, virtualTextRect, m_textAlign, Fw::white);
g_painter.resetCompositionMode(); g_painter.restoreSavedState();
m_textFramebuffer->release(); m_textFramebuffer->release();
m_textMustRecache = false; m_textMustRecache = false;

@ -113,6 +113,23 @@ void println(const T&... args) {
std::cout << std::endl; std::cout << std::endl;
} }
// useful std::string version of sprintf :)
template<typename... Args>
std::string formatString(const std::string& format, Args... args) {
int n, size = 1024;
std::string str;
while(true) {
str.resize(size);
n = snprintf(&str[0], size, format.c_str(), args...);
assert(n != -1);
if(n < size) {
str.resize(n);
return str;
}
size *= 2;
}
}
// demangle names for GNU g++ compiler // demangle names for GNU g++ compiler
inline std::string demangleName(const char* name) { inline std::string demangleName(const char* name) {
size_t len; size_t len;

@ -30,6 +30,7 @@ namespace Otc
constexpr const char* AppName = "OTClient"; constexpr const char* AppName = "OTClient";
constexpr const char* AppCompactName = "otclient"; constexpr const char* AppCompactName = "otclient";
constexpr const char* AppVersion = "0.4.0"; constexpr const char* AppVersion = "0.4.0";
constexpr const char* AppBuild = "_dev";
enum { enum {
TILE_PIXELS = 32, TILE_PIXELS = 32,

@ -26,14 +26,14 @@
#include <framework/core/resourcemanager.h> #include <framework/core/resourcemanager.h>
#include "core/map.h" #include "core/map.h"
OTClient::OTClient(const std::string& appName) : Application(appName) OTClient::OTClient() : Application(Otc::AppCompactName)
{ {
m_appVersion = Fw::formatString("%s%s", Otc::AppVersion, Otc::AppBuild);
m_appBuildDate = __DATE__;
} }
void OTClient::init(const std::vector<std::string>& args) void OTClient::init(const std::vector<std::string>& args)
{ {
logInfo(Otc::AppName, " ", Otc::AppVersion);
Application::init(args, Fw::AppEnableAll); Application::init(args, Fw::AppEnableAll);
g_modules.discoverModules(); g_modules.discoverModules();

@ -29,7 +29,7 @@
class OTClient : public Application class OTClient : public Application
{ {
public: public:
OTClient(const std::string &appName = Otc::AppCompactName); OTClient();
void init(const std::vector<std::string>& args); void init(const std::vector<std::string>& args);
void registerLuaFunctions(); void registerLuaFunctions();
}; };

Loading…
Cancel
Save