Results 1 to 7 of 7

Thread: In Development: Galactic Bondsman (Title not set in stone yet)

  1. #1

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Lightbulb In Development: Galactic Bondsman (Title not set in stone yet)

    Name:  Image1.jpg
Views: 737
Size:  35.3 KB

    I wasn't sure where to put this. HERE seems most appropriate.

    I am working on a game, a space-adventure, trader style game. Built similar to a "Visual Novel", but it is NOT just a visual-novel.

    I will be posting progress and hurdles here, before I have something worthy of an actual release. This will be a free game, which I hope to get donations to continue development for. The game will also be highly moddable, to extend or totally hijack, if desired.

    Currently, the game is a bit all over the place. I am a one-man army with the GREAT individual support of the users from here and within the "Visual Basic Community" Discord chat. https://discord.gg/4qe9Ze4N

    The game is about a young man who has just come of-age. His grandfather, who helped raise him, has just passed away. He was the inventor of the original "Jump drives", which promised to take "jumping" from a corporate-only luxury, into a public domain. However, things didn't go as planned.

    His research, as it turned out, was not really "privately funded". It was being funded by one of the largest corporations in that time. Also the most evil of the corporations. They stole his work and attempted to kill him and his team, but him and his friend had escaped. Though it was only him, that the company really wanted dead. The others were just loose-ends.

    While his friend risked staying near, afraid to leave the heavily controlled borders of the corporate zones. He made a sprint for the other side of the "reachable galaxy", using the prototype jump-drive. There was no other way to get out of that zone, because the corporations controlled all the old-world jump-gates. But the border wasn't his only hurdle in his journey to escape. He had to get past the central war-zone, before he would arrive at the far end of the lesser developed end of the "reachable galaxy".

    You see, our galaxy is composed of bands of stars and non-star bodies. They swirl around a few black-holes in the center, slowly flowing to the virtual "drain" of a new existence. Between these bands of dense bodies, are equally as wide "voids". These vast bands of nothingness, have no suns or bodies close enough to navigate and debris is flying around at millions of miles an hour, unseen. That makes most of our galaxy unreachable, even with the best super-computers for detection and fastest jump-drives to span gaps. So, our reachable band is about 1,000 light-years wide and about 20,000 light-years long. The voids are just under 1,000 light-years, between bands.

    Nearly at the center of our band, Earth was the only planet with humans on it. After the first jump-gates were made, corporations spread in every direction. They drained most of the planets in the center of all valuables. Working outward to the planets that were just not profitable to mine. The outer planets were peppered with valuable minerals, unlike the dense packed veins found in the central planets. Corporations found new footing at the edge of the band, nearest the center. Planets were closer, abundant and much more stable than those found on the tail-side of the band, furthest from the center of the galaxy.

    The tail-side became home to people looking to escape the evil empires and mining. Most became craftsman and farmers, if they didn't become pirates and mercs. This is where his grandfather found a new home and a wife. This is where his family was started, and ended.

    Now, it is time for him to try and get back what belongs to his family, to his people, from those who guard it, unsure what it even does, if it still exists.

    -------------------------------------------------------------

    So, where am I in progress with this game?

    I have something of a shell, which I am still messing around with the "flow" of the GUI. I stopped when I hit the "Prologue" component, which is one-click away from launching the game. :P

    My first hurdle was just trying to get "justified text" to display correctly. Tackled that. Now that is waiting for a format to use, which can be edited easily, as text or with a custom editor. (I want this to be multi-lingual, possible, which is another slight hurdle.)
    (Talked about in link) https://www.vbforums.com/showthread....tive-solutions

    My second obstacle to tackle, was the "navigation" and "trade charts". I wanted the program to do the brunt of "pathing", so the user is not going crazy trying to micro-manage every star along the way or stop along a delivery path. Have that mostly tackled now too.
    (Talked about in link) https://www.vbforums.com/showthread....mental-hurdles

    My third obstacle is some form of "scripting", so MODDERS don't have to "program", in VB6, in order to make playable mods for the game. (They should be able to use a text-editor or a custom game-editor, and make most game-functions interact and create the desired "story flow", as needed.) That is just on paper at the moment and no code is even hammered-out.

    Next, I am working on the delivery details and ships details. The ships being heavily upgradable and the deliveries needed to make money, having a lot of codependence on the ships design. (Needing special storage types or cargo-types. Heated, Cooled, Cryo, Sleeping, Entertainment, Passengers, Explosive, Radioactive, Secured, etc...)

    After that, I need to structure the "events system", to handle all of the text and scripting, so they "do things", with a reason, forming the game/story.

    I have yet to determine how I will handle "conflict", which is related to ship-to-ship "battles" or fights. I am not able to do 3D any justice and my 2D work would be "just enough" to fake it, well. (I wanted a form of radar-type interaction, which I have many ideas for, but nothing hammered-out in code yet.) Initially, I may use text-only based interactions, like a system-screen of alerts that need to be managed. Only until I can get something looking like a live radar view, which is also functional.

    By the way, almost everything will upgradable in the game, except you/him. The ship, the ships components, systems in the components, trade terminals, maps, radar, weapons, etc... The point is that you constantly NEED to upgrade, to survive, but there is plenty of advancements past NEED too. Then, at some point, you have to downgrade again, which is actually an upgrade, of sorts. (Hard to explain that one.)

    Okay, going back to work. I'll post my next "issue" here, so I am not flooding the general "VB6 help section".

    Once I get something worthy of launching, I will attempt to put it up on GitHub and mention any places, if it is allowed, for donations. (More than likely, "Patreon", or "GoFundMe" or something like that.)
    Last edited by ISAWHIM; Mar 19th, 2023 at 06:52 PM.

  2. #2

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Re: In Development: Galactic Bondsman (Title not set in stone yet)

    Some non-coded resources...

    This link is to a spread-sheet with the data that (roughly) relates to the various types of ships in the game. I am using the generic foundation of 20K (20,000) light-years as the determining factor for "traversal comparison". I also have a base-line for 1 light-year, as well as a standard "commuter vehicle", which travels at a minimum of 7K miles/hr, in space. (Essentially a "moon-runner" or "space-station hopper".)

    EG, IF you were to attempt to travel the full length of the "reachable galactic-band"... 20K light-years... it would take you XXX hours to do it, in whatever ship... if you even have LY jump ability. (Column E) While (Column H) is that same time in years.

    Sk is Sickness, Jp is Jump, LY is light-years
    Max Jump in LY, is the distance you can reach per jump. (Fuel, energy, cryo-provisions, sensor range, maneuverability) Used to calculate "sickness" from total jumps, as opposed to distance sickness from a jump.

    https://1drv.ms/x/s!At2msWItvtX8j1oK...oTvwm?e=68otG1

    None of the speeds are "tuned". They are really just a "from thin air" setup.

    In the game, there is a "sickness" tied to "jumping". If you use a "Jump-gate", the sickness is minimal. If you do a manual jump, with a "jump-drive", the sickness is a great deal longer. There are two types of jumps, "Awake" and "Cryo". Short jumps, at low speeds, do not require full Cryo-sleep to do the jump. There is a sickness from the "Wake stabilizer", or just from the fatigue and stress of the rough journey. While Cryo, relatively speaking, per mile, creates less sickness. However, in real-time, you are sick longer, before you can do another jump.

    Also, Cryo, though it extends your life, to a point, it also shortens your life-span. You can sleep for 20 years, but you will lose 5 years from your total life-span. You will have not aged a day, be 20 years from that point when you were frozen, but now only live to 85 instead of 90. (Roughly) At some point, the "system" just won't let you into Cryo anymore. That point where you would want to use it to make a 20 year journey, but only have, potentially, only 5 years left to live. You would wake-up just in time to die.

    In the game, you will be able to jump in and out of "travel time", as it fast-forwards time to your destination. (You can also interrupt the travel time, or it may be interrupted by "other things" too.) However, mostly, the time-passage is intended to give the game time to think and also allow "random things to happen", in a long journey. While it also spares the player from sitting there for 20 years of a 20 year journey. :P
    Last edited by ISAWHIM; Mar 19th, 2023 at 07:53 PM.

  3. #3

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Re: In Development: Galactic Bondsman (Title not set in stone yet)

    Any input on if it would be wise to use "Microsoft ScriptControl", with 'VBScript" for the scripting component of the game, for modders?

    I see the "UseSafeSubset" option is False, by default. What would be the limit of it being True? (Not finding any real information on this OCX or the direct COM object use.)

    The intention is to allow access to SOME of the games internal workings. As well as giving the option for modders to replace various internal functions too. Where it is not critical.
    Last edited by ISAWHIM; Mar 21st, 2023 at 10:31 AM.

  4. #4

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Re: In Development: Galactic Bondsman (Title not set in stone yet)

    Okay, so I managed to get the palette color-swap/shifting issue resolved. I had been digesting many possible ways to do this, but ended-up using a method that had it's own quirk with it. (Rant about half way down on them using at "type" they named RGB, but it is structured as BGR, so you have to invert your order when using the RGB() function in VB6, or manually code around that non-standard, deceptive structured, annoyance.)

    Post here, if you are interested doing color-shifting with bitmaps.
    https://www.vbforums.com/showthread....a-simple-image

    Now I am on to the part where I have to create a dialogue-tree style structure, which includes "scripting". The scripting is to extend new dialogue interactions, remove them, alter them or just set values within the game. Such as having a conversation about a reward, after locating some object. The dialogue changes for the response saying that you found the object. Then a script removes the object from your inventory and you get "credits" for giving them the object. (Or just a unique response that only exists after you give them the object. Maybe you keep it, and get another response!)

    So, the generic format I created is something like this...

    Q = Question
    A = Answer
    R = Response
    S = Script

    Depending on who starts the conversation, the "who" of Question, Answer and Response flip-flops. (But it can also be "set" to another "who", when multiple people are talking.)

    The structure also has these elements to them.
    <Where value> <- Where it applies, the location of the [Who] that is talking (Background image or other)
    <T>, <F> <- Special markers, as visual helpers for conditions results.
    [Who value] <- The individual "for this text being spoken" (image of someone, or not)
    {How value} <- Indented to be the "mood", if one applies, to the tone of the conversation (images, text style, box style)
    (Conditional statement, True-text) False-text <- This is optional. If not present, then the item is just not shown
    "Text being said, or script text" <- Clear enough

    Coming together, it would look like this, in a real "simple" format, in a text-file of data, or in a game-editor for dialogue.

    Code:
    <OnShip>
    [Bob] Q: (Bob.Mood > 0, "Glad to see you came.") "Go away, you annoy me!"
        S: <F> "Bob.Mood = Bob.Mood - 1"
        A: <T> "Glad to see you too." S: "Bob.Mood = Bob.Mood + 1"
            R: "How kind of you to say."
        A: <F> "Someone started early this month." S: "Bob.Mood = Bob.Mood - 10"
            R: "I synched with you, finally!"
        A: "Nevermind"
            R: "You know where to find me, when you change your mind."
    
    'NOTE: Dialogue value is still T or F
    [Bob] Q: <T> "What can I help you with today?"
        A: "Hear of any jobs?" R: "Nothing that you would be interested in." S: "Bob.Interaction(ID,0) = True"
        A: "Any goods that you stumbled across?" R: "Nothing lately." S: "Bob.Interaction(ID,1) = True"
    These "dialogue interactions" would be contained as a series or "dialogue run" of values. These two specific ones may be interactions 358 and 359. These really point to a text-file of matching IDs, for use in translation files. This would be more like a "construction form", which the game-editor would use to extend the "run" and "text" files.

    The general format is like this... as "flow". I don't think indentation would be a requirement... But I haven't, mentally, thought about that depth, past the visual structure looks.
    (being optional)

    Code:
    Q(C)->A(C)->((R(C))->(S(C)))
        A(C)->((R(C))->(S(C)))
        A(C)->((R(C))->(S(C)))
    If there is just a Q and a single A or a Q followed by a Q, then there is no selectable option. It's just a back-n-forth conversation or a multi-person interaction.

    Code:
    [Bob] Q: "How are you?"
    A: "Fine."
    Q: "Did you hear the joke about the Glyphmore and the Synar?"
    A: "The what and the what?"
    Q: "Nevermind."
    [Sue] Q: "Bob, leave him alone!"
    [Bob] Q: "It was a good joke, if you were cultured like me!"
    A: "Yeah, I'm not real cultured."
    Might reverse it too?

    Code:
    Q: [Bob] "How are you?"
    A: "Fine."
    Q: "Did you hear the joke about the Glyphmore and the Synar?"
    A: "The what and the what?"
    Q: "Nevermind."
    Q: [Sue] "Bob, leave him alone!"
    Q: [Bob] "It was a good joke, if you were cultured like me!"
    A: "Yeah, I'm not real cultured."
    The leading [Bob] WHO values are not needed past the first one. Also, the "A:" becomes optional, if there is a WHO-switch.

    I'm thinking that the game can also "shorten" data, by cross-linking text-IDs that are the same. Until some "edit" makes one, or another unique. Like the phrases...
    "Nevermind."
    "Thanks."
    "Good to know."
    "Not today."
    "How are you?"
    "Have any jobs?"

    NOTE: This could also extend to scripts too... Since many of those will repeat.

    That was also my second reason for having the text reduced to IDs, besides translation for other languages.

    The (conditionals) are just shorthand scripts, which will be processed after the missing text is added.
    (Value = True, "Hello.") "Goodbye."
    Would look like this, as actual script.
    Script.Execute "If Value = True then Dialogue.Text=""Hello."" Else Dialogue.Text=""Goodbye."""
    Then the game would just process Dialogue.Text result, to display something if it was not empty "".

    All of this is just mental notes, at the moment. I am writing the code to test it out now. It requires a few provisionary "values" to be in place before I can do real deep testing though.
    Last edited by ISAWHIM; Mar 27th, 2023 at 04:33 PM.

  5. #5

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Re: In Development: Galactic Bondsman (Title not set in stone yet)

    I am trying to figure-out the best ways to tackle this, so don't mind my TLDR mental notes. Sometimes what sounds good on paper, doesn't sound as good when you start coding it, or verbalize it.

    I hope that someone might chime-in, at some point, and say...
    "You're doing it all wrong!" or "Why the hell are you doing it that way?"

    It looks like I will be using a few Data-Tables (Flat databases), to manage IDs for various things.

    Something like the following.
    - ControlIDs: (For the programs various control display text. Just to keep it isolated from GameText.)
    - HelpTextIDs: (Pop-up related info or other forms of game-notes, unrelated to the controls or dialogue.)
    - DialogueIDs: (Specific to the many lines of spoken text, related to the games conversation dialogues.)
    - ConditionScripts: (No translations needed, but a "different" processing for these specific, recycled scripts.)
    - ExecuteScripts: (Scripts intended to be "run", in some way. Again, no text translations here.)
    - EvalScritps: (Scripts intended for simple "evaluation", to get a value from them. Various places. No translations.)

    Translations should not be needed, in scripts, because the scripts "text" will be stripped and dumped into DialogueIDs. Used in a way similar to the scripts IDs.
    Code:
    Q:328
        A:2382, C:32, 2383
            R:2384 S:14
        A:2385
            R:2386
    Script ID#: 14, might be the following... As raw text
    Code:
    -> If Myval = True then Say("[DlgID(1322)]") Else Say("[DlgID(1323)]")
    So the value of the text in DlgID(1322) would be inserted into that script. Thus, not needing "translation", in this file. The numbers would be created by the editor, as new lines are made, or cross-linked, if the same line already exists. (Collections?)

    Something to that respect.

    Possible functions might be like the following examples.
    Code:
    SimpleSay(What, Optional Who, Optional How)
    ConditionSay(WhatTrue, CondBase, CondComp, CondVal, Optional WhatFalse, Optional Who, Optional How)
    ScriptSay(WhatTrue, CondScript, Optional WhatFalse, Optional Who, Optional How)
    The difference being that a SimpleSay has no conditions. ConditionalSay uses a single condition, compared in only ONE way. While a ScriptSay would have a more complex condition.
    Code:
    Script: "If (A > B And A < C) Or (Cash = 0) Then CondResult = True Else CondResult = False"
    Some of this is also for doing "updates", where New text may replace old text, or extend it. Similar to "Mods", which may have "UseMeIfExists", types of ID data. New values would append, while older values remain, up until a point where they ultimately hit a "hard upgrade" that purges all unused ID's and re-orders them for the smaller data-sets. A point where a MOD would warn that it is not compatible with the current game/save data, because none of the ID's would match.

    Similar to updates changes... Old ID's if they are just "text corrections", can be replaced. While things like extended translation data that wouldn't otherwise fit in the same area, could have IDs appended to make them roll-over into new text that the "english" version would not otherwise have an ID for. No "Dewey-decimal systems here!"
    Last edited by ISAWHIM; Mar 27th, 2023 at 07:39 PM.

  6. #6

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Re: In Development: Galactic Bondsman (Title not set in stone yet)

    Small change in plans.

    The triple-nested format was getting a bit difficult and confusing to code and to mentally structure as text. I had to re-evaluate what the actual desires were, and the additional function didn't justify the overhead.

    So, the format seems to be more like this... (Though I did expand on the function a little.)

    A quick test, showing how the "guts" will sort-of work. (This deserves a CLASS setup.)
    Code:
    Option Explicit
    Public Rudeness As Long
    Public SayCount As Long
    
    Private Type tDLG
        Ta As String
        C As String
        Tt As String
        Tf As String
        St As String
        Sf As String
        Sa As String
    End Type
    ' Answer is always YOU and YOU are always at YOUR LOCATION
    ' HOW would be set in the script or indicated in the text, if needed.
    Dim Answer() As tDLG
    
    Private Type tSAY
        Who As Long
        How As Byte
        Where As Long
        What As tDLG
    End Type
    Dim Say As tSAY
    Dim Question As tSAY
    
    Private Sub Form_Load()
        Dim xT As String
        Dim xS1 As String
        Dim xS2 As String
        VBSC.AddObject "Me", Me, True
        Rudeness = 2
        ' Test DATA setup
        With Question.What
            .Ta = "I hear you are a "
            .C = "Rudeness > 0"
            .Tt = "bit rude, but I don't believe it."
            .St = "Rudeness = Rudeness - 1"
            .Tf = "real nice person."
            .Sa = "SayCount = SayCount + 1"
        End With
    
        ' Test evaluation of above DATA
        With Question.What
            ' Forces "True" to be default, when no value is set for a condition
            If LenB(.C) = 0 Then .C = "True"
            If VBSC.Eval(.C) Then
                xT = .Ta & .Tt
                xS1 = .Sa
                xS2 = .St
            Else
                xT = .Ta & .Tf
                xS1 = .Sa
                xS2 = .Sf
            End If
        End With
        ' This WILL execute a script, even if there is NO text to display
        ' However, if there is no script, it will not attempt to run NOTHING
        If LenB(xS1) <> 0 Then VBSC.ExecuteStatement xS1
        If LenB(xS2) <> 0 Then VBSC.ExecuteStatement xS2
    
        Form1.Caption = xT & ", Rudeness: " & Rudeness & ", SayCount: " & SayCount
    End Sub
    The Pseudo-Text for the above DATA, might look like the following... (The empty script not needed.)
    Code:
    Q:"I hear you are a "
        (C:"Rudeness > 0"
            Tt:"bit rude, but I don't believe it."
                {St:"Rudeness = Rudeness - 1"}
            Tf:"real nice person."
                {Sf:""})
        {Sa:"SayCount = SayCount + 1"}
    A thinner version might look like this...
    Code:
    Q:"I hear you are a "
        ("Rudeness > 0"
            "bit rude, but I don't believe it." {"Rudeness = Rudeness - 1"}
            "real nice person.")
        {"SayCount = SayCount + 1"}
    While a simple Question would look like this... (Devoid of a conditional response)
    Code:
    Q:"How Are you?" {"SayCount = SayCount + 1"}
    Minimum...
    Code:
    Q:"How Are you?"
    The format being...
    AlwaysText (ConditionalScript TrueText {TrueScript} FalseText {FalseScript}) {AlwaysScript}

    Only [AlwaysText] OR (ConditionalText) must be present. Even if the condition only has ONE response that never shows. The rest is optional 100%.

    Taking note that "TrueText" and {TrueScript} will be the default, when devoid of "FalseText" and/or {FalseScript}. However, there can be {FalseScript}, without having "FalseText". As well as having either/both texts, without any scripts. It would be stupid to have all four elements empty, but they can be.

    ("Condition") is technically possible.
    ("Condition" "" "FalseText") <- No true text, only False text
    ("Condition" "TrueText" {""} {"FalseScript"}) <- No True script or False text
    ("Condition" {"TrueScript"} {"FalseScript"}) <- No text, but both True and False scripts
    ("Condition" {""} {"FalseScript"}) <- No True or False text, no True script

    I guess this would be valid too... But possibly confusing. Someone might like that format?
    ("Condition" "TrueText" "FalseText" {"TrueScript"} {"FalseScript"})
    ("Condition" {"TrueScript"} {"FalseScript"} "TrueText" "FalseText")

    Okay, back to thinking and testing junk.
    Last edited by ISAWHIM; Mar 29th, 2023 at 05:56 PM.
    Please, chime-in on my latest WIP.
    I can use all the help I can get.
    [VB6 Game], (In Development), "Galactic-Bondsman"

  7. #7

    Thread Starter
    Addicted Member ISAWHIM's Avatar
    Join Date
    Jan 2023
    Posts
    181

    Re: In Development: Galactic Bondsman (Title not set in stone yet)

    The other intention of this being setup this way, is for the scripting.

    For instance, you can have no actual conditions for "SAY ID:45"... Which may show-up multiple times. That would evaluate to "True", by default, which would just show the "Always" text and the "TrueText".

    However, an answer from a later conversation, like "SAY ID:133", may add the missing (Condition), to "SAY ID:45". So, when you have that conversation again, there is apparently a NEW question there. It's a bit of friendly recycling. Hopefully a method that doesn't add confusion.

    ID:45 May have been... (No condition set "")
    Code:
    Q:("" "Have you seen Mike? I think he is in the Mech-Bay." {""}
        "I see that you have met Mike. Here, you'll need this!" {"GivePlayer(Item(834))"})
    Altered by... visiting Mike
    Code:
    Q:... ... ... {"EditSay(45, Question.What.C, False)"}
    Well, something to that effect.

    This is partly because no text should be in the scripts, where it will NOT be translated. All text should be within the original "question". It would also not be easy to start plugging-in text-IDs manually, because ID's may change. In the script, related to the functions for editing, the scripts can be altered. If the numbers were just manually injected into values, it would be much harder to detect.

    This is also an alternative to having MODDERS, or myself, from making all sorts of pointless tracking variables.

    But I'm sure I may have those too, or find a better way to do this stuff, or avoid doing it at all. :P
    Please, chime-in on my latest WIP.
    I can use all the help I can get.
    [VB6 Game], (In Development), "Galactic-Bondsman"

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width