Jump to content
Site Stability Read more... ×
  • Advertisement


  • Content Count

  • Joined

  • Last visited

  • Days Won


A4L last won the day on January 15

A4L had the most liked content!

Community Reputation

53 Neutral

About A4L

  • Rank

Personal Information


  • Twitter
  • Github

Recent Profile Visitors

2696 profile views
  1. G'Day.... So, I have gotten a lot sidetracked recently!! A number of things have been competing for my time! For starters when I started to learn to programme, I found the time by scaling back my model painting. By model painting, I mean miniature painting. You know, little sci-fi armies and stuff. Yes, I am a geek! So what? What to fight about it?! I recently bought some fancy new paint. These are a cool new minimal paint line that focuses on colour mixing and produces a great mat finish. I have been spening a lot of time playing with them more than working on my project! What is so great about these paints is that instead of trying to sell you a shade designed for a single purpose from a paint line with 200 pots in it, this line is tiny. In fact, the entire line is in this image above. What they have done is work hard to make pure liquid pigments (so no grain) with a hyper mat finish that is designed specifically for you to mix your own colours on a pallet. So trying to bring traditional painting and colour theory to game art. So yeah.. been painting a ton of stuff instead of sitting at my computer! Also, I decided to update, read "rebuild" one of my old mods for TableTop Simulator. For those of you that do not know, TTS is a "virtual tabletop" that runs in Unity. Basically, "game" made in unity that is designed specifically to be modded. All it really does is run a physics engine and provide a number of tools to allow you to assign bitmaps to things and move them around. It uses a lot of stuff to make it work, but the idea is that it creates a virtual environment to play boardgames online with your friends and provides tools to allow you to scan your board games into images and use them inside the engine. There is a lot of talk in the boardgame community on the legality of virtual tabletop apps (there are a huge number of them) but in general most boardgame companies do not seem to mind them, and even actively encourage them, sometimes even making their own. Only big companies that are building their own apps are asking for people to remove their mods. Anyway, my very first stumbling into programming was learning basic LUA, which is the scripting engine TTS uses to build my mods. I have been out of the TTS scene for a while as I wanted to learn more advanced programming and started to feel like I was putting so much effort into modding (I host a number of top mods in the community) that I was missing an opportunity to build my OWN projects, rather than just copying other persons. Even so, I decided that I would do an update to one of my very first mods..MAGE KNIGHT. For those that do not know this is one of the truly great games of the "co-op era". It is one of the early ones, and is not a full cop-op, it, in fact, has a competitive and solo ruleset.. but it is still one of the truly great boardgames of recent times. It is to complex to go into but it is a hybrid adventure game and deck builder basically. Anyway It was my first ever TTS mod, and back then I didn't even code anything. I got help from another person. So this is a update with my new skills in programming to produce a more complex mod that is easier to play but still retains the feeling of playing a virtual tabletop. Here is an overview of the mod.... Mage Knight (Tragically Scripted) - [2nd Edition] @SteamWorkshop If you are curious about Mage Knight, I have started a new playthrough on my chan as well if you would like to see it in action! Mage Knight (Scenario: Dungeon Lords) - 4 Handed Solo Lets Play @uTube) Have Fun! -A4L
  2. Fiar enough. I actually play a TON of boardgames. I think that modern computer game devs could learn a lot by looking at how quality boardgame mechanics work. I mean obviously not TI.. but in general the really good boardgames can teach a lot, imo.
  3. not what I expected on a programming blog : )
  4. A4L

    Just keep Swimming

    G'Day.... So I have been working pretty steadily on the command phraser and discovered that it is an exponential problem. I get that "natural language processing" is a gigantic topic, so I shouldn't be surprised.. but I hoped to be able to fudge it to some degree using keywords. The core idea was that by having the app have a very limited word count that it would understand, it would effectively make the command processor keyword based, rather than actually language processing. Allowing me to discard large chunks of the input, distilling it down to very basic commands. So "Walk through the archway to the next room" would turn into "walk, north". The hope was that the player would "infer" that the app had a deeper understanding of what they were typing. Now, for the most part, it is working, yet there are some difficult issues that I have yet to resolve. These mainly revolve around words that have different meanings depending on how you use them. So "exit" can mean "leave the room via the exit" and it can also mean "the doorway is an exit". This is the current state of the project. (Download to Try it out) I have filled in the test level with junk areas. Each area has 2 items in it. A ball and a box. The very first area (the one you start in) has a load of text, so I can see a real example of how the prints function. Say when looking at something. The actual start room exit descriptions say they can not be used (as the game start room is not able to be left until you solve a puzzle) but for testing, you can just move from that start area. Only look and move actions have been implemented. Compound commands are yet to be done.. so "look" works "look ball" works but "look ball and look box" does not work. Now this is all still a bit rough... but it looks like my original idea of how to actually process the keywords is not going to cut it.. it needs a ton of special case intervention to get it all working at the level I hope to run it. Still, it is working... you can walk about, look at things. I think that when I add more words to the lists, so there are more keywords, it will function close to how I wanted, but the act of adding more words increases the special conditions. What I need to do is strip the command phrase back and run it through some code that can quantify what the structure of the phrase is. I am pretty sure that I can use simple English language rules for this. If I can identify what the parts of the phrase being entered are, then I can use that to direct the program to the correct command even when there is more than one meaning for a given keyword. As the structure of the sentence should inform me which key that keyword is supposed to be. The querstion I have now is should I fix this.. or just keep going on as I have been. The demo project is small enough that I can get it functioning with the code I have, and then I could move to another moreexciting project.. or I could get this working perfectly and then move on. This text adventurer is a learnign thing.. so it might be time to start thinking of wrapping it up and moving to the next task? Thanks for Reading! -A4L
  5. A4L

    What is a Word worth?

    This is kinda exactly what I wanted to hear and if you read my very early posts was kinda my thinking when I started this project. Very interesting. Thank you for that link. I will check it out! EDIT - I appear to be mainly level 0 and level 1. Though I am not even attempting some of those categories, or at least do not think I will be. Maybe that entire list needs to be learnt.
  6. A4L

    What is a Word worth?

    G'day.... Well, I'm back, and I think the project has made some significant forward progress. To be honest I wish I spent more time trying to learn to programme before attempting something complicated like this project. I mean, it isn't really complicated relative to people that know what they are doing but it is a far cry from the questions in the book asking things of me like : "Write a program then prints out a Christmas tree of stars using for loops". I was just so keen to jump in and do something fun! I feel like the project has taught me a lot but I am unconvinced about the efficiency of this method of learning by "jumping in the deep end". The problem is that I am really not pushing my understanding of the larger things. As I am trying to produce actual results, I am simply working in the framework of my current understanding. For example, I haven't made any progress in learning INHERITANCE, POLYMORPHISM, VIRTUAL METHODS and ABSTRACT CLASSES. Even though I am sure that some of these are how I should have done things. Also my understanding of the Stack and Heap and all that is still spotty at best! So I feel I am not actually learning at the same pace as when I started. What I am getting though is an understanding of how the stuff I know can be used. Over this learning project, I have done some pretty radical re-writes. Each time the code has been drastically simplified. For example, a snippet from my last push to GitHub. This old code reads data from a file into my area class...... private void ProcessData() { area.SetName(ReadDataFile.Read_RawSingleLine(areaKeys.areaName, fileData)); area.SetLook_Description(ReadDataFile.Read_RawSingleLine(areaKeys.areaLook_Description, fileData)); area.SetCinimatic(ReadDataFile.BetweenUniqueBrackets(areaKeys.areaCinamatic_Start, areaKeys.areaCinamatic_End)); ProcessAllItems(); ProcessAllExits(); } private void ProcessAllItems() { BracketCounts brackets = new BracketCounts(); brackets = ReadDataFile.Read_BracketCount(areaKeys.itemsStart, areaKeys.itemsEnd, fileData); for (int i = brackets.start[0] + 1; i < brackets.end[0]; i++) { DataRead_Items BuildItem = new DataRead_Items(fileData[i]); area.AddItem(BuildItem.GetItem()); } } private void ProcessAllExits() { BracketCounts brackets = new BracketCounts(); brackets = ReadDataFile.Read_BracketCount(areaKeys.exitStart, areaKeys.exitEnd, fileData); int exitAmount = brackets.bracketCount; List<int> bracketIndex_Start = brackets.start as List<int>; List<int> bracketIndex_End = brackets.end as List<int>; for (int i = 0; i < exitAmount; i++) { DataRead_Exits BuildExits = new DataRead_Exits(); area.AddExit(BuildExits.ProcessExits(bracketIndex_Start[i], bracketIndex_End[i], fileData)); } } By splitting my readData functions into separate and specific things, I have cut down what each individual file actually does. This makes it super easy to read, and also easy to find stuff as I do not need to dig through a gigantic and generic readAreaClass that may even have duplicate functions, with say readItemData, or whatever. I have split it all out and focused each class to take in and output small packets of data in what are effectively single functions. I mean a single class might have multiple methods in it, but the basically takes in something manipulates it so it outputs what I want and does nothing else but that. (for the most part) so I can reduce the code in a way that allows me to simply "read" it in a very clear way... and if I need to know HOW it works I can go deeper, by just following the program flow. The new code below does the exact same thing as the snippet above, but all the considribaly cleaned up "guts" are now behind vey neat and simple in/out class functions. So when reading the above code it is a mess, but reading below is super easy, even if you do not have any idea what is going on.... area.areaName = readLine.Get(KeyName, fileData); area.areaLook = readLine.Get(KeyLook, fileData); area.cinimatic = readCinematic.Get(CinimaStart, CinimaEnd, fileData); area.itemsList = readItems.Get(ItemStart, ItemEnd, fileData); area.exitsList = readExits.Get(ExitStart, ExitEnd, fileData); So you re-wrote it AGAIN.... Any actual progress? Yes actually. I have completely implemented the dynamic keyword generation system. My biggest fear with this project right now is that I never did a proper proof of concept to skeleton or whatever it is called. I basically have no idea if this keyword system I am doing is going to work as I envisioned it. I should have experimented with a simple project and some hardwired word lists and determined exactly how and if it all works. As I haven't done this, I am just trusting to the original plan. A big part of that was to simplify the commandphraser by limiting what it is actually looking for. If I give the app a series of keywords and key actions I only need to code the app to understand THOSE things. Say I have a box in the scene (and only a box) Any command phrase that the payer enters which does not contain the word Box can be ignored or throw and error or something. As the player moves around, the app looks at the items in the room and is able to construct from my word list files dynamically. So words that are active in one room would be inactive in another. Anyway, I am literally falling asleep as I type this! lol... can't be bothered checking.. bed now Thanks for reading --A4L
  7. A4L

    Going in Circles.....

    G'Day.... Quick progress report.. or lack thereof. I have not been putting the time into this recently due to extended family visiting and doing the host / tourist guide thing... but I started working again today. All I need to do is add the dynamic word list building and the engine is basically ready for final command processing. The problem is I seem to be going in circles. You see the entire leevlinitilises through the reading of data files but the ACTIVE COMMANDS and TARGETS need to be dynamically initialised latter in the program flow as they need to dynamically build every time the player moves to a given area. The problem is that I have been trying to shoehorn in this dynamic code into what is essentially a bunch of code the creates constants for the entire life of the program. I am half way through but I have this feeling that I am just creating an ever-expanding knot of ropes crossing every which way. There is just to much referencing other classes and going back and forth with data. The entire thing feels like a mess and it is confusing to me and I wrote it. I really think what I need to do is split the Area Initialisation and Area Activation into separate classes and then split all the word list stuff into separate classes. I originally thought the more I kept it together the better, it seemed a waste to have a class for what is essentially a single function, but during run time I am finding things are initialising more than once, as the constructor for the "large" file is going every time it loads a part of the data it is looking at .. stuff like that. This is super annoying as rebuilding the entire area phrase is basically rebuilding how the engine constructs the game world and is a significant re-write. I tried to get around this by removing class constructors and building sub set initialisation functions.. like CommandList.Init_Nouns(); So only parts of the class initialiser certain points in the program but this is where the spaghetti-figation started to really get bad. I can't see any alternative than rebuilding how my gameworld initialises. It shouldn't take to long as most of the grunt work with the actual data reading code and processing should be directly transferable.. it is more about when in the codes line it all occurs. Thanks for Reading -A4L
  8. A4L

    Falling into place!!

    G'Day.... Just a quick note today. There is not much new information to go through..I'm basically just implementing the things I spoke of in the last few posts. At this time I have a small grid of areas loaded into the game and a number of items. This is a simple flowchart I use when playing adventure games to make maps. (Check out a map I made for Mage's Initiation recently) In addition to having the gameworld mapped and the "game" of what the player will be doing completed I have also finished the command phraser. At this time it only understands single work commands or "global" commands... things like "look", "north", "south", "east", "west". So all you can do at this stage is walk about and look at the area.. but the framework is there to do pretty much the entire project now. All I need to do is expand the command processor a little bit so it can recognise "look ball" for example. This should be the last big step before just having to enter all the actual game data into the data files. You can download the demo here: https://tinyurl.com/y242wx4t (PC) Well, that is that. Like I said not much to show here.. I just wanted to show that there is progress being made. It is pretty exciting right now. For the record, I didn't look up any methods or system to build my command phraser, beyond some actual text manipulation concepts like stemming. The way the app "understands" things and how the synonym lists work and all that is an idea I came up with myself months ago. All this time I have been working on trying to make that idea functional and been very worried that it probably will not work at all! It is gratifying that it spears to be functioning exactly as I expected it to. Thanks for Reading -AFL
  9. A4L

    Ready for Action

    G'Day.... So I have gone through all my code and got back up to scratch on everything. I am now confident in my methodologies and logic paths I was thinking of for the game loop. If this experience has taught me anything it is that I HAVE TO START USING COMMENTS MORE. There was a lot of tweaking as I went through as well. Turns out a lot of functions really could have been culled. Process_AllCommands and ProcessCommands for example (and the other Process Functions) could all be condensed into a single function by using internal variables being filled by function arguments. I feel that the code is more readable now that it ever has been by removing a lot of these nearly identical functions. State of the Project I now have gotten the game to go through most of the functions needed. I still have not worked on the rudimentary commandProcessor that I wrote just to get some testing done 6 months ago before my break. This is the next phase of the project. I seem to have everything "in" now.. so now I just need to manipulate it and I think we are good to go! These are compleated! Text Utilities : to manipulate text and print it to screen in a number of ways. Like adding margins, a "typing" effect that prints a letter at a time, a "skip" function that will complete a given paragraph instead of waiting for it to type. This also handles all the stemming, and input collection and cleaning stuff for input strings from the user. DataFile Phraser : that can load data from text files and use it to populate classes like Areas, Items, CommandLists, ObjectLists and more. It can also process lists, where each item corresponds to a file name. This allows me to process a file like "ActionConstants" to batch load perma action commands in a single code block. For example, things like move, get, look and stuff are always active. This also allows me to load lists of items and actions and commands and stuff that is unique to the area as defined in the Area data file. There are other datafile applications fo the list functions as well. In short, it just allows me to dynamically control the loaded data by editing a list file rather than changing the code. So I can add or remove words, items or w/e from the game without the code. These data files "should" be able to be edited externally of all coding to populate the game world. GameWorld Class Chain : has been completed, assuming everything works. The "GameWorld", holds a grid of "Areas", which in turn contains "Items" and "Exits". These all contain word lists for "Actions" and "Objects". So, for example, if "ball" is an item in the area, this ball adds the object word list for "ball" and all its synonyms as well as valid player actions like "kick". The idea is that an "active action and object" list is created at the time an area is initialised by the player entering. So the input phraser has a massively condensed list of "active words" to look out for instead of understanding the entire breadth of the English language. It is my hope that this will give the illusion of the app understanding English a lot better than it does but narrowly focusing what it is required to understand. Each of these classes all holds a variety of information. For example, the "Item" and "Area" holds all the text to be printed by commands like "get" and "look" and the GameWorld holds global switches like understanding if a player has already entered a location before. Player Class : has been completed for a while now. It mainly holds location data to move the player through the map and retrieve its location, set global area values and stuff like that, score, move counter etc etc. If all is working to plan.. only the variables in this class need to be saved to disk to facilitate "save" and "restore" What to do now? So with all that done, I am really getting close to getting up and running the full demo project. That consists of a small network of interconnected room, a narrative and a few puzzles. To get this into a playable demo I still need 3 major additions to be completed. One of them is 1/2 done already. Build the "Action" Class : I have (with help of some forum members) worked out a method I think will allow me to build the specific events needed to run an actual game. The class has basically 3 functions. Taking single commands like "look" that consists of only 1 word, taking multi-word single commands like "get the lamp on the desk" and taking multiple commands in a single line, like "take the lamp from the desk and throw it at the hideous beast". So the actual input system is done.. all that is left is the processing of those inputs to do things with the collected and cleaned data. Build the "inventory" : as no inventory means no Advent! This is going to basically be a specialised "area" that stores items and it carried around by the PlayerClass so it and all its wordlists are active anywhere the player is. It will also have its own unique print to display the items. I would like to use this same idea for an ingame map as well, which I consider as part of the inventory. Full in all the Data : as the game is currently just using place holder data to make debugging fast and easy. This means writing out and putting into the datafiles all the text descriptions, cinematic descriptions, and action response descriptions and of course all the word lists. This is a ton of work and will be the last thing I do. The app should be fully working before I start on this part of the project. Basically all the rest is building the "engine" and this is building the game itself. Anyway.. thanks for reading! --A4L
  10. G'Day.... So I spent most of the day re-acquainting myself with the code of my project, after my near 6 month break from computers. Not a break from the project but literally, I didn't have any computer or access to the internet beyond my phone. This was a lot harder than I thought as I had completely forgotten the logic I was using for this program. I mean the app worked, and I could keep going, but I wanted to know the exact specifics to be clear in my mind. I also needed to strip it back to the very skeleton, removing all the "testing" stuff, and then build it up from there for so I could start loading the engine with actual content. I only made it halfway through tracing the game loop through all the classes so far but I was kinda surprised at how far along I am. I mean I am literally at the point of just adding the command processing and the loop is pretty much closed. This brought back to mind the big problem I was tackling at the time I sold my old house, moved and the project went into hibernation. A Functional Impass So the problem I had was being confused about how to have unique code in my project. So far everything is made with classes that are filled with data in a very general way. I wanted to be able to populate the gameworld during initialisation with simple instructions like gameworld[1,2].loadArea("bedroom"). For example, the "Layout" is a grid of "areas" and the "areas" contain "items" and "exists", and the areas, items and exits all contain unique text strings for names and descriptions and all that concerning their properties. These are all created by reading "area" data files. So during game initialisation, the code just phrases the area data file and this creates the game world. (See my blog post on data files) The command interpreter can determine what the player is trying to do and with what, like "get apple" or w/e... but the issue I was having was I didn't understand how to have unique code events on these objects. Everything is created from the same classes but how do I have unique functions in those classes and still have the be generic enough be filled in this nice neat way. I didn't want to have to write all these unique classes and then make all these complex checks and balances in the data importer. How do I say have "take apple" put the apple in the inventory, and have "take supporting block" cause a cave in and spawn new items and change the exits of the entire area? A Functional Impass - Advise me on how to proceed? (C#) @GameDev Beginner Forums (This is a forum post from February where I asked about this) A Solution? So I was pretty down while doing my project revision knowing that as soon as I got it back up to scratch I would again be stuck at this problem in the design but while I was having a shower I had an idea for a possible solution that seems simple and within my knowledge and abilities. To put simply I will make a new class called "Action" that will process the commands separately from the items and exits. In the same way, I do not just print the text outputs directly to the console, I send them to a textBuffer for processing first, I will not send the commands from the command interpreter directly to the items or other interactable objects and trigger action function in those classes. Instead, I will have an action class that has the command sent and using the player location to find the area as well as the item name I will be able to use if or switch or whatever to filter these action between generic actions or unique ones. So "get apple" is sent to the action class, it searches through to see if the apple has a unique get function... it sees no exception, so it falls through to to the generic "remove from area, add to inventory and print "get" text to screen". Meanwhile "take supporting block" searches through the action class and sees that there is a special case for "get" concerning the "supporting block" and it falls into that unique code block that dose w/e. I think this will work. The only issue I have is how exactly to get it to work. I may need to make action classes for every action type. Though I hope that this will not be the case. Either way, regardless I believe I have found (maybe a clunky way, but a way) to have unique action events for the generic item objects in the game without having tons of hard coded functions attached to every object. Times up! Let's do this. I have to say I was feeling pretty down as I was going through the old code and to be honest this "test project" while teaching me a lot is starting to feel like it is now holding me back fomr moving on in my hobby. Having this big "oh yeah, I never worked out how to get past that issue" wall at the end of my "revision" was a real bummer. Now though I feel energised and regardless of if it works out as I think or not, having something to bang on with has given me a feeling of momentum Anyway.. thanks for reading! --A4L
  11. A4L

    I'm back baby!

    G'Day.... So... it has been a long time form the last time I posted anything on this blog. Hell, it has been a long time since I even had a computer TO post anything on this blog. I recently moved house, well recently as in 4 months ago and the move was only part of a bunch of huge life changes that have been happening around me. It took until about 2 weeks ago to even get around to setting up my computer and the office! I mean, damn, I only got my bed sorted about a month ago! (Been sleeping in the recliner!) To tell the truth it was kind of liberating in some ways to not have a workstation and really unplug form the internet and computers in general. It has been pretty much the first time in my life I ever have, but all that is over now, as I have my workstation and office all set up and ready to go! So... "I'm back" and planning to get stuck into this project again. It may be a little slow to reboot as I'm a beginner to programming and it remains to be seen how much of the code I can still read. I am not exactly the best at using comments. I'm just a little unsure about how much coding methodology I have retained over what is basically a near 6 month break from computers. Worst comes to worst I will rebuild the project from scratch but I hope to be able to jump right in. Lucky I have a detailed blog to go through and be reminded on my ideas and evolving thoughts on the project itself! Anyway... that is about it for now.. hope for a proper update soon!
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!