t-engine

Today is the 9th Anniversary of Tales of Maj'Eyal first line of code!

So today, not sure why, I was looking at the very first commit on the game's code and it turns out it was done on the 17th November 2009! Making the code exactly 9 years old today!

So I thought I'd make a little retrospective of how things where at the very beginning at the 1 day, 1 week, 1 month, 6 months and 1 year marks. This way you can see how things started, including some screenshots of stuff I'm probably the only one to ever have seen ;)

Oh and if you log ingame this week, you will get a little special celebration event! Yayz!

For each step we will also count the number of files and lines of code of the game (for simplicity of counting this includes libraries too, this is mostly important for the C code).

But first, a little anecdote of how the game came into being.

Tales of Maj'Eyal was born as Tales of Middle Earth 4, set in a Tolkien setting. It was meant as the successor of my old game aptly named .. Tales of Middle Earth 2 (and the aborted 3), itself being the evolution of Tales of Middle Earth 1 and Pernangband, which was started a long time ago in 1998.

After Tales of Middle Earth 3 had mostly failed due to trying to make old non adaptable code into something new I stopped doing anything with it for a few years. Before that however Tales of Middle Earth 2 was a well known game in the, then way smaller, roguelike community. So a few years had gone by but I kinda always felt guilty to abandon my players, but I just couldn't force myself to work with such old inflexible code anymore where every new feature felt more like a struggle than a joy to add.

Then, in the middle of November 2009, I caught a bad case of the flu, I was forced to stay home for a week and well, felt like crap, sweating and being in pain in my bed for no reason. But I simply can not stay put and do nothing, I don't work this way and thus I decided that given I'd feel like crap, I could also feel like crap on my computer and work on something. All the guilt I felt of abandoning my old players, and the fact that no roguelike at that time gave me an acceptable pure spellcaster experience, made me decide that I wanted to start on Tales of Middle Earth 4, but on my own term, on my own code, starting from nothing and building from there.

I spent some hours thinking of how I'd like the main structures of the game & engine to work and articulate and then started coding it. This is probably one of my proudest code moments because the structure I devised back then handled the test of time very well and is still today the foundation of Tales of Maj'Eyal and still feels adapted to whatever new strange ideas I have for the game.

So without further ado, let's have a quick look at the first commit!

First Commit
Stats: 4 lua files totaling 104 lines and 105 C/C++ files totaling 42822 lines.

The first ever commit saw the introduction of a very (very) basic map and entities code on the Lua side, and very basic SDL display & keyboard code on the C side. There was no yet any concept of modules, but a commented line in the lua engine code shows they were planned from the starts, as it says 'dofile("/game/modules/tome/")'.

First Day

Stats: 8 lua files totaling 237 lines and 103 C/C++ files totaling 42627 lines.

On the last commit of the first day, the modules system was now working. All game tests, map example, ... were done in the "tome" module, split from the engine.
The number of lua files, and lines, had more than doubled already and was showing no signs of slowing down as you will see in the next time mark.

First Week

Stats: 53 lua files totaling 4660 lines and 137 C/C++ files totaling 47997 lines.

By the one week mark, most of the important engine's structures which still exist today, identical but much enhanced, was in place and working. This also saw the beginnings of an UI layer as seen in the screenshot with the tooltip and basic combat log. The engine also saw many additions, map generators, specialization of entities into actors and grids and so on.

The tome module was also starting to show signs of a structure that is still used to this day. with zones split into their own folders and so on.

Oh and please, delight your eyes at the magnificent player tile I drew myself! Such art, much talent! ;)

First Month

Stats: 116 lua files totaling 11413 lines and 156 C/C++ files totaling 52296 lines.

The magnificent player tile is obviously still present! But a lot of things have changed or evolved, too many to list them all but let's have a look at a few of them.

On the engine side the two biggest additions, because of how far reaching they are, are the serialization code and the temporary values code.

Every single object in memory gained this capability which for non-coders can be explained as being able to generate some text that represent the object in memory. Using this important feature the engine could now "dump" it's memory into a file and reload it later, effectively giving savefiles. And what's important about those is that they would automagically record any change to anything without me having to plan for them to save. This is extremely freeing on the design side and helped a lot to get wild with things later on.

The temporary values code of entities is a bit technical too but basically, imagine that any actor/grid/object/... has a whole bunch of properties (color, weight, price, damage, life, whatever). This system allows any part of the code to tell an entity "ok now you add X to the value of this property of this object". This is rather easy and basically just adding two numbers; but the other side of the system is that later on the code can say "ok now revert *this specific change* and not the rest". Effectively the engine remembers every change to every property of every entity and thus is later able to revert them individually. This is heavily used by all talents and timed effects code (and much more). For example, every single time you use a regeneration infusion in game, this system is used.

On the side of that the engine also saw the addition of other important systems like multiple, switchable, map generators, the further specialization of entities into objects, and thus an inventory system, the ability to have either turn-based or realtime game modules, and the talents/timed effects code.

Six Months

Stats: 461 lua files totaling 50739 lines and 238 C/C++ files totaling 82574 lines.

While up to the first month all I had to fight "ingame" were dragons of death, the next months would see the addition of actual playable game data. The screenshot even starts to look like a game at that point. On it the most notable thing we can see is the addition of a tileset instead of using ASCII tiles. But this is not all at all!

The engine started to support sounds and musics, the switch to LuaJIT code for more speed, the support for customizable options and keybinds. It also saw the birth of the "boot" module. This is what you see when you start the game: the main menu where you can set options, start a new character, load one, and so on. This is actually a game module like any other!

It is also the first time the number of lua files (but not the number of lines) passed the number of C files, good times!

On the game side there was much progress made, and could be recognizable by players today (even though the game had not yet transitioned to its own setting yet). It had multiple playable zones, many objects and NPCs, a whole bunch of classes (the wilders being the latest added at the time) and even some quests working.
Also for fun, notice how on the screenshot there is a potion of lesser healing listed. Yes at this time the inscriptions system didn't exist yet.

Somewhere along the line the first alpha was sent to some of my old players and later on public beta started.

First Year

Stats: 1283 lua files totaling 138612 lines and 278 C/C++ files totaling 132743 lines.

Potions are gone! Inscriptions are in! Yes, one of the very important ToME system was never planned to exist; it only came into being when a player suggested it'd work better than spam quaffing potions like other games did. And it did work so much better.

Oh yeah an other thing that is gone: the Tolkien setting! Replaced by my own custom one. While I really love Tolkien's work it wasn't fitting anymore for the wild stuff I wanted to do. Also I had been bitten by a C&D letter long ago with Pernangband and I didn't really want to repeat the experience. And doing my own setting was liberating! "Eyalverse" is my baby now, the more stories and facts I write for it, the more ideas I get! It is both great and frightening because I can easily see myself adding new stuff to it in 20 years ;)

Aside from that the game was now really starting to feel like an actual big game with many zones, quests, classes, races and so on. Lore notes started to appear, providing insight into the past of the game's universe, or npc's motivations, or simply random fun bits like the minions of The Master writing poems to his glory!
Oh and it could be won, which is kinda important too ;)

Some of the whacky classes were already in, like the chronomancers. Funny thing about them too: remember the serialization code I talked about much earlier that is used to make savefiles? This is also the very basis of time spells that let you go back to the past! And that cool See the Threads spell were you can live three different timelines and choose your best? Yup that too! When you do choose at the end, you actually have 3 copies of the game world inside the game!

The engine received even more additions, to AI and pathing (distance maps, A*), to map generation and so on and so forth. But the two huge additions are most certainly the switch of the whole graphical stack using OpenGL directly instead of SDL and the addition of a particles system to display spell effects.

The first online features also started to appear, namely the saving of your unlocks, achievements, .. online. There wasn't yet any ingame chat or character's sheet upload though.

This is also the first time that there are more lua code lines than C code lines. And you have to understand that the C lines include many third parties libraries I use while the lua code have very little, so that's a whole bunch of custom lua code ;)

Nowadays

Stats: 2467 lua files totaling 382106 lines and 466 C/C++ files totaling 230310 lines.

And finally this brings us to today, as you can see the lua files and line count has the C side thoroughly beat and this is not including any official addon or expansions. If those were to be used the counter would skyrocket!

I will not even try to list all the changes that happened in 8 years, there are far too many but it's been a wild ride, full of joy and sometimes annoying bugs. What's more, and best, about it is that I have not been alone for this amazing ride, I've always had the support of a great community and out of it along the years many individuals have stepped forward and gave their time and energy to contribute many important stuff to the code. I can not list them all here (they are in the credits in any case) but they, and all players, have my thanks!

As for the future? Well, as long as players keep loving the game and getting even more friends to play I'll happily keep developing it. If one thing is certain is that I do not lack ideas about new stories to tell in the "Eyalverse", only time is lacking! So watch out for a huge 1.6 patch coming to you! Also know that the next expansion is already being work on and will focus on stuff that happens on Eyal at the same time as the main campaign but... elsewhere.
Hell there may even be some new cool stuff coming to Embers of Rage... did anybody say new class? No ? Oh I thought so..

But for now I feel like I've written more than enough and if you managed to read it all and not get utterly bored, I thank you and will see you soon!

Have fun in Eyal!

Tales of Maj'Eyal 1.5.10 aka "It That Patches" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.10 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Zigur is now always present on the map but forbids entry to any magic user.
  • Fix addons & DLCs auto updater
  • Updated registration process for new players

Have fun in Eyal!

Tales of Maj'Eyal 1.5.9 aka "The Last Patch Of Us" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.9 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Altered lore popup window to accomodate big lore visuals better
  • Shatur (and others) trees should be back to their full glory
  • Fixed crash on birth screen when framebuffer video option is disabled

Have fun in Eyal!

Tales of Maj'Eyal 1.5.8 aka "Forbidden Patch" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.8 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • The flame of the candles in the blighted ruins now flicker
  • Fixed Actor:cloneActor to support both add_mos and add_displays, in essence this fixes display bugs with talents that clone NPCs
  • Disable Dreamscape on Dreaming Horrors to avoid weird bugs, until they can be fixed. But buff the horror to compensate
  • Disable all connectivity will not disable steam anymore
  • Fixed Plague tree, this includes the black screen level generation bug

Have fun in Eyal!

Tales of Maj'Eyal 1.5.7 aka "Forbidden Bugs" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.7 ! See http://te4.org/

This is an urgent update to 1.5.6, sorry about the bugs my minions, for once I'll go whip myself ;)

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Fixed error on changing level after a version upgrade. Stupid me sorry :/
  • Fixed a bug with The Mouth spawns and some others
  • Fixed time played in discord rich presence to correctly indicate hours instead of days

Have fun in Eyal!

Tales of Maj'Eyal 1.5.6 aka "Forbidden Sect" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.6 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Added Discord Rich Presence support
  • Aether Beam cast by NPCs will be visible
  • Alchemist golem creation method is now global to the talents namespace (and thus can be modded)
  • Can send talent links in the chat from the talent's right click menu or in the levelup dialog by pressing ctrl+l
  • Chat names of devs and mods have the proper mention of the status
  • Check on character creation for magic/antimagic combo with a warning
  • Clarified online event option with three states, if you had changed the setting you need to reapply it
  • Class icons for all classes!
  • Disabled highscore on the main menu, nobody cared about that anyway
  • Dreaming Horrors now have a custom tooltip regarding their awaken/dreaming state
  • Exported necrotic aura and create minions data and functions to the global talents environment for easier modding
  • Fix Infestation pools blotting out the sun
  • Fixed Flames of Urh'Rok shader (and other similar ones) for ATI GPUs
  • Fixed Fortress and Glass walls for corner cases
  • Fixed randarts with very low ammo regen turns
  • Fixed talent unlearning and item removal to correctly remove buffs they set like they already removed sustains
  • Fixed the orb pedestals in the slime tunnels to be an actual requirement
  • Invulnerable npcs are denoted as such in tooltips
  • Made temporal fugue more resilient to reccursion (with regard to automated defence system of Embers of Rage)
  • Melee retaliation powers on randarts are rarer and higher level
  • Ogres and Shalore are not in Ziguranth patrols anymore
  • Recall buff is now classified as "other"
  • Remove pointless Pestilent Blight combat log entry
  • Removed restriction on shimmers based on weapon/armour types; you can now shimmer a dagger to a staff or a plate armour to a robe!
  • Replaced Rapid Shot with Aim for Bowman Thoughform to correctly match the weapon
  • Revise Rot and Plague talent targeting and tactical tables
  • Switched drem and dremling names to be more fitting
  • Tighthened security around file access functions
  • Addons: "In Combat" status is now computed by the game for all actors, always available as "actor.in_combat" and with callback "callbackOnCombat(state)" when status changes
  • Addons: ActorTemporaryEffect support #hisher#
  • Addons: Added "callbackOnTargeted"
  • Addons: Added game:shakeScreen()
  • Addons: Added loadIfNot to entities environment to only load said list if it has not yet been
  • Addons: Added setTextFont and setAnswerFont functions to chats definition files to switch the fonts used.
  • Addons: Chat:load hook exposes the chat file environment
  • Addons: Damage shield supports on_absorb callback
  • Addons: Fixed events generation in temporary zones
  • Addons: Fixed resolvers.charm/charmt to be last resolvers to avoid problems with reapplying ego
  • Addons: Items that can save life get notified if they do with "on_resurrect" field
  • Addons: Levels can decide if they'll dynamically match stairs with "auto_zone_stair"
  • Addons: New hooks "Chat:invoke", "CommandStaff:SentientOptions", "CommandStaff:SentientChat", "GameState:makeEventName" and "Winner"
  • Addons: New Quest:isSuccess method
  • Addons: New set of inventories parsing methods: findInAllWornInventories, findInAllWornInventoriesBy, findInAllWornInventoriesByObject, wornInventoryApplyAll
  • Addons: New table.pairsRemove function
  • Addons: NPCs can have a custom_tooltip method to add stuff to their tooltips, dynamically
  • Addons: Temporary zone shifts can use "temporary_zone_shift_save_pos" to back back exactly where the entrance was
  • Addons: Zone's generators using "zoneclass" can be a string instead of true to load a specific file

Have fun in Eyal!

Tales of Maj'Eyal 1.5.5 aka "Whoops" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.5 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Fixed shops

Have fun in Eyal!

Tales of Maj'Eyal 1.5.4 "The Match" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.4 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Fixed damage bonus, resistance penetration and resistances to correctly appear in online charsheets
  • Buffed Athamaton, also it can now speak! Enjoy your deaths
  • Added support for visible talents, items and playerdoll images on online character sheets on te4.org
  • Fixed joining chat channels on star in some rare cases, one of the reason for "server doesnt work: it did work you just didnt saw it
  • Talents that generate resources state "FOO gain: X" instead of "FOO cost: -X"
  • Improved data synchronization with the server to lighten load
  • Fixed trying to capture a fearscaping npc while in the fearscape with a possessor
  • Modding: Support for "hated_by_everybody" property
  • Modding: DLCs/Addons defined resources should now correctly appear in the charsheets
  • Modding: New resources parameter "switch_direction" to indicate the resource prefers to be lower
  • Modding: New Actor:alterTalentCost method
  • Modding: New static method Object:descCombat() to let addons pass a custom combat table and get a correct description

Have fun in Eyal!

Dropping support for OSX version lower than 10.9 soon

My minions,

I always try to support even the most antique systems as much as possible, but sometimes I just can't anymore.
Up until now the game worked on 10.6+ but I'm soon going to use code that requires more recent compilers.
Thus bumping the requirement to 10.9 (which is already nearly 4 years old).

The steam page has listed 10.9 has a requirement for a long time now anyway so this is more an official announce than a surprise :)

Have fun in Eyal!

PS: If some mac pros can explain to me how to compile C++11 (or ideally more!) on and for OSX 10.6, I will not have to drop it ;)

Tales of Maj'Eyal 1.5.3 "Never give up, never surrender!" is out!

My minions, I am happy and proud to give you Tales of Maj'Eyal 1.5.3 ! See http://te4.org/

Your launcher should automatically update your game so no need to redownload it all.
If your launcher didn't self-update correctly, just redownload it from the homepage.

Enjoy and have fun in Eyal!

Don't forget to help ToME by with donations ( http://te4.org/donate ) !

  • Cannibalize penalty is now displayed in the assume form dialog
  • Cannibalize penalty is currently removed for body clones
  • Removed the info about timed effects for Assume Form as taht was old stuff that was never actually done
  • Fixed the description of Assume Form
  • Fixed Infestation's carrion worms poping over npcs/you sometimes
  • Fixed crippling poison on items (fixes Assassin's Surprise in Embers of Rage)
  • Fixed Chants and Hymns for escorts
  • Sanity checks to prevent a rare dmage shield error with Minimalist UI
  • Reckless Strike can not kill the user anymore
  • Fixed Aeyrn sometimes being hostile in the end fight
  • Fixed challenges sometimes auto-failing or auto-succeeding in the Infinite Dungeon
  • New hook "Actor:startTalentCooldown"
  • Disabled portal greater vault as it keeps on bugging weirdly
  • Fixed the item's vault not appearing in the Infinite Dungeon
  • Eldoral Last Resort bonus talent changed to Scatter Shot
  • Adventurers start with combat training unlocked
  • Randboss/rares can not generate with random talents from the "other" trees (which are hidden or npc specific stuff)
  • Fixed a rare bug that could void player's armour or saves

Have fun in Eyal!

Syndicate content