[Diablo Clone (no title yet)] Devlog - fun attempt at a Diablo-style RPG

Radr

Member
Hey all, I'm just getting very excited now that I've got some of the framework behind my Diablo-style item generation and inventory going and felt the need to share it.

I've been working on this project in my spare time for the last couple of weeks, and I've got a small few things working nicely now including:

-The ability to click to move the character around, and pick up items. You can cast your active spell at enemies if you hold shift and click or just click an enemy. You can change your active spell in the spellbook when you have learned it.

-The inventory allows you to move items around between any slots you want and drop items out of the inventory onto the ground, all the while remember what is located in which slot, and transferring variables to objects on the ground and back to the inventory when you pick them up again.

The enemies randomly generate an item drop and when the item drops it calculates a random rarity based on your player's magic find % and the other monster's chance to drop a magical item. From there you can get:

- a normal (white) base item with no extra stats
- a magical (blue) item with 2 extra random stats and a prefix and suffix that correlate with the each property ex. +11 to strength and +6% life steal might be "Strong Leather Armor of the Leech" as opposed to "Leather Armor"
- a rare (yellow) item with 3 extra random stats and a randomly generated name like "Vicious Grasp Leather gloves"
- a unique (brown) item with predetermined stats and it's own specific name
- a set(green) item with predetermined stats, it's own specific name and (eventually) set bonuses.

Armor slots get an armor rating, weapon slots get a min damage and max damage and attack speed and all items can have requirements of level, strength, dexterity etc. as well as any attribute in the game as long as their quality is high enough! Here it is below, feedback is appreciated!

 
Looks like a great Work in Progress!

Will you have an action bar similar to current ARPGs (D3, Path of Exile, Grim Dawn) or will it be the same skill usage system like in D2 where you had to press F1 to F12 to switch between skills? (1 thing I hated is, especially as a paladin, you wouldn't want to put a non-aura skill on your right click because you lose whatever aura you're using)
 

Radr

Member
Looks like a great Work in Progress!

Will you have an action bar similar to current ARPGs (D3, Path of Exile, Grim Dawn) or will it be the same skill usage system like in D2 where you had to press F1 to F12 to switch between skills? (1 thing I hated is, especially as a paladin, you wouldn't want to put a non-aura skill on your right click because you lose whatever aura you're using)
Thanks! I think I'm leaning more towards a hotkey oriented system like Diablo 2 with left and right mouse skills, but definitely wouldn't want things like the paladin aura issue you pointed out in the way of the gaming experience so I'll work around stuff like that somehow (maybe by adding passive abilities to each class, of which you can only activate one at a time).

I'm quite excited to keep adding to this game and see and see just how much I can do with it. I'll probably keep posting updates here and there as I roll out now features.
 
(maybe by adding passive abilities to each class, of which you can only activate one at a time).
That sounds like a great work around, to expand on that you could do something like this:
Paladins get Auras. (Pray Aura, Concentration Aura, Holy Fire Aura, etc)
Barbarians get Stances. (Berserk Stance, Defensive Stance, Swiftness Stance, etc)
Mages get Runes (Casting Speed Rune, Fire Rune, Absorb Rune, etc)

I'm quite excited to keep adding to this game and see and see just how much I can do with it. I'll probably keep posting updates here and there as I roll out now features.
Awesome! Can't wait to see what updates are added over time!
 

mar_cuz

Member
This is great! Are you able to tell how you did the inventory?

Looks like a solid base to start from.
 

Radr

Member
This is great! Are you able to tell how you did the inventory?

Looks like a solid base to start from.
Thanks a lot! I'll do my best to explain, as there's a lot of code and scripts behind it already, but basically it's an expanded version of Shaun Spaulding's inventory system on youtube. Every item in the game when created gets assigned these stats as variables:

Code:
object          = -1;
sprite          = -1;
equipslot       = -1;
type            = rarity.normal;    //rarity
identified      = true;
//requirements
reqlevel= -1;
reqstrength= -1;
reqdexterity= -1;
reqenergy= -1;
//slot specific
mindamage= -1;
maxdamage= -1;
armor= -1;
attackspeed= -1;
//properties//////////////////////////////////////////////////////////////////////////////////
//magical and up
prop1stat       = -1;
prop1stattext   = -1;
prop1value      = -1;
prop1           = -1;
//magical(sometimes) and up
prop2stat       = -1;
prop2stattext   = -1;
prop2value      = -1;
prop2           = -1;
//rare and up
prop3stat       = -1;
prop3stattext   = -1;
prop3value      = -1;
prop3           = -1;
//rare(sometimes) and up
prop4stat       = -1;
prop4stattext   = -1;
prop4value      = -1;
prop4           = -1;
//rare(sometimes) and up
prop5stat       = -1;
prop5stattext   = -1;
prop5value      = -1;
prop5           = -1;
//rare(sometimes) and up
prop6stat       = -1;
prop6stattext   = -1;
prop6value      = -1;
prop6           = -1;
//Set bonus 1
prop7stat       = -1;
prop7stattext   = -1;
prop7value      = -1;
prop7           = -1;
//Set Bonus 2
prop8stat       = -1;
prop8stattext   = -1;
prop8value      = -1;
prop8           = -1;
//Socketed with 5 rare jewels
prop9stat       = -1;
prop9stattext   = -1;
prop9value      = -1;
prop9           = -1;
//Socketed with 5 rare jewels
prop10stat      = -1;
prop10stattext  = -1;
prop10value     = -1;
prop10          = -1;
//Socketed with 6 rare jewels
prop11stat      = -1;
prop11stattext  = -1;
prop11value     = -1;
prop11          = -1;
//Socketed with 6 rare jewels
prop12stat      = -1;
prop12stattext  = -1;
prop12value     = -1;
prop12          = -1;
//Info
name            = -1;
info            = -1;
unidname        = -1;
unidtooltip     = -1;
//Tooltip
tooltip         = -1;
From there, if you left click an item on the ground, it "picks up" the item and transfers all those variables into 1 of 40 "slots" I have set up as a 2D array that is the in obj_Inventory. The array is initialized like so:

Code:
//Array - First number = Slot in inventory Second Number = Property in Slot
for (i = 0; i < global.inventoryslots; i += 1){
    button[i] = instance_create(0, 0, obj_InventoryButton)      //Creates invisible boxes behind each inventory slot
    button[i].slot = i;                                         //Gives every button a "slot" number variable
    for (j = 0; j < numberofproperties; j += 1){
        global.inventory[i, j] = -1;                            //i = slot j = slot's property
    }
}
so basically, I set my initial number of slots (8 columns x 5 rows = 40 boxes) and each slot contains a value for the properties of the item I listed above. I also create a "button" object for each box, and give it a variable telling it which box it is (from 1-40). The button objects have a lot of Draw Code, but basically each one starts off creating local variables for each property in it's "slot":

Code:
///Draw and Interact with items in inventory
if (showinventory){
    //Gather all variables from the item in that particular slot
    var object          = global.inventory[slot, property.object];
    var sprite          = global.inventory[slot, property.sprite];
    var equipslot       = global.inventory[slot, property.equipslot];
    var type            = global.inventory[slot, property.type];
    var identified      = global.inventory[slot, property.identified];

.........etc....
to get all of the information. It then checks if you've clicked on it at all and if you do it runs a few scripts (again see Shaun Spaulding's inventory tutorial as that's basically exactly what I've done) to empty the slot and set all the properties back to -1, and if anything was on the mouse, i.e "picked up", sets the slot to whatever you had picked up:

Code:
if (abs(mouse_x - x) < 16) && (abs(mouse_y - y) < 16){
        draw_set_alpha(0.15);///////////////Insert rarity down below here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        draw_set_colour(c_yellow);
        draw_rectangle(x - 15, y - 15, x + 15, y + 15, 0);
        draw_set_alpha(1);
        //If you click the box and there is something in it:
        if (click){
            if (object != -1){
                //Make said slot empty
                scr_ItemDropSlot(slot);
            }
            //If you had something picked up on your mouse:
            if (mouseitemobject != -1){
                //Fill the slot with whatever was on the mouse
                scr_ItemPickupSlot(mouseitemobject, mouseitemsprite, mouseitemequipslot, mouseitemtype, mouseitemidentified, mouseitemreqlevel, mouseitemreqstrength, mouseitemreqdexterity, mouseitemreqenergy, mouseitemmindamage, mouseitemmaxdamage, mouseitemarmor, mouseitemattackspeed, slot);
                scr_ItemPickupSlot2(mouseitemprop1stat, mouseitemprop1stattext, mouseitemprop1value, mouseitemprop1, mouseitemprop2stat, mouseitemprop2stattext, mouseitemprop2value, mouseitemprop2, mouseitemprop3stat, mouseitemprop3stattext, mouseitemprop3value, mouseitemprop3, slot);
                scr_ItemPickupSlot3(mouseitemprop4stat...... etc...
            }
and finally if anything was in the slot, picks it up onto your mouse (More variables, all the same stats but for mouseitem):

Code:
//Pick up whatever was in the slot onto the mouse
        mouseitemobject         = object;
        mouseitemsprite         = sprite;
        mouseitemequipslot      = equipslot;
        mouseitemtype           = type;
        mouseitemidentified     = identified;
        mouseitemreqlevel       = reqlevel;

....etc...
a simple right click to identify:

Code:
        //Identify Item
        if (rclick){
            if (object!= -1){
                if (global.inventory[slot, property.identified] = false){
                    global.inventory[slot, property.identified] = true;
                }
            }
        }
    }
and at last, a quick little tooltip when you hover over it:

Code:
//If the slot is not empty
if (object != -1){
    //Draw whatever item is in said slot
    draw_sprite(sprite, 0, x, y);
    if (abs(mouse_x - x) < 16) && (abs(mouse_y - y) < 16){
        //If nothing is currently picked up on the mouse
        if (mouseitemobject == -1){
            //Draw the tooltip
            global.showtooltip = true;
            i = instance_create(mouse_x, mouse_y, obj_Tooltip);
            i.type = type;
            if (global.inventory[slot, property.identified] = true){
                i.tooltip = tooltip;
            }
            else{
                i.tooltip = unidtooltip;
            }
            
        }
    }
}
To handle dropping the items, in my obj_GlobalController, on global left mouse press it checks to see if I'm clicking on something else (such as a menu, another item, an enemy etc), and if not, drops the item at obj_PlayerParent.x, obj_Playerparent.y. To ensure objects never stack right on top of each other, Ive included a while loop in obj_GroundItemParent 's create event:

Code:
while (place_meeting(x, y, obj_GroundItemParent)){
    x = (random_range(x + -48, x + 48));
    y = (random_range(y + -48, y + 48));
}
Hopefully that gives you the gist of it anyways, but if you have any more questions about it let me know and I'll try and help out!
 
Looks great!

Just two things I noticed - the item creation code - all those prop1, prop2 looks ripe for converting to an array/ds_list. I was curious if you had a reason for doing it that way, as it's kind of hardcoded and would be a little bit of work if you wanted to expand it later.

Second, that while loop looks a little dangerous if you have many items on the ground. You could put it in the Step Event instead, and change it to an if() statement to avoid the possibility of the game freezing.

Or what I do with while l loops is :

Code:
safety_check = 0
while ( condition )
{
    // DO STUFF HERE

    // Emergency escape of loop if its going to long
    safety_check++
    if ( safety_check > 100 )
    {
        break;
    }
}
 

Radr

Member
Looks great!

Just two things I noticed - the item creation code - all those prop1, prop2 looks ripe for converting to an array/ds_list. I was curious if you had a reason for doing it that way, as it's kind of hardcoded and would be a little bit of work if you wanted to expand it later.
Thank you! It is kind of a b*tch if I decide I want to add another property (too hardcoded as you put it) and I was afraid of that and the repercussions later on. But throwing it into an array would be a far better and more efficient idea.
I've always felt like data structures would be a better way to handle things in the end, but they seem a lot less intuitive than arrays and I'm not so familiar with them so I generally gravitate towards arrays. I'll definitely make that conversion before I start adding other items to the game.

Second, that while loop looks a little dangerous if you have many items on the ground. You could put it in the Step Event instead, and change it to an if() statement to avoid the possibility of the game freezing.

Or what I do with while l loops is :

Code:
safety_check = 0
while ( condition )
{
    // DO STUFF HERE

    // Emergency escape of loop if its going to long
    safety_check++
    if ( safety_check > 100 )
    {
        break;
    }
}
[/QUOTE]
That was more of just a quick temporary fix to stop items from stacking directly on top of each other for now, but I really like the idea of that safety check so I will probably incorporate that to avoid the inevitable while loop freeze in the meantime.
 

mar_cuz

Member
Thanks a lot! I'll do my best to explain, as there's a lot of code and scripts behind it already, but basically it's an expanded version of Shaun Spaulding's inventory system on youtube. Every item in the game when created gets assigned these stats as variables:

Code:
object          = -1;
sprite          = -1;
equipslot       = -1;
type            = rarity.normal;    //rarity
identified      = true;
//requirements
reqlevel= -1;
reqstrength= -1;
reqdexterity= -1;
reqenergy= -1;
//slot specific
mindamage= -1;
maxdamage= -1;
armor= -1;
attackspeed= -1;
//properties//////////////////////////////////////////////////////////////////////////////////
//magical and up
prop1stat       = -1;
prop1stattext   = -1;
prop1value      = -1;
prop1           = -1;
//magical(sometimes) and up
prop2stat       = -1;
prop2stattext   = -1;
prop2value      = -1;
prop2           = -1;
//rare and up
prop3stat       = -1;
prop3stattext   = -1;
prop3value      = -1;
prop3           = -1;
//rare(sometimes) and up
prop4stat       = -1;
prop4stattext   = -1;
prop4value      = -1;
prop4           = -1;
//rare(sometimes) and up
prop5stat       = -1;
prop5stattext   = -1;
prop5value      = -1;
prop5           = -1;
//rare(sometimes) and up
prop6stat       = -1;
prop6stattext   = -1;
prop6value      = -1;
prop6           = -1;
//Set bonus 1
prop7stat       = -1;
prop7stattext   = -1;
prop7value      = -1;
prop7           = -1;
//Set Bonus 2
prop8stat       = -1;
prop8stattext   = -1;
prop8value      = -1;
prop8           = -1;
//Socketed with 5 rare jewels
prop9stat       = -1;
prop9stattext   = -1;
prop9value      = -1;
prop9           = -1;
//Socketed with 5 rare jewels
prop10stat      = -1;
prop10stattext  = -1;
prop10value     = -1;
prop10          = -1;
//Socketed with 6 rare jewels
prop11stat      = -1;
prop11stattext  = -1;
prop11value     = -1;
prop11          = -1;
//Socketed with 6 rare jewels
prop12stat      = -1;
prop12stattext  = -1;
prop12value     = -1;
prop12          = -1;
//Info
name            = -1;
info            = -1;
unidname        = -1;
unidtooltip     = -1;
//Tooltip
tooltip         = -1;
From there, if you left click an item on the ground, it "picks up" the item and transfers all those variables into 1 of 40 "slots" I have set up as a 2D array that is the in obj_Inventory. The array is initialized like so:

Code:
//Array - First number = Slot in inventory Second Number = Property in Slot
for (i = 0; i < global.inventoryslots; i += 1){
    button[i] = instance_create(0, 0, obj_InventoryButton)      //Creates invisible boxes behind each inventory slot
    button[i].slot = i;                                         //Gives every button a "slot" number variable
    for (j = 0; j < numberofproperties; j += 1){
        global.inventory[i, j] = -1;                            //i = slot j = slot's property
    }
}
so basically, I set my initial number of slots (8 columns x 5 rows = 40 boxes) and each slot contains a value for the properties of the item I listed above. I also create a "button" object for each box, and give it a variable telling it which box it is (from 1-40). The button objects have a lot of Draw Code, but basically each one starts off creating local variables for each property in it's "slot":

Code:
///Draw and Interact with items in inventory
if (showinventory){
    //Gather all variables from the item in that particular slot
    var object          = global.inventory[slot, property.object];
    var sprite          = global.inventory[slot, property.sprite];
    var equipslot       = global.inventory[slot, property.equipslot];
    var type            = global.inventory[slot, property.type];
    var identified      = global.inventory[slot, property.identified];

.........etc....
to get all of the information. It then checks if you've clicked on it at all and if you do it runs a few scripts (again see Shaun Spaulding's inventory tutorial as that's basically exactly what I've done) to empty the slot and set all the properties back to -1, and if anything was on the mouse, i.e "picked up", sets the slot to whatever you had picked up:

Code:
if (abs(mouse_x - x) < 16) && (abs(mouse_y - y) < 16){
        draw_set_alpha(0.15);///////////////Insert rarity down below here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        draw_set_colour(c_yellow);
        draw_rectangle(x - 15, y - 15, x + 15, y + 15, 0);
        draw_set_alpha(1);
        //If you click the box and there is something in it:
        if (click){
            if (object != -1){
                //Make said slot empty
                scr_ItemDropSlot(slot);
            }
            //If you had something picked up on your mouse:
            if (mouseitemobject != -1){
                //Fill the slot with whatever was on the mouse
                scr_ItemPickupSlot(mouseitemobject, mouseitemsprite, mouseitemequipslot, mouseitemtype, mouseitemidentified, mouseitemreqlevel, mouseitemreqstrength, mouseitemreqdexterity, mouseitemreqenergy, mouseitemmindamage, mouseitemmaxdamage, mouseitemarmor, mouseitemattackspeed, slot);
                scr_ItemPickupSlot2(mouseitemprop1stat, mouseitemprop1stattext, mouseitemprop1value, mouseitemprop1, mouseitemprop2stat, mouseitemprop2stattext, mouseitemprop2value, mouseitemprop2, mouseitemprop3stat, mouseitemprop3stattext, mouseitemprop3value, mouseitemprop3, slot);
                scr_ItemPickupSlot3(mouseitemprop4stat...... etc...
            }
and finally if anything was in the slot, picks it up onto your mouse (More variables, all the same stats but for mouseitem):

Code:
//Pick up whatever was in the slot onto the mouse
        mouseitemobject         = object;
        mouseitemsprite         = sprite;
        mouseitemequipslot      = equipslot;
        mouseitemtype           = type;
        mouseitemidentified     = identified;
        mouseitemreqlevel       = reqlevel;

....etc...
a simple right click to identify:

Code:
        //Identify Item
        if (rclick){
            if (object!= -1){
                if (global.inventory[slot, property.identified] = false){
                    global.inventory[slot, property.identified] = true;
                }
            }
        }
    }
and at last, a quick little tooltip when you hover over it:

Code:
//If the slot is not empty
if (object != -1){
    //Draw whatever item is in said slot
    draw_sprite(sprite, 0, x, y);
    if (abs(mouse_x - x) < 16) && (abs(mouse_y - y) < 16){
        //If nothing is currently picked up on the mouse
        if (mouseitemobject == -1){
            //Draw the tooltip
            global.showtooltip = true;
            i = instance_create(mouse_x, mouse_y, obj_Tooltip);
            i.type = type;
            if (global.inventory[slot, property.identified] = true){
                i.tooltip = tooltip;
            }
            else{
                i.tooltip = unidtooltip;
            }
           
        }
    }
}
To handle dropping the items, in my obj_GlobalController, on global left mouse press it checks to see if I'm clicking on something else (such as a menu, another item, an enemy etc), and if not, drops the item at obj_PlayerParent.x, obj_Playerparent.y. To ensure objects never stack right on top of each other, Ive included a while loop in obj_GroundItemParent 's create event:

Code:
while (place_meeting(x, y, obj_GroundItemParent)){
    x = (random_range(x + -48, x + 48));
    y = (random_range(y + -48, y + 48));
}
Hopefully that gives you the gist of it anyways, but if you have any more questions about it let me know and I'll try and help out!
Wow thanks for posting that I have been wanting something like this for ages. Good luck with the rest of your game.
 

Radr

Member
Alright, so over the last couple of days, I've done a lot of under the hood changes to the bulk of my code. Nothing new to show visually, but I've managed to convert 11 scripts (they only held 16 arguments for my 66 variables..... lol....) and probably a few hundred senseless lines of code into 3 scripts and about 40 lines of code. Thank you Indiana Bones for pointing out the array conversion - after converting things like:

Code:
object = -1;
sprite = -1;
prop1 = -1;
prop1text = -1;
prop1value =-1;
...
in several places to things more like:
Code:
for (i = 0; i < numberofproperties; i += 1){
    item[i] = -1;
}
with one enum, I've ensured that I will save a LOT of future hassle and unnecessary work. Everything to do with picking up, moving and dropping items is now done with quick-to-type for loops instead of endless typing. I knew I was missing something! lol

I've also started to create more parent objects to reduce total code among individual items. Where before I had:
obj_GroundItemParent --> obj_LeatherArmor or
obj_GroundItemParent --> obj_HealthPotion
obj_GroundItemParent --> obj_ShortSword
I now I have:
obj_GroundItemParent > obj_BodyParent > obj_LeatherArmor or
obj_GroundItemParent > obj_MiscParent > obj_HealthPotion or
obj_GroundItemParent > obj_WeaponParent > obj_ShortSword

That will also certainly help to reduce unnecessary copy+paste / repeat lines of code and make it easier to add or change properties later on. A little more work to do with cleaning up that code before I can start adding more items, but I've made a lot of progress as far as efficiencies over the last couple days.

Upcoming plans are to iron out my stat generation scripts, as right now they're mostly all working as intended but I will occasionally get "0"s back instead of a stat. When I fix that, I will have to update all my prefixes and suffixes so that it knows to name a +5 strength item " of the Bear" or +13 All Resistances "Shimmering ". Should be pretty quick and easy stuff but I'm pretty tired right now it'll have to wait til tomorrow.

When I get the stats and affixes up and running, I'm going to add in a few more items very slowly. Maybe one or two for each slot (head, amulet, weapon, chest, offhand, gloves, ring1, ring2, belt, boots). If that all goes smoothly the way I'm hoping it will after all this code revision, I should be able to look at implementing the actual "equipping items" factor - to have items that are worn affect the character's stats.

PLENTY of work to keep me busy, but believe me I'll keep you guys posted! :)
 
K

Kenjiro

Guest
Nice work! Love to see how this progresses. I am a huge Diablo fan.
 

Hyomoto

Member
If you go the data structure route, even if you use a ds_map, I suggest making a marco or enum to hold the values positions. Your current method has some benefits because trying to remember which index was which property would be a nightmare. Using enumerators or macros also makes it easier to make space for new values if for some reason you decide to. Lastly, I also recommend putting together a script to call for these values. If you reference them directly it means of you need to change it fix something you'll have to change every instance of it. Using a link, ie: a script, means you only have to change that script. This is especially helpful if you intend to add any special case returns or error checking/handling.
 
Yes, a small tip for enums. I always make the last item in an enum called MAX.

E.g.

Code:
Enum Props
{
    Health,
    Strength,
    ....etc....,
    MAX
}
So when I use a for loop to process the properties, I can just put ¡¡ < Props.MAX as the loop conditional. That way I don't need the extra variable number of properties and don't need to change the code or update number of properties every time I add a new item to the enum.
 
K

ketogenicGG

Guest
This engine looks really good and working. I actually want to test this out.
 

YanBG

Member
Very interesting! I'm making similar rpg but i quickly decided to reduce the Diablo similarities, because i want it to be original work and hopefuly sell the game :D

Now i'm implementing affixes as well and i had to rework my old ds_grid inventory into 2d_array, because i'd need separate grid for each random/interactive stat(like durability).

Also i switched to .csv file for the base items(but i'll explain more in my own topic :D)
 
P

Phantasma

Guest
This looks like it might be amazing. There have been a lot of D2 clones but I've always liked the original the most. Can't wait to see this in the future!
 

Radr

Member
Hey Guys,

Sorry for the massive delay since my last post - as I'm sure you all know, sometimes life happens and we don't get to spend as much time in the lab coding as we'd like to..

Nevertheless, I've done a little bit of work since the last time. Nothing major, mainly just a lot of script revision/simplification because I'm kind of obsessed with making sure everything is as efficient, understandable and easy to modify or add to as possible down the road before I start adding more new stuff in.

I've attached a new video update - you can now equip items. When worn they add to the Player's stats, and when removed they take away the player's stats. It properly swaps the stats if you're equipping a new item on top of another equipped item, and then places the old equipped item back on your mouse so that you can put it back into your inventory.

I'm really happy with this step and the way I've got the items generating now. Looking forward now, I think I will be starting to work on a small basic "town" (nothing flashy yet) with a character stash to store gold and items, and an NPC that allows you to buy and sell items (and eventually give you quests).

Being how similar to the coding I've already done (with my inventory) the stash and store will be, I don't think it will be long before I start looking forward again. At that point, I'm hoping to get into some enemy and spell design, whilst trying to find some kind of "balance" so that things still fun and challenging as you level.

I'm really looking forward to doing the skill trees and seeing how it all works out (I'd like to again take one out of Diablo 2's book as far as sinking points into your skills and combining them with synergy skills to encourage specialization). This will also make it a fairly "gear-dependent" type of game, as you'll really need to stack certain stats to make different builds effective enough to keep fighting harder monster - thus the perfect recipe of endless item hunting that is Diablo.

 
J

JamCamAbreu

Guest
Neat work. I've been a fan of diablo 2 since it came out, and grew up with game maker my whole life too. Neat to see them combined. Keep it up! It's hard to get visibility for projects on here, so I'm glad you're getting some views. Good luck!
 
Top