Monday, September 1, 2014
Moving to wordpress
From now on, any future updates will be posted on my wordpress blog on wizardmmo.com/blog.
Sunday, August 31, 2014
Various bugfixes
- Vampiric spells no longer freeze the client
- Characters which somehow manage to get stuck in walls on mapchange or login will get moved to a nearby open position
- Multi-hit spells now retain their multi-hit property on logout
- Tailored items now have icons
Friday, August 29, 2014
New Websocket implementation
Replacing my WS implementation was surprisingly painless. I ran into some problems with my duplicate login prevention, but worked them out eventually. I had to sacrifice my stack for pure TCP sockets, but considering that I haven't regression-tested that code in ages, that's maybe for the better.
On an unrelated note: It's true. You can't put a server online without having it attacked immediately. I already have some IPs from China and Russia trying to brute-force my SSH root password. Good luck with that. It's randomly-generated and far too long to brute-force, especially over the net.
Thursday, August 28, 2014
Some problems fixed... or not.
1. terminate the old connection instead of the new one when the same account logs in twice
2. terminate connections when they don't responds to pings in a while
However, I am quite sure that this only fixed the symptom, not the actual problem, which seems to be a bug in my websocket implementation. I am thinking about trashing that hacky thing and replace it with a tried and true implementation like this.
Onliner for a day
Another topic: I am currently building a website on wizardmmo.com using Wordpress as a content management system. When it's finished I will start to think about how to spread the word about my game.
Tuesday, August 26, 2014
It's online!
It is now available at wizardmmo.com. But before I start to promote it, I need to take care of some things from my todo list.
Sunday, August 24, 2014
My game is now called WizardMMO
My original working title used to be Wizardwar, but Paradox Interactive beat me to that by a few months.
Walk animation, cast animation and ice particle effect
I did some long-needed pixel artwork. A walk animation for the player-character, a casting pose and the missing particle effect for cold attacks.
Saturday, August 16, 2014
ToDo List
Must Have
Should Have
Nice to have
Not sure if worth doing
- Netcode
- Zipped messages
- Client-sided prediction
- Security
- Password reset
- Brute force prevention
- Websocket over TLS
- Character customization
Genders- Portrait engine
- Graphic engine
- Dynamic recoloring of graphics
Particle effect for cold spells- Animations
Create walk animation for player characterCast animation (code and graphics)- Dead animation (code and graphics)
- Equipment
- Staffs & staff crafting
- Mining
- Prospect spell
- Sense spell
- Spells
Auto-generation of spells with target areas- Route Finding
- Upgrade from Dijkstra to A*
- Allow multiple layers
- Allow tiles with complex walkability-shape
- Flee algorithm
- Content
- One more soft material
- Website
Host for gameserver- Static content
Forum- Bugtracker
- Wiki
- All of that accessible with the ingame account
- Marketing
Come up with a name already!Get a domain name
Tuesday, July 29, 2014
Mining System implemented
But otherwise, I am quite happy with this feature. It works just like I designed it. Sensing and prospecting isn't implemented yet, but probing and mining works just as intended and I think hunting for ore is really fun... at least compared to the "click on ore, watch progress bar" resource gathering systems of most MMORPGs. Now I just need something which can actually be done with the ore. Currently it's just vendor trash, and not even a particularly lucrative kind.
Saturday, July 26, 2014
Wenibe and Angel quest finished
Monday, June 30, 2014
AoE overhaul
However, the procedural spell generation system doesn't create any spells with that feature yet. Both kinds of AoE attacks are now visualized by the client during their preparation-time, so players can dodge attacks more intuitively.
Wednesday, June 18, 2014
Little content todo list
- Give the healer more healing spells for sale
- Quest to introduce the player to item crafting
- Add a level 5 soft crafting material so the player can craft hats and robes before visiting the dungeon
- Draw the container for the MacGuffin #1 and add it to the dungeon
- Add more staffs (and write the code for making staffs do what they are supposed to be doing)
My shell is not complicated!
/shell user.getMapInstance().getMobs().stream().filter(function(mob) { return mob.getName() == "Boss" }).findFirst().get().getHp();
...
I might need to work on this.
Sunday, June 8, 2014
Labyrinth generator
This, however, begs the question of how much I want to rely on procedural content. While procedural generation is a great way to create huge amounts of content with minimal work, it can never compete with the ingenuity of hand-designed content.
To send the procedurally-generated map to the client, I had to write my own encoding routine for my maps. I used to just forward the original JSON code from Tiled to the client. But because there is no Tiled file for procedurally-generated maps, I had to write a routine to encode the map data myself.
The same routine is now used for the maps made in Tiled. This has the advantage that I only transfer the information about the map which the client needs to know. This saves bandwidth and removes cheating opportunities.
Sunday, June 1, 2014
Monday, May 26, 2014
Content Content Content!
Wednesday, May 21, 2014
Attack particle effects
Monday, May 19, 2014
Mining system
Resource gathering is an important part of every crafting system. An important resource would be ores and minerals mined from the depth of the earth.
It would, of course, be unthinkable for a wizard to take a pickaxe and perform manual labor to excavate minerals. Like everything in Pecosia, there is a branch of magic dedicated to these kinds of jobs: Geomancery.
Geomancery is the art of using magic to sense minerals in the earth and getting them to the surface. A geomancer hunting for ores needs two spells: A detection spell which tells him where the minerals are hiding and a mining-spell which gets them to the surface. More advanced minerals do of course require more advanced geomancery spells to find and mine.
Detection spells:
Prospect
The first spell cast by a geomancer visiting a new location. It tells them if and which minerals can be found on this map, but not where.Probe
Tells the geomancer if there are mineral deposits in range and how far they are away, but not in which direction. It does so by telling the caster the level of mineral radiation at its current position. The closer they are, the higher the radiation. However, when there are multiple deposits in range, their radiation adds up which could mislead the geomancer.
Sense
Tells the geomancer the direction of the next mineral deposit, but not how close it is. When there are multiple deposits nearby, the vector-product is created and the angle of that is shown, so again, multiple deposits in range can be misleading.
The Mining spell
When the geomancer believes that she found the deposit, she will use the mine-spell. It will reveal any mineral deposits in range and turn them into items which can then be picked up. The mine-spell is much more MP-costly and slower to cast than the detection spells. So while a geomancer which just casts it randomly might find a deposit once in a while, one which uses probe and sense will be much more successful in the long run.
All of this should not be hard to implement. But before I start I need to work on some bugs. I am using a spreadsheet for a while to collect any bugs I find but do not feel like fixing right away, and it has grown quite long. Some are of the we-can-live-with-that-for-now level, but there is also a very critical bug which makes the whole network system unresponsive under some condition which I definitely need to take care of before starting with any new features. There are also some worrysome bugs which are not that critical, but very hard to reproduce. Multithreading is hell.
Saturday, May 3, 2014
Fighting NPCs
I added the ability for NPC scrips to turn NPCs into mobs and revert them back to NPCs when defeated. This will be very useful for quest scripting. I want to avoid those cliché "Kill 10 rats" quests. I want quests which actually tell a story and are not just excuses for mob grinding.
I also did a first quest where you retrieve a stolen item. The player finds the thief and talks to them. Then the thief turns hostile and fights the player. Well, that's the basic plot. The details are of course much more fleshed out (don't want to spoil).
Saturday, April 26, 2014
Shutdown procedure
Until now there was no proper way to shut down the server. The only way was to kill the JVM process, which didn't save any characters. I finally solved this by adding a proper shutdown-command which properly disconnects and saves all the characters, terminates all the map instances and properly finishes up all the other stuff which happens in the background. I also wrote a server-sided javascript which can be executed from the shell and shuts down the server after a countdown. This utilizes a new admin-broadcast feature I also implemented.
I mostly did the script as a PoC for server-sided scripts started from the console. This might come in really handy for special events managed by GMs.
Saturday, April 12, 2014
Choosing a wiki software
My should-requirements are:
- Uses PHP
- Simple to set up and administrate
- Syntax similar to MediaWiki
- Doesn't use databases besides MySQL and MongoDB
My can-requirements are:
- Possible to hack in a way that it can share user accounts with my game
MediaWiki
My first idea was the popular MediaWiki, but the "What is MediaWiki" section on their homepage says:"MediaWiki is geared towards the needs of the Wikimedia Foundation. The program is primarily developed to run on a large server farm for Wikipedia and its sister projects. Features, performance, configurability, ease-of-use, etc are designed in this light; if your needs are radically different the software might not be appropriate for you."
I just want a wiki for my small little game, not build a million-article encyclopedia running on a dedicated server-farm, so this doesn't really sound like the right software for me.
PmWiki
The second software which caught my eye was PmWiki, pretty much the Anti-MediaWiki.It is extremely simple to set up, because it doesn't even require a database. It saves everything in flatfiles. This might look strange in this day and age, but they are making a convincing argument. I tried it and the installation was indeed a breeze - just copy the PHP-files and it runs out-of-the-box.
But what really surprised me is that PmWiki by default does not even know the concept of personalized user accounts. In the default configuration, everything can be edited anonymously. When you don't like that, you can set individual passwords, but they are not bound to accounts. Anyone who knows the password can read or edit specifically protected pages.
There are, however, lots of addons which enable mandatory logins with username and password. Many of them are designed to use the user databases of other systems. That likely means that I could write my own which uses the accounts in my MongoDB.
Wednesday, April 9, 2014
MongoDB authentication
Sunday, April 6, 2014
Password changing
Thursday, March 27, 2014
Crafting interface implemented
I added support for crafting. NPCs can now display a crafting window. They can freely define how many slots to display and where to display them. The item script can also define a handler-function which receives the items the player dragged into the window. Each slot can define a "tag" which says which items can go there. Items can now have one or more such tags which define the crafting use they have.
The Java part of the engine does the ground-work of validating that the users input is legal (tags match the slots, user actually has the items).
The scripted function is then responsible for checking if the combination is a valid recipe, remove the items and give the player a new item. This function could also be implemented as a Java class. When I develop a more complex crafting system, I might opt to do so.
Java 8
I updated to Java8 and experimented with some of its new features. I coverted the admin command handlers to use the new lambda feature, and it really improves the code. The new Nashorn Javascript engine gave me some problems because some scripts no longer worked the way they used to, but I think I solved all the issues (wrote a Q&A on stackoverflow about it).
Tuesday, March 18, 2014
Statistics
The server now accumulates statistics about how much network traffic is sent and received for each message type. I added a command /traffic to access this information from within the game. This should tell me where I need to optimize my protocol. So far it seems like move-messages and map-layout messages are the traffic users number 1 and 2.
Both leave some room for optimization. The move-messages send the coordinates in ascii-encoded floating point numbers with a precision much higher than needed. Two decimal places should be more than enough. And the map information is basically the whole JSON data as it comes from Tiled. That's a lot information the user is not meant to see. It can and should be redacted.
But I need real usage data by real players to say for sure where optimization is needed most.
Another method to generate statistics are web-reports. I created a system to regularly export data as JSONP files and save them somewhere. A website can then use javascript to import this data and output it in a presentable way. Currently I have a list of current players and a list of active maps with player count. The JSONP technique makes the data available to anyone. This is intentional; I would like to see what the community can come up with to beautify my data.
I am thinking about archiving these reports in the database too. That would give me access to historical data.
Monday, March 3, 2014
Visible equipment
Currently this only works with hats and staffs because I only have sprites for these yet. But that's just a matter of creating the content. The next step will be to allow differently colored equipment.
Saturday, February 22, 2014
Password hashing updated
Wednesday, February 12, 2014
Some new tiles and height levels
I also experimented with adding height levels. Those you see on this screenshot are entirely client-sided and randomly generated. I am unsure if I will keep it.
First, I am not sure if it is even going to add so much gameplay-wise for the amount of work it would mean (routefinding etc.). Then there is the problem that Tiled can't do isometric maps with height levels. So I would either have to patch Tiled, find another editor or write my own map editor after all.