Alpha Endless RPG

Discussion in 'Work in Progress' started by Kezarus, Sep 3, 2018.

  1. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    LOGO.png


    • Create a Party
    • Train and Expand your party
    • Kill the Black Loners
    • Destroy Evil Centers
    • Share your thoughts! =]

    Hi everyone! This is a project that I started in the end of 2017. So far I did a LOT of things. My game is about freedom, tactics and decisions that matter.

    You will be able to generate a random living world! Medieval high fantasy style. Tired from the world that you played but want the same party? Go on, generate a brand new world to explore with your favorite band of misfits. Day night cicle included. And it changes with the seasons too! And a weather system with clouds and fog.
    World1.jpg
    World2.jpg

    And what if I tell you that this random map is genereted in front of your eyes?


    You can create a party that is composed by different characters. Everything is permited. Want a warrior that plow through enemies with powerful attacks? Check. Want a more cunning and evasive one? You got it. Mages that can harness a destructive power? Or maybe a more defensive and healing oriented one? Maybe a support druid kind? You got it covered! Even a mix between all of this is possible (and can even be VERY powerful). There is still five races to pick. Oh, and appearence is customizeable for each character too! Graphics by Oryzano.
    Party.jpg

    The rules are simple and are based on:
    • Small numbers (3 Attributes ranging from 0 to 5, Health 10 to 20 and so on)
    • Rock-Paper-Scissors mind set (a tool, skill and strategy for each case)
    • Less is more mentality (texts and descriptions are reduced to be in a line or less)
    • You can check Rules, Skills and Items on these links =]

    There are 150+ skills from combat to magic. Each skill is meaningful, granting a tangible advantage. Each character can learn up to 18 of those skills. Each skill will be trained on a town for a price.

    There are 118 items among weapons, armor, arcane focus and even firearms! But there is NO ULTIMATE WEAPON, each one is a tool and is good in some situations and bad in others. Combat is turn based. Inspired on Battle Brothers and XCOM. But it is more than point and click. You want to hit an enemy? You have to do a simple and fast minigame based on character animation.

    Animations! Many animations based on weapon and some skills.
    Holy.gif

    Most of the combat is developed, even a computer adversary is already up and running. The map generator is very good already and the living world is done! Towns grow as time goes by. Buildings are destroyed and constructed. And they have a direct impact on what can be bought in the market.

    But this is a work of love. I find pleasure to develop each feature. I have a Backlog and a Diary for this project. Me and my brother are commited to do this at the top of our capabilities. We even hired Oryzano to do beautiful sprites to the game. Yep, it's a three people team. I code, draw (kind of), do game design, find music and edit sounds. My brother does game design, read through boring documentation and test everything in a light-speed fashion. It will be an amazing game, something that I search everywhere and didn't find. Something that I will play. And hopefully, something that will entertain a lot of people that love indie games!

    Cheers!
    Kezarus =]
     
    Last edited: May 18, 2019
    Xor, Gold Mammoth, Bentley and 12 others like this.
  2. curato

    curato Member

    Joined:
    Jun 30, 2016
    Posts:
    176
    If everything is random, is there some sort of random story to the world as well?
     
    Kezarus likes this.
  3. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hello @curato! Yes, I plan to do just that. However I don't know (yet) how can I place plot points that intertwine with the world. I will have to study some writing techniques before do that. But it's planned! =]

    There will be, nonetheless, relations between factions and the players. Factions can fight among each other without the player intervention. Or even form alliances. Or fight the player. Or a complete mix of everything. There will be also events that trigger some major changes in the map.
     
  4. Poddington

    Poddington Member

    Joined:
    Jul 15, 2016
    Posts:
    13
    I like the map. The result is similar to what mine looks like after generating, well on one particular concept i keep re-visiting. I like it and seeing someone who has progressed much further than me makes me want to go back and continue developing. I'm not doing high fantasy, although I haven't settled on a theme, just the map result is really good. I never settled on a quick way to do rivers so that was where I stopped, but you've given me a burst of inspiration and a face palm that i didn't think of it. It might sound silly, but the map impresses me. Wish you all the best.
     
    Kezarus likes this.
  5. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    @Poddington, wow, I'm very glad that my work inpired you! Man, let's talk about map making then. I can tell you all the things that I tried and what I actually do on Endless. I'm pretty proud of the result myself. And just 'cause you are so interested I'm going to upload NOW a video of the actual game that demonstrates the making of the map in front of the player's eyes.

    Youtube link

    Again, I will be glad to speak to you about the details. =]

    Cheers!
     
  6. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    That looks very interesting, in the video your generation passes seem pretty fast, how big is the map? Is everything drawn as tiles or there are objects(for rocks, mines etc)?
    For my rpg i'm trying chunks because the world grid is too big.
     
    Kezarus likes this.
  7. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    My grid, if I recall correctly, is 150x150. Not that big and I use tiles for terrain and objects for towns, mines, etc. Most are calculated inside a grid. =]

    I use a mix of celular automata, flood fill and path finding. Fractals are WAY faster, but I didn't like the result, however it could fit your map needs.
     
    YanBG likes this.
  8. Bearman_18

    Bearman_18 Member

    Joined:
    Jan 24, 2018
    Posts:
    157
    Downloaded alpha! Will play it soon!
     
    Kezarus likes this.
  9. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Thanks @Bearman_18, share your thoughts with me afterwards. =]
     
  10. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Yesterday I was talking to my brother (the other game designer) and we are VERY close to finish most tasks of Combat Module. What will be left are things like small changes on appearance and details. But the functionalities will be all there! =D

    We are still hunting down bugs and we love to receive some feed back. Help us and spread the word about Endless RPG.

    After the Combat Module we will focus heavily on the World Module. =]
     
  11. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Sounds good! About marketing, dev forums are not the best place to look for exposure.
     
    Kezarus likes this.
  12. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Working with heraldry and path finding for roads. Had to do my own A*.

    Now, have to work with some graphics and how it's displayed. =]

    Untitled.jpg
     
  13. spe

    spe Member

    Joined:
    Aug 25, 2016
    Posts:
    101
    Very interested in this. Are these the final graphics or were you going to do something else with it eventually?

    Also I think it'd be pretty cool (and easy) to add some tundra areas along the upper edge of the map. Just an idea. :)
     
    Kezarus likes this.
  14. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Heraldry looks nice! Did you base the A* on something from these forums?
     
    Kezarus likes this.
  15. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hi spe! I'm using Kenney sprites to do buildings, but I plan to change the perspective to face front, not 3/4, and I will have come up with some original ideas too. But, the color pallete will be just like what you are seeing. If you are talking about the heraldry, yep, probably final. Maybe a new brush here and there. I got the ideas from wiki real heraldry (color and forms) and sprites from game-icons.net

    I had some some other biomes like woodlands(dry forests), plateau(dry mountains), tropical forests and they don't add that well to the map. Too much graphic complexity. But maybe I give it another shot with tundra too. Noted! =]
     
  16. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Thanks YanBG! =D

    I tried to use a solution from here... didn't work out. Then I used wiki's solution... didn't turn out thaaaaaat good. Then I had to do my own tweeks and slaps in the code for accuracy and performance. It's not a master piece, but works for me (and prety fast too). I'm sending the code below, feel free to say anything about it or give any hints for improvement. =]


    And this is what I came up with, it's in Alarm 1 of objRoadFinder:
    Code:
    ///REAL PATH FIND
    while( !ds_list_empty(openList) ){
    
        var arr, PosX, PosY, wOpen, wScore, wHeuristic;
        var arrCurrent;
        
        //FIND SMALLEST SCORE IN OPEN LIST
        var lesserScore = 1000000, lesserIndex=0;
        var lstSize = ds_list_size(pathList);
        for(var i=0; i<lstSize; i++ ){
            arr = pathList[| i];
            if( arr[PathFind.OpenClose] == true ){
                if( arr[PathFind.Score]+arr[PathFind.Heuristic] < lesserScore ){
                    lesserScore = arr[PathFind.Score]+arr[PathFind.Heuristic];
                    lesserIndex = i;
                }
            }
        }
        arrCurrent = pathList[| lesserIndex];
        PosX = arrCurrent[PathFind.posX]; //THIS IS THE CURRENT NODE X
        PosY = arrCurrent[PathFind.posY]; //THIS IS THE CURRENT NODE Y
    
        //CHECK IF ARRIVED
        if( PosXEnd == arrCurrent[PathFind.posX] ){
            if( PosYEnd == arrCurrent[PathFind.posY] ){
                if( ds_list_empty(returnList) ){
                    //RECOSNTRUCT PATH ON ALARM 2
                    alarm[1] = -1;
                    ds_list_add(returnList, arrCurrent);
                    event_perform(ev_alarm, 2);
                }
                exit;
            }
        }
        
        //REMOVE FROM OPEN LIST
        PathFindRemoveFromOpen(pathList, openList, lesserIndex);
        //ADD TO CLOSE LIST
        var Lookup = string(PosX) + "*" + string(PosY);
        ds_list_add(closeList, Lookup);
        
        //ADD NEIGHBORS
        var Neighbors;
        Neighbors[0, 0] = PosX+1; Neighbors[0, 1] = PosY+0;
        Neighbors[1, 0] = PosX-1; Neighbors[1, 1] = PosY+0;
        Neighbors[2, 0] = PosX+0; Neighbors[2, 1] = PosY+1;
        Neighbors[3, 0] = PosX+0; Neighbors[3, 1] = PosY-1;
        
        for( var i=0; i<array_height_2d(Neighbors); i++ ){
            //VERIFY BOUNDARIES
            if( Neighbors[i, 0] < 0 ){ continue; }
            if( Neighbors[i, 1] < 0 ){ continue; }
            if( Neighbors[i, 0] >= global.MapSize ){ continue; }
            if( Neighbors[i, 1] >= global.MapSize ){ continue; }
            
            //IGNORE RESOURCES
            if(global.ResourceGrid[# Neighbors[i, 0], Neighbors[i, 1]] != -1){
                continue;
            }
            
            //IGNORE OCEAN
            if(global.WorldGrid[# Neighbors[i, 0], Neighbors[i, 1]] == WorldTile.Ocean){
                continue;
            }
    
            //DON'T ADD IF ALREADY IN CLOSE LIST
            Lookup = string(Neighbors[i, 0]) + "*" + string(Neighbors[i, 1]);
            if( ds_list_find_index(closeList, Lookup) != -1 ){
                continue;
            }
    
            wScore = (arrCurrent[PathFind.Score]/1)+
                PathFindRoadScore(Neighbors[i, 0], Neighbors[i, 1], PosXEnd, PosYEnd);
            wHeuristic =
                PathFindRoadHeuristic(Neighbors[i, 0], Neighbors[i, 1], PosXEnd, PosYEnd);
    
            //IF NOT IN OPEN LIST
            if( ds_list_find_index(openList, Lookup) == -1 ){
                //ADD TO OPEN
                PathFindAddToOpen(pathList, openList,
                    Neighbors[i, 0], Neighbors[i, 1], wScore, wHeuristic, PosX, PosY);
            }else{
                //FIND THE OPEN SCORE
                var indexer = 0;
                var lstSize = ds_list_size(pathList);
                for(var j=0; j<lstSize; j++ ){
                    var wArr = pathList[| j];
                    if( wArr[PathFind.OpenClose] == true ){
                        if( wArr[PathFind.posX] == Neighbors[i, 0] &&
                            wArr[PathFind.posY] == Neighbors[i, 1]
                        ){
                            indexer = j;
                        }
                    }
                }
                var wArr = pathList[| indexer];
                
                //IS THIS PATH SHORTER?
                if( wArr[PathFind.Score] > wScore ){
                    //SUBSTITUTE
                    wArr[PathFind.Score] = wScore;
                    wArr[PathFind.Heuristic] = wHeuristic;
                    wArr[PathFind.LastPosX] = PosX;
                    wArr[PathFind.LastPosY] = PosY;
                    pathList[| indexer] = wArr;
                }
    
    
            }
        }
        
    }
    
    //AVOID ISLAND SITUATIONS
    if(ds_list_empty(openList)){
        instance_destroy();
    }
     
    YanBG likes this.
  17. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hi! Here is a new demo video about the randomly generated map! =]

    Please share your thoughts. I would love some feedback!

     
    YanBG likes this.
  18. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    And a video about heraldry! =]

     
    YanBG likes this.
  19. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Did you draw the heraldy icons(wolf heads etc)? They look great! The shields and colors could use more depth or shine/reflections. But the procedural generation is pretty good.
     
    Kezarus likes this.
  20. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    @Lucia I'm probably not the best guy do do a gameplay video, but I am going to try. =] Also, the combat is pretty rounded up already!

    @YanBG, all my icons are from https://game-icons.net. I'm going to try and add some reflections on the shield. Thanks!
     
    YanBG likes this.
  21. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Gameplay video is out! =]

     
  22. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hi @YanBG, I did some reflections on the heraldry. What do you think? =] Untitled.png
     
    YanBG likes this.
  23. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Yeah looks better. Why do you make the symbols in similar color as the background? They stand out less that way. In addition to the reflection, add shading to the side, to make it look more curved like a shield:
    [​IMG]

    Not sure about the black outline either. You could use gray metalic color or make it thicker on one side, to look like there is angled depth.
    [​IMG]

    Some more references.
    [​IMG]

    Btw how do you change the colors, with a shader?
     
  24. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hmmmm. I used a soft gradient from the middle to the borders to do that effect. I tried do paint it half darker, half light and it doesn't work out so good.

    Maybe I could add a riveted border above all and try the half dark again.

    I'm using just image_blend and black and white sprites. =]
     
  25. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Yep, just did that. The riveted border will be a lot o chngaes on code to do. But I changed the gradient to a half darker pattern.
    TEST.png

    You can also download the game here if you like. The combat system is pretty much complete. =]
     
  26. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    I wanted to finish checking several A* tutorials before answering you. But here is my issue: the build-in mp_grid lags when there are too many cells/larger world(less than ~200x200 is fine) and multiple characters. I'm thinking the A* would do the same, maybe a bit more optimized but still.
    So i'd have to pathfind only a smaller radius around the enemies(they'll lose aggro), but there are mazes too. I wonder how older games like DIablo 2 did it without lag.

    Did you base it on Breadth-first or Dijkstra?
     
  27. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Old games probably did like you did. Small aggro radius. I noticed that heuristics is a LOT important too. And, sometimes, when the path gets too complicated (more than 100 open nodes), I cut it short and start a new path when it arrives at half of the way.

    I used A* and Dijkstra. Most of the code is from the wiki. The issue with Game Maker lists is that they aren't that good to fast locate a node, so I had to use some techniques to improve that.

    Well, here is all my pathfind code. I hope it easy things up for others. And, if anyone sees room for improvement please tell me here. =]

    PathFindTroop( X Ini, Y Ini, X End, Y End )
    Code:
    ///PathFindTroop( X Ini, Y Ini, X End, Y End )
    
    //LIST CREATE
    var pathList = ds_list_create();  //the most important
    var fullList = ds_list_create();  //to trace back
    var openList = ds_list_create();  //as fast finders
    var closeList = ds_list_create(); //as fast finders
    
    //JUST A START
    var Retorno = "";
    var PosX = clamp(argument0 div TileSize, 0, global.MapSize);
    var PosY = clamp(argument1 div TileSize, 0, global.MapSize);
    var PosXEnd = clamp(argument2 div TileSize, 0, global.MapSize); //target x
    var PosYEnd = clamp(argument3 div TileSize, 0, global.MapSize); //target y
    
    var Score = PathFindTroopScore(PosX, PosY);
    var Heuristic = PathFindTroopHeuristic(PosX, PosY, PosXEnd, PosYEnd);
    var Stop = false;
    
    //BEE LINE IF WATER
    var FinalPlace = global.WorldGrid[# PosXEnd, PosYEnd];
    if( FinalPlace == WorldTile.Ocean || FinalPlace == WorldTile.Shallow ){
        Retorno = string(PosXEnd)+"*"+string(PosYEnd)+"|" + string(PosX)+"*"+string(PosY)+"|";
        return Retorno;
    }
    
    //ADD TO OPEN
    PathFindAddToOpen( pathList, openList, fullList, PosX, PosY, Score, Heuristic, -1, -1 );
    
    //REAL PATH FIND
    while( !ds_list_empty(openList) ){
    
        var arr, wScore, wHeuristic;
        var arrCurrent;
      
        //FIND SMALLEST SCORE IN OPEN LIST
        var lesserScore = 1000000, lesserIndex=0;
        var lstSize = ds_list_size(pathList);
    
        for(var i=0; i<lstSize; i++ ){
            arr = pathList[| i];
            if( arr[PathFind.Score]+arr[PathFind.Heuristic] < lesserScore ){
                lesserScore = arr[PathFind.Score]+arr[PathFind.Heuristic];
                lesserIndex = i;
            }
        }
        arrCurrent = pathList[| lesserIndex];
        PosX = arrCurrent[PathFind.posX]; //THIS IS THE CURRENT NODE X
        PosY = arrCurrent[PathFind.posY]; //THIS IS THE CURRENT NODE Y
    
        //TOO MANY OPEN NODES, CUT IT SHORT!
        if(lstSize > 100){
        //if(lstSize > 150){
            Stop = true;
        }
      
        //CHECK IF ARRIVED OR STOP
        if( PosXEnd == arrCurrent[PathFind.posX] || Stop ){
            if( PosYEnd == arrCurrent[PathFind.posY] || Stop ){
                var wLastPosX = arrCurrent[PathFind.posX];
                var wLastPosY = arrCurrent[PathFind.posY];
                Retorno += string(wLastPosX)+"*"+string(wLastPosY)+"|";
                var StopReturnX = wLastPosX;
                var StopReturnY = wLastPosY;
    
                //RECOSNTRUCT PATH TO RETURN
                while(true){
                    //FIND THE PATH
                    var indexer = -1;
                    var lstSize = ds_list_size(fullList);
    
                    for(var j=lstSize-1; j>=0 && indexer==-1; j--){
                        var wArr = fullList[| j];
                        if( wArr[PathFind.posX] == wLastPosX &&
                            wArr[PathFind.posY] == wLastPosY
                        ){
                            indexer = j;
                        }
                    }
                    arrCurrent = fullList[| indexer];
                  
                    wLastPosX = arrCurrent[PathFind.LastPosX];
                    wLastPosY = arrCurrent[PathFind.LastPosY];
                  
                    //RETURN ON LAST NODE
                    if( wLastPosX == -1 && wLastPosY == -1 ){
                        //DESTROY LISTS
                        ds_list_destroy(pathList);
                        ds_list_destroy(fullList);
                        ds_list_destroy(openList);
                        ds_list_destroy(closeList);
                      
                        //RETURN
                        return Retorno;
                        /*if( Stop ){ //NOT REALLY AT THE END
                            return
                                PathFindTroop(
                                    StopReturnX*TileSize,
                                    StopReturnY*TileSize,
                                    PosXEnd*TileSize,
                                    PosYEnd*TileSize)
                                + Retorno;
                        }else{
                            return Retorno;
                        }*/
                    }else{
                        Retorno += string(wLastPosX)+"*"+string(wLastPosY)+"|";
                    }
                }
            }
        }
      
        //REMOVE FROM OPEN LIST
        PathFindRemoveFromOpen(pathList, openList, lesserIndex);
        //ADD TO CLOSE LIST
        var Lookup = string(PosX) + "*" + string(PosY);
        ds_list_add(closeList, Lookup);
      
        //ADD NEIGHBORS
        var Neighbors;
        Neighbors[0, 0] = PosX+1; Neighbors[0, 1] = PosY+0;
        Neighbors[1, 0] = PosX-1; Neighbors[1, 1] = PosY+0;
        Neighbors[2, 0] = PosX+0; Neighbors[2, 1] = PosY+1;
        Neighbors[3, 0] = PosX+0; Neighbors[3, 1] = PosY-1;
      
        for( var i=0; i<array_height_2d(Neighbors); i++ ){
            //VERIFY BOUNDARIES
            if( Neighbors[i, 0] < 0 ){ continue; }
            if( Neighbors[i, 1] < 0 ){ continue; }
            if( Neighbors[i, 0] >= global.MapSize ){ continue; }
            if( Neighbors[i, 1] >= global.MapSize ){ continue; }
          
            //DON'T ADD IF ALREADY IN CLOSE LIST
            Lookup = string(Neighbors[i, 0]) + "*" + string(Neighbors[i, 1]);
            if( ds_list_find_index(closeList, Lookup) != -1 ){
                continue;
            }
    
            wScore = arrCurrent[PathFind.Score]+
                PathFindTroopScore(Neighbors[i, 0], Neighbors[i, 1]);
            wHeuristic =
                PathFindTroopHeuristic(Neighbors[i, 0], Neighbors[i, 1], PosXEnd, PosYEnd);
    
            //IF NOT IN OPEN LIST
            if( ds_list_find_index(openList, Lookup) == -1 ){
                //ADD TO OPEN
                PathFindAddToOpen(pathList, openList, fullList,
                    Neighbors[i, 0], Neighbors[i, 1], wScore, wHeuristic, PosX, PosY);
            }else{
                //FIND THE OPEN SCORE
                var indexer = -1;
                var lstSize = ds_list_size(pathList);
    
                for(var j=lstSize-1; j>=0 && indexer==-1; j--){
                    var wArr = pathList[| j];
                    if( wArr[PathFind.posX] == Neighbors[i, 0] &&
                        wArr[PathFind.posY] == Neighbors[i, 1]
                    ){
                        indexer = j;
                    }
                }
                var wArr = pathList[| indexer];
              
                //IS THIS PATH SHORTER?
                if( wArr[PathFind.Score] > wScore ){
                    //SUBSTITUTE
    //show_debug_message("SUBSTITUTE " + string(wScore) );
                    wArr[PathFind.Score] = wScore;
                    wArr[PathFind.Heuristic] = wHeuristic;
                    wArr[PathFind.LastPosX] = PosX;
                    wArr[PathFind.LastPosY] = PosY;
                    pathList[| indexer] = wArr;
                }
            }
        }
    }

    PathFindAddToOpen( pathList, openList, fullList, PosX, PosY, Score, Heuristic, LastPosX, LastPosY )
    Code:
    ///PathFindAddToOpen( pathList, openList, fullList, PosX, PosY, Score, Heuristic, LastPosX, LastPosY )
    
    var pathList = argument0;
    var auxList = argument1;
    var fullList = argument2;
    var PosX = argument3;
    var PosY = argument4;
    var Score = argument5;
    var Heuristic = argument6;
    var LastPosX = argument7;
    var LastPosY = argument8;
    
    var Lookup = string(PosX) + "*" + string(PosY);
    
    ds_list_add( auxList, Lookup );
    ds_list_add( pathList,
        array_ini(PosX, PosY, Score, Heuristic, LastPosX, LastPosY) );
    ds_list_add( fullList,
        array_ini(PosX, PosY, Score, Heuristic, LastPosX, LastPosY) );

    PathFindTroopScore( PosX, PosY )
    Code:
    ///PathFindTroopScore( PosX, PosY )
    var PosX = argument0;
    var PosY = argument1;
    var Score = 10;
    var SquareSpeed = global.MoveGrid[# PosX, PosY];
    
    //COST SCORE BLOCK
    if( SquareSpeed > 1 ){ //PREFER ROADS OR EASY WAYS
        Score = (2 - SquareSpeed)*0.65; //MOVE COST
    }else
    if( SquareSpeed >= 0.5 ){ //NORMAL
        Score = (2 - SquareSpeed)*1.5; //MOVE COST
    }else{//HIGH COST FOR VERY SLOW
        Score = (2 - SquareSpeed)*3; //MOVE COST
    }
    
    //Score = (2 - SquareSpeed)*1.5;
    
    return Score;

    PathFindTroopHeuristic( PosX, PosY, PosXEnd, PosYEnd )
    Code:
    ///PathFindTroopHeuristic( PosX, PosY, PosXEnd, PosYEnd )
    var PosX = argument0;
    var PosY = argument1;
    var PosXEnd = argument2;
    var PosYEnd = argument3;
    var Heuristic = 0;
    
    //HEURISTIC
    Heuristic = point_distance(PosX, PosY, PosXEnd, PosYEnd)*1.0;
    
    return Heuristic;

    Inside of objPeople (or something that you want to move), on the Step Event
    Code:
    ///MOVE
    if( !ds_list_empty(lstPath) ){
        if( global.Paused ){
            speed = 0;
        }else{
            var SquareSpeed = global.MoveGrid[# x div TileSize, y div TileSize];
            MoveSpeed = BaseMoveSpeed * SquareSpeed;
      
            //TOO CLOSE TO DESTINATION
            if( point_distance(x,y,MoveTargetX, MoveTargetY) <= MoveSpeed ){
                ds_list_delete( lstPath, 0 ); //CLEAR NODE
              
                if( !ds_list_empty(lstPath) ){ //IF NOT EMPTY
                    var arr = lstPath[| 0]; //INIT VARS
                    MoveTargetX = arr[0];
                    MoveTargetY = arr[1];
                }else{
                    speed = 0;
                }
            }else{
                move_towards_point( MoveTargetX, MoveTargetY, MoveSpeed );
            }
        }
    }
     
    YanBG likes this.
  28. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Do you mean a separate list with the neighbours for each node? Because that's how i have it right now as substitute for vectors. The nodes are in 2d array with values for x,y,parent,ostacle,visited.
    Tbh for me is a bit difficult to read without the GM colors.
     
  29. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Amazing art package from @Nikky Oryzano. Thanks for the amazing job, man! =] Weapons and body are ok! Armors are next.

    upload_2018-11-25_18-27-54.png

    upload_2018-11-25_18-28-22.png

    upload_2018-11-25_18-29-53.png

    upload_2018-11-25_18-30-14.png
     
    YanBG likes this.
  30. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    (I am not dead... yet!)

    Last months were pretty busy. Most of the sprites on combat are already done, thanks to @Nikky Oryzano.

    The living world is running good. The initial steps to start a new game (with no debug needed) is completed.

    Shops, training skills and recruit new chars are set and ready.

    The very start of the game is a little bit too difficult for my taste. We are improving that and then a real good Alpha will be released! =D

    Stay tuned. ;):D
     
    YanBG likes this.
  31. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Yeah i was wondering where are you lol

    So, did i ask that...have you started the marketing campaign?
     
    Kezarus likes this.
  32. elijahmmin

    elijahmmin Member

    Joined:
    Feb 20, 2018
    Posts:
    7
    This looks awesome! I've tried doing random generation multiple times, but can't seem to get anywhere with it. Keep up the great work.
     
    Kezarus likes this.
  33. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hi Yan! Sorry for the delay. I was changing areas at my job and doing a lot of stuff on the game.

    About the marketing... that's a no. =] I think I need to do lot more on the game to make it good for shipping. But if you happen to know someway good to market the game I would appreciate the advice. =D
     
  34. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Not really, i'm underdeveloped on that(don't build a twitter following etc). I tried contacting publishers to help me out with QA, design and even coding(they have teams) but it seems they want a nearly finished game and with better graphics. Also if it's for the grand strategy genre, might prefer a more historically accurate game.

    For terrain, i'm using perlin. Split into provinces with voronoi.
     
  35. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Well thank you! I am mostly using celular automata, but most have some tweeks here and there to work properly.

    I've messed around fractals and what not, but this last algo gives me the best result. =]
     
    elijahmmin likes this.
  36. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hello there, beautiful people! I am planning to do a properly alpha release, but I have a METRIC TON of changes for you guys.
    So, I am posting a download here: Download. Don't forget to send a feedback!

    There is so many things done here that it's hard to enumerate. But this is a short description:
    • Combat is finished! For now on, just some balancing and little improvements;
    • Living World is finished! Towns grow, as Evil Centers too. They generate troops and merchants travel the land avoiding bandits;
    • Seasons! Dynamic Weather! World Calendar!
    • Lots of new sprites by Nikky Oryzano!
    • Town Shops! Buy stuff! Train Skills and Attributes!
    • End of Combat! Loot!
    • Simple Quests!
    We are moving towards the end of it all! Sorry for the lack of updates. I will try update the 1st post to reflect what is done.

    If you can, send your feed back. I assure you that I will reply to that. Your opinion is very important to this game in the making!

    Cheers!
    Kezarus
     
    YanBG likes this.
  37. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    When i pressed play i got that:

    [​IMG]
     
  38. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hmmm, I think you have old save games. Can you delete the files? Should I place a fail safe there? Hmmm.
     
  39. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Yeah, i deleted the old folder in local and worked.
    You should add because of GM's sandboxing and most people don't know where to look for the saves.

    1) Did i tell you to add default party?
    2) Not a huge fan of the visible terrain creation. You might hide it in the final version.
    3) When i take delivery quest, gray it out from the available ones. Also why can't a town give both delivery and bounty at the same time?
    4) Fix the info/tooltip on the inventory cell not the mouse, now it slides around too much.
    5) Are you going to add fast travel?
    6) When opened and closed the menu, i couldn't move the party on the world map. Save and load fixed it.
    7) It's a bit difficult to click on the towns and open their menu.
     
    Last edited: Mar 12, 2019
  40. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Yey! Thanks for the reply! =D

    I will address the save games and check if they are valid or not. This is just happening 'cause it have more variables than before. It will not happen on the final release. Hmmm.

    1) Ok, good! It is possible, but are creating a party not easy enough?
    2) Really? What can I do better on that? Some people liked the generation.
    3) Amazing, will do the gray out. About the number, there will be only one quest at a time by design. Like Battle Brothers, not like Skyrim. =]
    4) I didn't quite get what are you saying there. Can you explain it differently?
    5) Nopz. The fun is in going from place to place. Do you think it takes too long now?
    6) Hmmm, nice. Gonna squash that bug.
    7) Ooooook, will expand the bbox. =] Will it fix it or do you have something else in mind?

    Dude, amazing feedback. Thank you so much. I would like to ask you other questions too:

    8) Combat, are the minigames good enough? Is the flow good?
    9) Skills and progression? XP gain? Share your thoughts =]
    10) Weapons and Armors are clear and good?
    11) Are customization of hair and features nice? And races (graphic wise)?
    12) Did you chase the Loners? The black dressed people on the map.
    13) Did you saw an Evil Center? Are they clear? Did you destroyed one?
    14) Is the game too difficult?

    Cheers!
    Kezarus
     
  41. CMAllen

    CMAllen Member

    Joined:
    Mar 2, 2017
    Posts:
    849
    Just a suggestion, but it's a good habit to get into -- make sure your save files have some sort of versioning method to them, so that your game can know what file format to expect and how to load older file versions, restructuring the data and updating it to the newest one. This is how all AAA projects do it. It's not a 'huge deal' for a game that's still in development, but if you intend to continue to build and expand on your project after it's initially finished, it would be unwise, shall we say, to throw away your users' progress with each update.
     
  42. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Gotcha, but you might have patches after release too, no?

    1) True, 4 clicks but there might be more stats later? Not a big deal, just some of the stuff people expect nowadays.
    2) Oh i mean more like a loading screen instead? Some players think games are better when most of the systems are hidden. But it could just personal opinion.
    3) Sure, i wouldn't make it too much like Battle Brothers, people would get to compare them and that 1 quest thing i didn't like in BB. I mean letter(errant boy)/delivery is not like a contract, right?
    4) The tooltip position follows the exact mouse position, make it clamped at each cell, so while the mouse moves inside the same cell the text stays at the same place.
    5) Well, it's needed for the testing at least, like a cheat.
    7) What if there is enemy party at the spot too? Which has priority?
    8) Started my 1st combat, it felt kind of slow, with very few and small icons/buttons on my pc screen(you shouldn't have a mobile feel if you target Steam). The characters were too big on the other hand. And i couldn't attack with the first guy who had a staff, his action points were only enough to walk to the enemy? Is there autocombat like in Heroes 3?
    10/11) I like them, crafting and resources look cool too. There is no interaction with the mines etc objects on the world map?
    World map terrain and party icon graphics need improving.

    Sorry i played i few minutes, that's why my feedback stopped there. Will check the other questions for the next time though.

    # Also there is no escape/close button during battle and town interaction.
    You could make the music to stop at sometimes too, play only if enemies approach?

    The game is very interesting and i'll keep an eye on the progress!
     
    Last edited: Mar 12, 2019
    Kezarus likes this.
  43. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Most probably yes, but the error happend because I added new variables that didn't exist in the past. I will not add anything else to the save (not in the way I did, for the matter). =]

    1) Yep, Default Party on the Backlog;
    2) So, the New Game generates the map before your eyes. The Load function is fast and don't display the world creation again;
    3) I think it is a design decision. On Skyrim I had too much to keep track of. BB have just one and it was good for me. Endless will have some other plot lines that will show, like a parallel quest. But the Town Quest will be one at a time;
    4) Hmm, fixed position tooltip in relation to the Item. Ok, the function that I made already supports this, gonna place that on the Backlog too. Should I do that for Skill buttons too? It's the same function; =]
    5) Never felt the need for that. Hmmm, are you using the speed up? You can double the game speed by hitting the 2 key;
    7) The enemy is the priority;
    10/11) We though on placing a gather function on ores, groves, etc. But then we cancelled all that. But you can query map objects with right-click. All structures and minerals will be redone by Oryzano; =]

    Ouch, hahaha. You mean the attack buttons? That became tiny when I changed my monitor. I am thinking of a solution... but nothing came to mind so far. Any ideas?

    The first round is to close in. You can't attack now, but later you can get a Skill to move far away and do a Swift Attack.

    Auto combat IS possible, but I don't think it will be a desireable feature. I would hate that for BB or XCom.

    So! During battle there is the first button on the left that is Flee. There is no penalty for fleeing combat. But in Town... yes, I need to put a button there. Wops. =]

    I have a music box with 5 musics for combat and 5 for World. The deploy there have only 1 each just for the sake of space and simplicity. Maybe more musics helps?

    Thanks a lot for the feedback, man! Appreciate that. So many valuable infos on wht you said. Gonna try to update here more often. If you have more considerations please make them. I will try to address each one.

    The game is not final, but the features that it have, have to be solid and good. We will still do kind of a dynamic story, plots and villans. Interest Points will be done to. Maybe dungeons (we don't know yet).

    What do you think will add more to the game? =]


    Cheers!
    Kezarus
     
  44. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    Yeah, probably all like that.
    I did notice it, add x4 too? Btw BB has ports too, where you can pay for fast travel.
    You can scale them up with the window size.
    I used flee, but it's not instant and you have to wait for the enemy turn?
     
    Kezarus likes this.
  45. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Yeah... I tried, but without V-synch the game looks like garbage. And the speed is bounded to room_speed.

    I can double the size, but I don't know how it's going to perform on 1000x700. Will have to try.
    Our benchmark is the good olde Battle Brothers. Their buttons are tiny, but that is no excuse... gonna experiment on size anyway.


    Thanks again!
    Kezarus
     
  46. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    There is a new version up!

    @YanBG I did some of the things that you advise me. I will do the default party yet. The buttons got a little bit too gigantic in my opinion. What do you think? Maybe grow from 50%(original) to about 75%? I did 100% on this version.

    If it's interesting to anyone, I am making my dev diary avaliable down below. It's mostly in english, but some parts are in portuguese.
    DEV DIARY
     
  47. YanBG

    YanBG Member

    Joined:
    Jun 25, 2016
    Posts:
    570
    You got a screenshot? Maybe scale if as a percentage? 1920x1080 is x2 from 960x540

    Btw idon't use different objects for GUI, but draw at specific coordinates part of a menu background.
     
  48. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    I finished all the 13 Black Magics on the weekend. Sound, animation, effects, everything.

    Yesterday I did a BIG brain storm with my brother about Interest Points (locations to visit on the map) and Big History Plots (End of the World, End of Magic, kind of brainstorm).

    But I am still not happy about it. I want chars that you can interact with and interact with each other. Still thinking.
     
    YanBG likes this.
  49. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Made some finishing touchs in the game in the past days. Everything is working fine, main concern now is the quest system and player interaction.

    Should I do a video about the current state of the game? =]
     
  50. Kezarus

    Kezarus Member

    Joined:
    Jan 14, 2018
    Posts:
    128
    Hi everyone! I did some changes to the original post to reflect the actual state of the game.

    I think most of it is completed and we have just the dynamic and big quests left to do.

    I would really like your opinion about the game. Download it and share your thoughts! =]
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice