Alright... This is more like a reminder to myself, and also so what you see what could come soon. You can comment of course, but please be useful ^_^ Other programmers are free to steal some of my tasks if it's not in the "Things to do soon" part. Things to do soon - Work on 5th gen Things to do sooner or later - Update the French Translation Things to do eventually - Gens one and two - Redo the GUI as in Sgt. Padawan's thread - Curse and Encore in doubles - target selection - Fix the PPs of Mimic / then switching back / Bug (even though it doesn't have a competitive effect) - Redo the selection of pokemon in the Teambuilder Ideas for the future - Add battle replays - Give servers compatibility for IRC clients (only chatting of course) - Add plugins clientside for stylesheets and music Recent adds [secret]- Give an option to servers, to trade bandwith for lag. This is done by disabling Nagle's algorithm (see wikipedia), which buffers data until a response from the other is received. - Icon size reduced - Third generation - Tiers in a tree - Allow battlers to set the default tier of a team in the teambuilder - Add themes [/secret] Nitpicks - Ban thing - ladder thing - Spite's message in 3G - Raichu's VoltTackle + Egg move - Damage in doubles in 3G - Load team window open causing troubles - make it non modal - When forced into idle, the option in the menu bar isn't updated - 3G moves with 4G abilities for under evos Nitpicks fixed [secret] - sys.createChannel -> join it -> sys.kick everyone form the chan -> try to close it twice = crash - Toxic's failing message thing - Give 255 happiness to pokémons when they have return, when importing - Sprites when changing gen in 3G - Insomnia's failing message - Self-KO clause - Avoid generating move lists when checking a moveset everytime [/secret] I'll try to keep it a bit up-to-date.
i sent you the 22x22 icons already, i saved them on the internet and ot in my PC, so i can't zip it and send you. :\
Please look at http://pokemon-online.eu/forums/sho...cumentation-quot&p=17803&viewfull=1#post17803 when you have time. I seem to have problems with my health again (~_~)
You fixed that team builder bug with locked slots? Cool (^. ^) I wanted to do it once, but forgot… (^ ^)'
What is used to make PO installer for Windows? It seems weird that there are so many errors about it. Maybe we should publish md5 checksums for it? And update it when new versions are out of course.
Latest version? Hmm, let's try md5 way if you can (^ ^) How can Windows users check md5 sums I wonder…
I dunno what changed in makefiles but I demand release branch that can be compiled. Code (text): /usr/bin/ld: cannot find -lutilities collect2: ld returned 1 exit status
Should be fixed as soon as coyotte merges the makefile changes in my branch to the release branch. My theory as to why things broke is at the time coyotte508 merged origin/nixeagle into origin/release and origin/master I had a broken makefile in my branch. Vie discussions on PO we know the makefile in origin/nixeagle works. :)
What do you think, would that be possible to extend sys.stopEvent() with an optional parameter 'reason'? Like, sys.stopEvent("Reason text here."). And then use that message in some events like before login, so that client get the message printed? Or… somehow make it possible to do a sys.send* functions to work when you call sys.stopEvent() in before login event.
it's just the socket system that closes the connection too early, nothing to do with scripts. With boost sockets it happens a lot less.
Oh… I'll look when Boost sockets will be stable for us then. If not… maybe some string can be send with the event itself. Assuming it is stored somewhere. We'll see then. Thanks (^. ^)
Even if the problem with boost sockets remain, the solution is not in scripts. It's in handling qt sockets a different way, as in waiting for the disconnect signal before deleting it (and put a maximum time of like 5 seconds) but any change to that has to be done with utmost care.
Actually the crash appeared to probably not be related to boost sockets. And the general problem is that when sockets are closed, i delete them instead of waiting for some signals so all connections are interrupted and they don't get the last message sent to them sometimes (which may be kicking message or message saying server is full). This doesn't happen with boost sockets for which you can set a "linger time".
Did you try qsocket.waitForDisconnected(); ? (Just a side node?!) When using SFML, lowTCPDelay could be guilty... If you really need linger: there is no api method in Qt, but you can do it yourself low-level. See http://www.qtcentre.org/threads/3037-qt-network-performance?p=16565#post16565 (Disable the Nagle (TCP No Delay) algorithm) and Code (text): struct linger l; l.l_onoff = 1; l.l_linger = 30; setsockopt(sockID, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
Hm? I've been looking the new posts, but? I missed something? Sorry again, Coyo, Mystra... School is killing me off Q_Q Fuu exams, exams and more exams.
Schedule? I don't think we have one :D Just post when you are ready. I'll make it now. EDIT: http://pokemon-online.eu/forums/showthread.php?8721-Preparations-to-release
PO Client can export teams through QR Code, with a client plugin. Now you can drag directly from it onto the desktop or a file uploader, so that it can be used in RMTs much more easily. (You had to screenshot, cut, and all before)
Doesn't work on linux/mac? Otherwise, here is what I'm really going to work on from now on: the battle logging system. So here is what I'm going to do: have a class called ConvertInput have a class called BattleManager have a class called BattleData have a class called BattleScene have a class called BattleOutput All the classes will communicate through the use of commands. Now that I think about it, it resembles Qt's Signals & Slot mechanism, but I didn't think about that at all when planning this. A command is basically an enum (to identify the function called) with a tuple of variadic template arguments (first time I'll get to use those, seriously hope minGW supports them now. Otherwise I'll create like 9 different functions, not death). Each class will store its function pointers in HashTables, which allows classes to implement only some of the functions. When a function is called, it checks the hashtable, if it's there then it calls the function with the template arguments in the command. The advantage of commands is redirecting and storing them, without any code duplication. Since it's pretty much really interoperable, all classes answer to the same protocols. BattleOutput, BattleScene will be able to convey commands to data or not, allowing for example each of them to have their own BattleData, have a shared BattleData, or have a BattleData supplied with info by something else. I really like the fact to be able to establish/cut connections between objects. For example, too, commands can be used in a battle scene to create a scope of battle datas containing the future states one by one, examine them, and decide how to proceed, if the battle scene needs some foreknowledge before animating. (Like making foes lose HP at the same time in doubles) It also makes things very easy if you want to implement converters and all. BattleManager is basically a hub of commands, creating all the other elements needed and the connections between them. BattleData can handle commands just fine to update its state. Anyhow, here is THE PLAN: With that, we'll have everything at disposal: replays, logs in different formats stored server or client side, warstory maker, log analyzer, battle stats maker, possibility to add plugins pretty easily to the server to check what happens in a battle, and the base for future PO animations (and I looked at Qt Doc, actually it's very possible). Why not make a plugin to convert battle commands to something javascript could read, and python would just have to pass it through? (Far future, though) Tons of possibilities. AI being one of them too. I've got to give credits to aeo for his awesome replay viewer that made me realize part of this :o That means I will work a bit less on network protocol, but feel free to contribute to it w/o me. I will also have not much time for the webclient. This'll make me remember some metaprogramming, yay! Anyhow, I'm glad I got something I can invest myself in with enthusiasm, hope it won't fade down.
I don't compile any plugins. They require Qt higher that 4.6.x last time it was mentioned here. EDIT: Mah diamond, y u take it, infidels!
Simple invocation relay & storage stuff: (not using function pointers anymore, pure template!) Code (c++): template <MyEnumValue, ...Params> void receiveCommand(...Args) { if (shouldInvoke<MyEnumValue>(Args...)) { invoke_function<MyEnumValue, Params...>(Args...); } for (output in myoutputs) { output.receiveCommand<MyEnum MyEnumValue, Params...>(Args...); } if (shouldStore<MyEnumValue>(Args...)) { commandList.append(new Command<MyEnumValue, Params...>(Args...)); } } void unpackCommands() { for (Command *c in commandList) { c->apply_on(this); } } /* for each battle function */ void template<MyBattleFunctionEnumValue, ...Params> invoke_function(...Args) { myBattleFunction(std::forward<Params...>(Args...)); } /* Battle Command storage */ struct AbstractCommand { virtual void template<class T> apply_on(T & other) = 0; }; template<...Params> struct Command { typedef std::forward<Params...> tupleType; Command(Params&&... params) : m_tuple(params...){ } void template<class T> apply_on(T &other) { std::function f(void(T*, Params...)) = &T::receiveCommand<Params...>; unpack_tuple<f, extend_tuple<&other, m_tuple> >(); } tupleType m_tuple; }; http://stackoverflow.com/questions/...e-function-arguments?answertab=active#tab-top link above in order to unpack tuples. Not sure when to use && when unpacking. Maybe a wrapper for outputs to call proper invoke_command in order to not make every invoke virtual. That way it'll be pretty flexible. If you have no idea what I mean, wait till I do real code, I'm just posting this here as a keep-safe. Didn't find a way to use lambda functions yet. But variadic template are already pretty nifty. C++0x here I come!
[secret] Code (C++): #include <utility> #include <iostream> #include <functional> void print(const char* s) { while (*s) { if (*s == '%' && *++s != '%') throw "invalid format string: missing arguments"; std::cout << *s++; } } template<typename T, typename... Args> void print(const char* s, const T& value, const Args&... args) { while (*s) { if (*s == '%' && *++s != '%') { std::cout << value; print(++s, args...); return; } std::cout << *s++; } throw "extra arguments provided to printf"; } template <class T> class Foo { public: template <class Y> void test(decltype(&Y::doStuff) ) { ((T*)(this))->doStuff(); } template <typename Y> void test(...) { print("Sweet victory\n"); } void testStuff() { test<T>(NULL); } }; class Test : public Foo<Test> { public: void doStuff() { print("Hello, success\n"); } }; class Test2 : public Foo<Test2> { }; int main() { Test x; Test2 y; x.testStuff(); y.testStuff(); return 0; } [/secret]Found a way to test if a function belongs to a class. Wonderful!
[secret] Code (C++): enum class { LaySpikes, RemoveSpikes, InflictDamage } MClass; class Invoker { public: virtual void invoke(Command *){}; }; class BattleInvoker<T> : public Invoker { public: void invoke(Command *c) { c->applyOn(this); } protected: template<class Y, std::same_type<void,decltype(&Y::laySpikes)> ,LaySpikes, int> mReceiveCommand (int field) { composite->laySpikes(field); } template<class Y, int, LaySpikes, int> void mReceiveCommand (...) { } public: template<MClass en, typename ...Params> void receiveCommand(...Args) { mReceiveCommand<T, 1, en, Params...>(Args...); } protected: T *composite; }; class CommandManager { public: CommandManager(Invoker *inv = NULL) : inv(inv) { } protected: Invoker *inv; }; template<> class BattleCommandManager : public CommandManager { BattleCommandManager() : CommandManager(new BattleInvoker<BattleCommandManager>){ } }; template<class T> class BattleCommandManager : public CommandManager { BattleCommandManager() : CommandManager(new BattleInvoker<T>){ } }; [/secret]If I can specialize templates outside of class decl, it'll be even more win.
Did the base command headers with templates. A bit cryptic, I understand, but as soon as there will be battle classes it'll be easier.
Just to be sure… Current git code can be compiled right now to get a new release? With new github thing I'm no longer sure (^ ^)'