Monday, September 1, 2014

Moving to wordpress

I decided to move this blog out of Googles reach and onto my own server on wizardmmo.com.

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

My server is online with a new websocket implementation by java-websocket by TooTallNate. I hope that this will work better for all the people which could not connect. Please try again and comment to tell me about your experience.

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.

Some people commented on my last post that they have problems logging in. Thank you very much for that. I now changed the server to:

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

My server is now online for a day and I already have three account registrations. Considering that I didn't actually do anything to promote it yet except for writing on this blog, these are three more people than expected. It would be even more motivating, though, when they would have actually done anything, but looking at their saves in the database it seems like they didn't even move from the starting point. I wonder if they encountered some problem or just didn't felt like playing.

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!

I rented a small virtual machine, installed my server on it and uploaded my javascript client. Except for some small initial issues it now runs great. At least as long as I am the only one who is playing.

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

I finally decided on a name: Until I come up with something better, it will be called WizardMMO. I already registered the domain wizardmmo.com and will soon build a website. Yes, the name is very generic, but this is what my game is about. It's a MMO where you play only wizards. Much easier to remember than some word-salad title or made-up fantasy name.

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

I haven't made a proper roadmap in ages. So this is not really a roadmap but rather an unordered but prioritized 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 character
    • Cast 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

I implemented the mining system. I also made the first mining map, an NPC which sells the mining spells, and two Foni's, one giving mining hints and one telling a bit more about herself. I am not that happy with the iron ore item sprite, though. It looks like shit. No, it literally does. Just look at it:


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

I reworked Wenibe and finished the angel quest. I actually did two weeks ago. I need to take this blogging thing more serious again.

Monday, June 30, 2014

AoE overhaul

I spent the whole Sunday with overhauling the code for AoE attacks. It is now much more extensible for different attack patterns than just points and circles. I also implemented attacks which target a ground location instead of a specific opponent, which works both for mobs and for players.

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

I am currently working on content up to level 10. I made the dungeon which should bring the player to level 10, but it is still quite hardcore. Here is a little Todo list of stuff I need to add to prepare the player for it:

My shell is not complicated!

To get the current HP of a boss monster, you just have to use one simple, easy to remember, command:

/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

I experimented with procedural map generation. The maze below is created completely on the server based on a random seed. I might want to use this algorithm as-is in the finished game to create procedural dungeons, but for now it's mainly a proof-of-concept. I could imagine a lot more kinds of maps which could be created procedurally than just this one.

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

Minimap

I've added a minimap. An easy to do but crucial feature.




Monday, May 26, 2014

Content Content Content!

The last days were all about adding content. I made the first complete quest, I made the biggest map so far, I balanced the existing mobs and I made a new tileset which I will soon use for the first real dungeon. But there is still a lot of stuff to do before I got enough content to go public.


Wednesday, May 21, 2014

Attack particle effects

My buglist is shrinking down to the "that code will be replaced anyway" and "freak accident which happened once during development" categories, so I started something new. Attacks now create projectiles which fly from the caster to the target. That makes combat a lot more immersive:


Monday, May 19, 2014

Mining system

Just a concept for now.

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).