Jump to content

TheKian

Member
  • Content count

    126
  • Joined

  • Last visited

Posts posted by TheKian


  1. There are a number of different mods, actually. Aside from Alhoon's mods for Geneforge 5, and the separate artifact weapons mod which it integrates, there is also my artifact weapons mod for Geneforge 4, and some other small mods another guy made. Also, there are a number of different character editor mods (that allow you to improve your character in-game) for (I believe) each of the Geneforge games, which you can find in the strategy central thread for each of them (if none are on the forums, I actually have some private ones for the first three games).

     

    Also, if you're interested in making your own mods, I'd suggest checking out my modding tutorial. It'll also let you change up other mods.


  2. In the ending, I don't think Greta is mentioned. However, she does actually affect the ending: presumably as a result of her dealings with Astoria being exposed if Greta lives, Rawal becomes the leader of the Shaper Council; if you kill her, however (which I did once and about which I felt rather bad), Rawal is mentioned as simply having dwindling influence (although I do not believe Astoria becomes the head councilor).


  3. There is a servile, Amena Blade, who shows up from Geneforge 1 through 4 (I dunno whether he's in 5 too). You can talk to him about the past (His location is, I believe, Kazg, Taker village in G2, Rebel village in G3 I think, and Derenton Freehold) and tells you the previous story of the game and also slowly gets older. You'll be able to gather the approximate spacing between the various events in the games, but specific lengths of time are a bit elusive. Seconds and hours, of course, will be same no matter what (not being defined as a portion of a day), and it's reasonable to assume the day/night cycle is similar due to the Earth-like climate (different day/night lengths would probably affect the vegetation in the long term, at the very least.) The year is likely similar to ours in length, given references to the unusually long lifespan of serviles and how serviles who are somewhere in the realm of 150 or so are exceptionally venerable. Finally, off the top of my head, the only two logs of which I can think that make reference to lengths of time are Monarch's journal in G4 (which simply refers to "Day XX") and a journal in the sealed lab in G1, which refers to the progressively increasing craziness of the researchers.


  4. 17 hours ago, Akhari Blaze said:

    I've been trying to port this to G2, but some changes are needed for some pics. The problem is that whenever I change a bmp for G2 (using Gimp), the in-game pic is corrupted. This didn't happen with G1, where I also changed some pics. I'm not even changing the palette in the files I'm trying to edit. Does anybody have a suggestion on how to do this, or the best program to use?

    I believe that Geneforge 1 uses 256 colors, so make sure you export the image like that. Something like Paint .NET can do that and also handle transparency etc.


  5. 5 hours ago, Randomizer said:

    Besides you really appreciate the newer games after putting up with the older game engines. :)

    I personally rather liked a lot about the Geneforge 1 engine. Well, with an exception to the way living tools worked. Although I must admit the infinite tool glitch was great fun.


  6. Allow me to settle this. Direct from the game scripts:

    "I was traveling to the Foundry. The Shaper I served under had developed a new sort of ornk. A smart ornk. I know. Why would we need that? But, somehow, he made it. He gave it to me."

    "Then I lost it."
    "Now I'm waiting for it to come back. I hope it does. I'm in real trouble if it doesn't."

    "It was smart. It tricked me. It acted all dumb and normal. Then, one night, I went to sleep and left it tied up. It undid the knots somehow. It ran off. I tracked it until it got close to the swamps southeast of here, and then I lost it."
    "I won't survive out in that swamp by myself. It's rebel lands. That is why I need help. I need someone to track down the ornk for me. I can pay. Honestly, I can."

     

    "What good is a smart ornk?"
    "I don't know," she wails. "The Shaper said it was just experimenting on different sorts of brains. He said that the ornk just provided a good template. I don't know what any of that means!";
    "He wanted it taken to the Foundry. So that's what I was doing."
            
    "What would have happened to the ornk at the Foundry?"
    "I think they were going to kill and dissect it. I felt bad about it at first. Now? I feel pretty good about it."

     

    This explains A. How the Ornk escaped and B. Why (in general) the Shapers made it. As to how it could speak? Well, I'm just saying that there was a literal FREAKING ORNK GOD in Geneforge 1, so there is probably something about Ornks the Shapers don't realize.


  7. 23 minutes ago, alhoon said:

     

    Ahem... let's take a moment to recall that Drayks, the exact definition of what you said, have been created centuries before the sentient ornk and they were far smarter from what I see of them. It indeed makes sense to start with Ornks.

    But... when you want to impress your superiors, you go for the smart deathmachine and laugh at the guys over the other side working on smart ornks, rubbing your hands in glee that you will get the promotion and the funding. Well, we all saw how that turned out for the wiped-from-history guys that created the Drayks.

     

    And then we had the Barzites that said "You know what? Let's go for EVEN MORE intelligence and power for our creations and make Drakons! We will totally make it if we have a stick that keeps them in pain." 

    I mean, I figure they probably learned their lesson after the second (third?) uncontrollable, flame-breathing lizard.


  8. If I recall correctly, the soldier who gives you the quest says that the Shaper was experimenting with different types of brains and found the Ornk to simply be a useful creation to use to test them. It makes sense, in a way - why would you want an extremely intelligent creation that can burn your face or crush your spine or (very practically) run away?

     

    Also, if you let the Ornk escape (I usually just murder it), you can find it again in the next zone and convince it to return to its handler. So there's that, I guess.

     

     

    On 6/1/2018 at 6:31 AM, Minion said:

    Perhaps whoever created it wanted to know if it would, by the application of logic, accept its fate as food for its keepers or whether it would rebel and attempt to escape.

    Also, Hitchhiker's Guide to Terrestia, anyone?


  9. Items:

    When compared to the previous two kinds of scripts, the item, spell, and creature definitions are most similar to the structure of dialogue scripts. Let's take a look at gf5itemschars.txt. This is one of the two definitions scripts you may want to edit in Geneforge. The third one--gf5floorster.txt--involves terrain definitions that you should not change. However, it also contains the definitions for graphic templates, so if you want to do custom graphics work, you may want to take a look.

    Here is the beginning of gf5itemschars.txt. This defines creatures (in the first part of the file) and items (in the latter part of the file).

    beginscenscript;
    // CREATURE TYPES
    begindefinecreature 9;
    // base creature
    // This slot stores the base unedited creature.
    // Used for importation.
        cr_size = 128;
        cr_default_script = "mobbasic";
        cr_default_aggression = 12;
        cr_statistic 0 = 1;
        cr_statistic 1 = 1;
        cr_statistic 2 = 1;
        cr_statistic 3 = 1;

    The first line defines the beginning of the definition file. The first creature defined is creature 9 (later creatures start from 0, which is the Shaper), the default creature important. You will notice a few modifiers in here. cr_size, or creature size, of course, indicates its size. I believe it specifically defines the size of collision for the creature.  cr_default_script is the default script the creature follows for actions. All mob scripts can be found in the creature folder. The default script here, "mobbasic", tells the creature to attack any nearby enemy and then return to its original position. It also provides the default conversation text of "You make a bit of small talk...". cr_default_aggression indicates the default hostility of the creature. I am not entirely certain what all of the values mean, but I believe that, in this case, it is neutral or friendly. The final four lines define the creature's stats, as defined in the previous section of the tutorial. 0-3 are, of course, the basic attributes of the creature: its strength, dexterity, intelligence, and endurance are all set to 1.

     

    The next definition is creature 0, the base for the Shaper.

    begindefinecreature 0;
        cr_name = "Shaper";
        cr_graphic_template = 110;
        cr_max_health = 20;
        cr_max_energy = 20;
        cr_max_essence = 10;
        cr_regen_rate = 12;
        cr_energy_regen_rate = 12;
        cr_base_level = 1;
        cr_sound_when_slain = 127;
        cr_default_courage = 100;
        cr_resistances 0 = 40;
        cr_resistances 1 = 50;
        cr_resistances 2 = 50;
        cr_resistances 6 = 50;
        cr_resistances 7 = 70;
        // These are all of the main character's combat abils.
        // Abilities used in town are handled in hardcode
        cr_abil_num 0 = 0;
     // punch
        //cr_abil_level 0 = 1;
        cr_abil_step_of_launch 0 = 8;
        cr_abil_anim_in_reverse 0 = 1;
        cr_abil_num 1 = 3;
          cr_abil_level 1 = 1;
        cr_abil_step_of_launch 1 = 8;
        cr_abil_anim_in_reverse 1 = 1;

    You will notice a number of additional qualities here. For the most part, they are fairly obvious. However, there are a few things to consider. The health, energy, and essence all scale with level and (in the case of health) endurance or (in the case of energy/essence) intelligence. This can result in things being very complicated when trying to change these values. The regeneration rate (cr_regen_rate) only applies to NPC instances of Shapers - the player himself will not regenerate. cr_default_courage indicates, I believe, something's resistance to becoming terrified as a result of combat (not as a result of mental magic). I believe that, in this case, 100 default courage means Shapers will never become fearful in combat. There are also new stat options here, the cr_resistances. I am not entirely certain what each resistance ID represents, but these stats can cover creature resistances to all kinds of damage, as well as mental effects. The Shaper, you may notice, has unusually high resistances. There are also two abilities defined. The first one, cr_abil_num 0, is set to 0, which is a basic melee attack. In this case, it is the Shaper's punch. The second ability, cr_abil_num 1, is set to 3, the basic firebolt spell. The associated values for these set the level of damage on the ability and the animation used.

     

    You will also notice that the Shaper does not have the cr_size attribute of the previous creature. This is because all attributes of the previous entry, unless something is imported, are carried over to the next entry. As a result, something defined after the Shaper that did not import creature 9 would share its characteristics with a Shaper, except for those things directly changed in the new entry. This can make things convenient or problematic, depending on what you are trying to do.

     

    There are two other kinds of creature attributes of which to be aware. The first is cr_color_adjust. This is what causes creatures to be colored differently, like fyoras versus cryoras, roamers versus pyroamers, battle alphas versus battle betas and so on. The exact correspondence of each value to each other value is not known, but you can determine how it changes graphics from the places it is used elsewhere in the fire. The second kind of attribute to consider are the cr_start_item ones. cr_start_item 0/1 = <item id> defines the item ID of the creature's default drops. Meanwhile, cr_start_item_chance 0/1 = <percent> gives the chance for the creature to drop the given item when it dies. Zone data can be altered to give creatures different drops, but these are the defaults for a creature of a given type.


    The item definition format is quite similar to that of creatures. Let's take a look at a couple examples.

    begindefineitem 0;
    // basic import item, clears values
        it_graphic_template = 50;

    All this has is the first graphic template, corresponding to G1500.bmp in the Graphics A folder. You can import it to clear the values inherited from previous entries, however. Take, for example, the flawed crystal and lovely crystal entries.

    begindefineitem 5;
        import = 0;
        it_name = "Flawed Crystal";
        it_graphic_sheet = 3;
        it_which_icon_ground = 14;
        it_which_icon_inven = 15;
        it_variety = 11;
        it_weight = 20;
        it_charges = 1;
        it_value = 20;
    begindefineitem 6;
        it_name = "Lovely Crystal";
        it_value = 40;
        it_graphic_coloradj = 2;

    The flawed crystal (item ID 5) begins with "import = 0". This clears all the values it would otherwise have inherited from the previous item, the gemstone. After it, you can see a few more item attributes .
    it_graphic_sheet defines which row (the first row being 0) of the graphic template the item is.
    it_which_icon_ground and it_which_icon_inven define which tile in the row (the first tile also being 0) the item displays as, respectively, while on the ground and while in the player's inventory.
    it_variety defines what kind of item it is.
    it_weight defines the weight of the item--weight is in units of 0.1 pounds, meaning that this crystal would be 2 pounds.
    it_charges defines the default number of the item there is. This should generally be 1, unless you're using wands or batons. In the case of those, by setting the charges to 0, it gains an unlimited number of charges.
    it_value defines the value of an item. You always sell an item for one-fourth of its value. In this case, you could sell the crystal for 5 gold pieces.

    The second crystal has far fewer entries. This is because it inherits most of its values from the previous item. However, it changes 3 properties: its name, its value, and its color adjustment. Color adjustment works the same for items as for creatures. Keep in mind, of course, that even though a color adjustment may look like it does one thing, it may do another. In this case, you have a green item being made blue--the same color adjustment on an item whose original graphic is orange or red, like some clothing, will likely result in an entirely different change.

     

    Now, let's take a look at a few of the more interesting different kinds of items. We shall start with armor, in this case the quicksilver plate. 

    begindefineitem 55;
        import = 41;
        it_name = "Quicksilver Plate";
        it_value = 3000;
        it_stats_to_affect 2 = 201;
        it_stats_addition 2 = 1;
        it_stats_to_affect 3 = 1;
        it_stats_addition 3 = 1;
        it_graphic_coloradj = 1024;

    This item imports item 41, the shaped breastplate. As it does not have its own armor defined (with it_protection), it inherits the it_protection = 34 from the shaped breastplate, as well as its weight. However, it has two stat modifications. The first is set to (it_stats_to_affect <number of modification in item> = <stat ID>) ID 201, which corresponds to action points. The second is set to 1, which corresponds to dexterity. Both of these have a bonus of one, which is set by it_stats_addition <number of modification in item> = <amount to increase>. It also has color adjustment 1024, which I believe corresponds to a paler color.

     

    Let's also look at the first charm defined, the lucky charm.

    begindefineitem 321;
        // imported for charms
        import = 0;
        it_name = "Lucky Charm";
        it_graphic_template = 51;
        it_graphic_sheet = 0;
        it_which_icon_ground = 0;
         it_which_icon_inven = 0;
        it_variety = 11;
        it_value = 600;
        it_weight = 10;
        it_abil_work_in_pack = 1;
        it_stats_to_affect 0 = 22;
        it_stats_addition 0 = 1;

    The charm imports the default item, clearing out the information from previous items. Its graphic template is set to 51, which corresponds to G1510.bmp in Graphics A. You will notice its graphic sheet and icon are both 0, which means that its graphic is the first tile in the first row of the image.


    The most important thing here is it_abil_work_in_pack = 1, which is what makes something a charm. This attribute causes whatever changes the charm makes to apply to you whenever it is in your inventory. In this case, as the stat it is set to affect is 22 (luck) and the value of the change it set to 1, whenever it is in your pack, you will get +1 luck.

     

    We will also take a look at the default potion import, the healing pod.

    begindefineitem 220;
    // imported for all pods
        import = 0;
        it_name = "Healing Pod";
        it_graphic_template = 50;
        it_graphic_sheet = 3;
        it_which_icon_ground = 2;
        it_which_icon_inven = 3;
        it_variety = 9;
        it_charges = 1;
        it_weight = 1;
        it_ability = 201;
        it_value = 70;
        it_level = 10;
        it_extra_description = 2; 

    This has something new: an ability for the item. The item also has a level, set with it_level, which determines the potency of the ability. Depending on the ability, the level may increase healing, damage, etc. As each healing pod gives a single charge, its charge setting is also 1. One last new thing you will notice is "it_extra_description". This adds an additional (hardcoded) description to the item. In this case, it describes the healing pod as a gourd containing magical goop. The item variety set by it_variety determines the primary description.

    Compare this to the ice-infused crystal.

    begindefineitem 119;
        it_name = "Ice-Infused Crystal";
        it_variety = 9;
        it_graphic_template = 51;
        it_graphic_sheet = 5;
        it_which_icon_ground = 2;
        it_which_icon_inven = 3;
        it_ability = 32;
        it_charges = 1;
        it_weight = 2;
        it_value = 25;
        it_extra_description = 15;
        it_level = 12;
        it_graphic_coloradj = 1;

    Similarly, this has an ability and level, although a different one from the healing pod. It also has a different 'extra description'.

     

    Now, let's take a look at a vastly different item with an ability: items.

    begindefineitem 60;
        import = 0;
        it_name = "Stick";
        it_graphic_sheet = 0;
        it_which_icon_ground = 2;
        it_which_icon_inven = 3;
        it_variety = 3;
        it_ability = 0;
        it_level = 1;
        it_value = 0;
        it_weight = 20;
    begindefineitem 61;
        // imported for blades
        it_name = "Dagger";
        it_graphic_template = 51;
        it_graphic_sheet = 4;
        it_which_icon_ground = 0;
        it_which_icon_inven = 1;
        it_ability = 2;
        it_level = 2;
        it_value = 20;
        it_weight = 40;
        it_can_augment = 1;

    The two items have different abilities, each corresponding to different melee attack abilities. The dagger, of course, has a higher level than the stick. The dagger also has something new: it_can_augment. This determines whether an item may be enchanted. In many cases, you will (of course) not want this to be enabled, like with potions, charms, and the like. It can also be used to limit the power of certain already powerful items by disabling augments for them. Remember, of course, that if enchanting is enabled for an item, any item after it will also be able to be enchanted until either a non-enchantable item is imported or until it_can_augment is set to 0.

     

    Finally, let's take a look at batons.

    begindefineitem 90;
        import = 0;
        it_name = "Thorn Baton";
        it_graphic_sheet = 3;
        it_which_icon_ground = 4;
         it_which_icon_inven = 5;
        it_variety = 3;
        it_ability = 50;
        it_level = 2;
        it_value = 24;
        it_weight = 25;
        it_charges = 6;
        it_extra_description = 11;

    Most of this should look fairly familiar by now. I would, however, draw your attention to two things. One, the charges on the item are set to 6, i.e. the ammo of the item. I do not know whether increasing this will make the ammo clips restore more, but I do know that setting it to less than 1 should make it have unlimited ammo and not need to be reloaded (the primary basis of one of the currently extant Geneforge mods, artifact batons). Secondly, take careful note of the ability here. This can, in fact, be set to any ability: you could make a baton (or wand) which shoots purifying rain or kill.

     

    Finally, let's take a look at the abilities. For the most part, you won't want to create new abilities from scratch. Rather, you should alter or copy an existing ability and use it for your purposes. So, we will just look at essence orbs and firebolt, as well as a custom ability we can derive from them.

    begindefineability 3;
        // Basic missile -> radiate cloud for importation
        ab_name = "Firebolt";
        ab_abil_type = 2;
        ab_graphic_type = 0;
        ab_missile_short_range = 1;
        ab_missile_type_fired = 0;
        ab_impact_sfx_effect = -1;
        ab_random_effect_shift = 0;
             ab_stat_ability_linked_to = 40;
          ab_stat_for_ability_bonus = 9;
             ab_damage_type = 2;
        ab_effect_type = 0;
        ab_effect_base = 4;
        ab_effect_per_level = 3;
             ab_ability_sound = 191;
        ab_impact_sound = 9;
        ab_energy_cost = 4;
        ab_essence_cost = 0;
        ab_accuracy_adjust = 60;     
    
    begindefineability 5;
        import = 3;
        ab_name = "Essence Orbs";
        ab_missile_type_fired = 5;
             ab_stat_ability_linked_to = 45; 
        ab_stat_for_ability_bonus = 9;
        ab_damage_type = 1;
        ab_effect_base = 20;
        ab_effect_per_level = 5;
             ab_num_of_missiles = 3;
        ab_ability_sound = 107;
        ab_impact_sound = 117;
        ab_energy_cost = 75;
        ab_essence_cost = 4; 

    The ability name here does not change the name of the spell in the magic selection menu. However, it does change its name in items (e.g. crystals) and in the text box at the bottom of the screen when you are targeting enemies.
    ab_impact_sfx_effect indicates the effect (e.g. a puff of fire) played on impact. -1 indicates no SFX should be played.
    ab_stat_for_ability_bonus indicates what ability makes the spell more powerful. In this case, it is battle magic, but you could make spells that are even leadership-based or mechanics-based.
    ab_effect_type indicates what kind of special effect (e.g. acid, lightning aura) the attack should have.
    ab_damage_type indicates what kind of damage (e.g. fire, energy) the attack should do.
    ab_effect_base indicates the base power of the spell, and ab_effect_per_level indicates how much a higher spell level should improve it.
    ab_energy_cost and ab_essence_cost determine ability energy and essence requirements.
    ab_accuracy_adjust does something to mess with the (base?) accuracy of an ability.
    ab_missile_type_fired, for missile attacks, determines what kind of missile is fired (i.e. appearance).
    ab_num_of_missiles determines the number of missiles that can be launched (i.e. essence orbs firing multiple orbs).


    Fun fact: burning spray has this.

    ab_num_of_missiles = 3;
     // ###this working?

    Poor Jeff.

     

    ab_ability_sound and ab_impact_sound indicate the sound played when the spell is launched and when it hits, respectively.Here is an example spell you can construct: my OP plasma lance spell from the Geneforge 4 Artifact Weapons mod.

    begindefineability 8;
        import = 3;
        ab_stat_ability_linked_to = 45; 
        ab_stat_for_ability_bonus = 9;
    
        ab_damage_type = 1;
        
        ab_ability_sound = 107;
        ab_impact_sound = 117;
    
        ab_energy_cost = 100;
        ab_essence_cost = 5;
    
        ab_abil_type = 3;
        ab_missile_type_fired = 7;
    
        ab_name = "Plasma Lances";
        ab_damage_type = 1;
        ab_effect_base = 40;
        ab_effect_per_level = 15;    
        ab_num_of_missiles = 3;
        ab_accuracy_adjust = 100;

    This creates a powerful attack that scales very well with level and has good base accuracy. It uses the pretty graphics of diamond spray and the base provided by diamond spray and essence orbs.

     

    This concludes the item, creature, and ability section of the tutorial. Stay tuned for whenever the Geneforge Modding Suite is finished in the next several years.


  10. Part 2 link.

    Useful information:

    Ability and stat ID list

     

    Welcome to my Geneforge modding tutorial. In this, we will be focusing on modding Geneforge 5, but the same principles underlying this apply to the entire series. Despite the minor differences between the definitions files and scripts of older and newer games, you can still apply this modding knowledge to older games (especially Geneforge 4, which is nearly identical to Geneforge 5 in terms of design and mechanics).

     

    Zone Script Editing:
    In each game's scripts folder, a zone has two separate scripts: the zone script and the dialog script. For example, the first zone in Geneforge 5, the Pacification Fields, has two zone scripts: z0pacific.txt and z0pacificdlg.txt. The first one holds data on the zone itself. This includes such things as event keys, such as cutscenes and mob states, as well as definitions for 'special' locations (for example, areas where dialog is triggered when you enter them) and the text that shows up above creatures' heads and above the text box at the bottom of the screen. Let's take a look at some parts of z0pacific.txt.

    beginzonescript;

    This indicates the beginning of the script. Without this, the script will not load properly.

    variables; short crime_tolerance = 5;  short last_abil;  short i;  short roamer_warn = 0; short cutscene = 0;  short kludge_count = 0; 

    This defines variables for local zone data. This includes how much you can steal before you get in trouble (crime_tolerance) as well as various variables for zone status. 'short' is a variant of number, technically a 16-bit integer, ranging from about -33000 to about 33000.

    body;
    beginstate INIT_STATE;

    Body defines the actual content of the zone script. The INIT_STATE defines how the zone behaves when first created, as player interactions can change it. Inside the zone are such things as:

    set_level(37,3);
    set_name(38,"Crazed Roamer");
    set_aggression(38,7);
    change_max_health(38,120);

    These set data on creatures by their universal ID in the game. This can only be determined by experimentation with modified scripts in-game. In order, they set creature 37 to be level 3, set creature 38 to be named "Crazed Roamer", set its aggression to '7' (likely a state of hostility with lower awareness) and its max health to 120. You will also note that each line is terminated with a semicolon. This is important.

    if (get_sdf(1,6) > 0) {         make_zone_hostile();         }

    This causes the zone to be hostile if a given SDF (a stuff done flag, which stores universal data across all zones) is true.

    set_crime_tolerance(crime_tolerance);

    This sets the crime tolerance to be what was previously defined.

    break;

    This finishes defining the state.

    beginstate EXIT_STATE; break;

    This defines the exit state, which is empty in this zone.

    beginstate START_STATE;

    This defines the start state. In this section are the tutorial guides from the beginning of the game, i.e. gathering your weapons and armor.

    This section checks whether the flag for having equipped an item (ID 61) has been set and whether it is equipped. If so, the flag is set (so it cannot constantly repeat) and the map tells you to search for the armor in the storeroom.

    if ((get_flag(0,7) == 0) && (has_item_equip(61))) {         
    	set_flag(0,7,1);         
        set_terrain_string_range("Now that you have a weapon, search the locker in the back of the storeroom. Click on a locker, box, or other container to open it.",3);         

    When the zone has been sufficiently completed, that is, when these conditions are met, the zone is set to have been cleared. In this case, it checks to see if the zone has not already been cleared and if a given flag is set. Take note also of the //, which comments out a line. In this file, lines are split by tabs, so only the // clear zone? is commented out. Comments do not impact the script at all.

    // clear zone? 
    if ((zone_clear(ME) == FALSE) && (get_flag(0,25) > 0)) {
    	print_str_color("Now that this door is open, you can pass this area freely.",2);
        clear_zone(ME);
        }

    This part checks to see if your crime level exceeeds the tolerance of the zone (and hence you could make an extremely crime-tolerant zone by raising crime tolerance to absurd levels) and, if it does, causes the zone to be hostile. In this case, you will notice that an SDF is also being checked. This checks whether you just automatically die, as happens when you anger the zone before being able to leave the Greyghost mountains.

      if ((get_crime_level() >= crime_tolerance) && (get_sdf(1,6) == 0)) {
      	make_zone_hostile();
     	set_flag(1,6,1);
      }
      if ((gf(1,6) > 0) && (gf(2,1) < 2))
      	begin_talk_mode(290);

    This performs a check on a random (get_ran) and, if it is an acceptable value, makes a creature (in this case the artila in a side room) hiss.

        if (get_ran(1,0,100) < 10)
        	give_char_text_bubble(36,"Sss.");

    Here, the actions in the final cutscene occur. If the cutscene has not yet occurred (gf(0,1) == 0), it checks to see whether creature 50 (the vlish) is dead (char_ok(50) == FALSE) or (the characters || mean a logical OR, while && means AND) its health is below one half, it starts a cutscene, spawning Rawal and moving him around before finally murdering everything.

     

    Spoiler

     

    
    // FINAL CUTSCENE
    if (gf(0,1) == 0) {
    	if (((char_ok(50) == FALSE) || (get_health(50) < get_max_health(50) / 2)) && (party_near_nav(5,15))) {
        	sf(0,1,1);
            if (cutscene == 0) {
            	cutscene = 1;
                shift_view_to_char(pc_num());
                char_clear_action(1000);
                toggle_cutscene(1);
            }
         }
    } else if (cutscene == 1) {
    	cutscene = 2;
        kludge_count = 0;
        begin_talk_mode(12);
    } else if (cutscene == 2) {
    	move_to_loc(0,14,47);
        move_to_loc(1,15,46);
        move_to_loc(2,14,45);
        move_to_loc(3,16,45);
        move_to_loc(4,13,44);
        move_to_loc(5,15,44);
        move_to_loc(6,17,44);
        move_to_loc(7,15,43);
        move_to_loc(8,10,47);
        kludge_count = kludge_count + 1;
        if ((kludge_count >= 8) || (cutscene_can_proceed())) {
        	kludge_count = 0;
            set_facing(1000,3);
            set_facing(8,3);
            shift_view_to_char(pc_num());
            cutscene = 3;
        }
    } else if (cutscene == 3) {
    	cutscene = 4;
    } else if (cutscene == 4) {
    	cutscene = 5;
        sf(0,28,1);
        spawn_creature(51);
        begin_talk_mode(13);
    } else if (cutscene == 5) {
    // kludgy emergency stuff. had errors where this scene broke, think is
    // fixed, but taking extra steps to keep it safe
    	sf(0,28,1);
        if (char_ok(59) == FALSE)
        	spawn_creature(51);
        cutscene = 6;
    } else if (cutscene == 6) {
    // kludgy emergency stuff
    	sf(0,28,1);
        if (char_ok(59) == FALSE)
        	spawn_creature(51);
            cutscene = 9;
    } else if (cutscene == 9) {
    	move_to_loc(59,12,48);
        if ((char_ok(59) == FALSE) || ((dist_to_nav_point(59,5) <= 5) && (cutscene_can_proceed()))) {
        	set_facing(59,7);
            shift_view_to_char(59);
            cutscene = 10;
        }
    } else if (cutscene == 10) {
    	cutscene = 11;
        if ((cutscene == 11) && (char_ok(50) == FALSE) && (num_chars_in_group(4) == 0)) {
        	cutscene = 16;
        }
    } else if (cutscene == 11) {
    	cutscene = 12;
        begin_talk_mode(14);
    } else if (cutscene == 12) {
    	give_char_text_bubble(59,"I absorb you!");
        run_a_char_animation(59,5,1,50);
        run_sparkles_on_char(59,5,12,1);
        cutscene = 13;
        play_sound(238);
    } else if (cutscene == 13) {
    	cutscene = 14;
        give_char_text_bubble(59,"I absorb you!");
    } else if (cutscene == 14) {
    	give_char_text_bubble(59,"");
        kludge_count = kludge_count + 1;
        if ((kludge_count >= 6) || (cutscene_can_proceed())) {
        	cutscene = 15;
            run_sparkles_on_char(1004,170,1,3);
            run_sparkles_on_char(50,170,1,3);
            damage_char(1004,1000 + get_ran(1,0,200),2);
            damage_char(50,1000 + get_ran(1,0,200),2);
        }
    } else if (cutscene == 15) {
    	if ((kludge_count >= 6) || (cutscene_can_proceed()))
        	cutscene = 16;
        if ((cutscene == 16) && (num_chars_in_group(0) == 1)) {
        	cutscene = 24;
        }
    } else if (cutscene == 16) {
    	cutscene = 17;
        begin_talk_mode(15);
    } else if (cutscene == 17) {
    	run_a_char_animation(59,5,1,50);
        run_sparkles_on_char(59,5,12,1);
        play_sound(238);
        cutscene = 18;
    } else if (cutscene == 18) {
    	cutscene = 19;
    } else if (cutscene == 19) {
    	kludge_count = kludge_count + 1;
        if ((kludge_count >= 8) || (cutscene_can_proceed())) {
        	cutscene = 20;
            i = 0;
            while (i < 8) {
            	if ((char_ok(i)) && (pc_num() != i)) {
                	run_sparkles_on_char(i,170,1,3);
                    damage_char(i,1000 + get_ran(1,0,200),2);
                }
                i = i + 1;
            }
        }
    } else if (cutscene == 20) {
    	if ((kludge_count >= 8) || (cutscene_can_proceed()))
        	cutscene = 24;
    } else if (cutscene == 24) {
    	cutscene = 25;
        begin_talk_mode(16);
    } else if (cutscene == 25) {
    	move_to_loc(8,12,59);
        kludge_count = kludge_count + 1;
        if ((kludge_count >= 8) || (cutscene_can_proceed())) {
        	erase_char(8);
            cutscene = 26;
        }
    } else if (cutscene == 26) {
    	cutscene = 27;         
    } else if (cutscene == 27) {
    	cutscene = 28;
        begin_talk_mode(170);
    } else if (cutscene == 28) {
    	move_to_loc(59,12,59);
        give_char_text_bubble(59,"On to the next mess ...");
        if ((char_ok(59) == FALSE) || (dist_to_zone_loc(59,12,59) <= 1) || (cutscene_can_proceed())) {
        	erase_char(59);
            cutscene = 29;
        }
    } else if (cutscene == 29) {
    	cutscene = 30;
        toggle_cutscene(0);
        shift_view_to_char(pc_num());
    }

     

     

     

    break;

    The INIT_STATE finishes with another break.

    At the end of the file, a number of states are defined. Here, interactions with certain objects are defined, as well as extra tutorial information for the player.

    Spoiler
    
    beginstate 10;     if (gf(0,1) == 0)     set_terrain_string_range("Get comfortable with moving your character around. You can also select a character by drawing a box around it. Move the cursor onto the terrain, hold the mouse button down, and move the cursor to make the selection box.",7); break; beginstate 11;     activate_hint(5); break; beginstate 12;     if ((gf(0,7) > 0) && (gf(0,25) == 0)) {         sf(0,25,1);         give_object_message(26,103);         give_object_message(27,103);         }     break; beginstate 13;     if (gf(0,11) == 0) {         sf(0,11,1);         if (gf(0,2) == 0) {             sf(0,11,2);             begin_talk_mode(57);             }                      } break; beginstate 14;     if (gf(0,14) == 0) {         sf(0,14,1);         if (gf(0,2) == 0) {             sf(0,14,2);             begin_talk_mode(86);             }                      } break; beginstate 15;     clear_hints();     if (gf(0,15) == 0) {         if ((num_chars_in_group(0) > 1) && (gf(0,2) > 0)) {             sf(0,15,1);             }             else sf(0,15,2);         } break; beginstate 16;     if (gf(0,1) == 0)         set_terrain_string_range("This massive door blocks the way to the research warrens. It is sealed. You can't open it from this side.",3); break; beginstate 17;     set_terrain_string_range("The sign says - RESEARCH WARREN CORE.",3); break; beginstate 18;     activate_hint(11); break; beginstate 19;     if ((gf(0,20) == 0) && (char_ok(38)) && (gf(0,1) == 0) && (gf(0,21) == 0)) {         sf(0,20,1);         begin_talk_mode(125);         } break; beginstate 20;     if ((char_ok(38)) && (roamer_warn == 0)) {         roamer_warn = 1;         begin_talk_mode(9);         } break; beginstate 21;     roamer_warn = 1; break; beginstate 22;     if (gf(0,23) == 0) {         sf(0,23,1);         set_terrain_string_range("One useful tip: When you hold down the Tab key, you will see labels for all of the buttons (as well as other useful information). Try it out.",3);         } break; beginstate 23;     if ((char_ok(38)) && (get_attitude(38) < 10) && (gf(0,21) == 0)) {         print_str_color("When you get close to the rogue roamer, it starts to notice you.",2);         set_attitude(38,10);         } break; beginstate 24;     sf(1,21,1); break; //    print_str(""); //    set_terrain_string_range(".",3); //    set_terrain_string_range("The sign says - .",3);

     

    Dialogue Scripts:

    The dialogue script, z0pacificdlg.txt, is much more readable. It starts in a similar way.

    begintalkscript;
    
    variables;

    Dialogue is split up into a set of talk nodes, each of which is defined by begintalknode;. There is a limit to the number of these you can have, although I'm not entirely sure how many are possible in total (per zone), but I believe you can have at least 200 per zone. Let's take a look at the first talk node.

    begintalknode 1;
        state = -1;
        nextstate = 180;
        condition = get_sdf(0,5) == 0;
        question = "special";
        text1 = "As you stumble through the barracks, your head clears. A tiny bit.";
        text2 = "It looks like you have been living cramped in here with a dozen serviles, the short, humble servant race of the Shapers. It is peculiar. Why would a human be left to live in squalor with them?";
        text3 = "Also, your clothes are unusual. They seem like the outfit of someone in authority, perhaps a soldier or a Shaper. They are ill-fitting and torn, though. And in need of a wash.";    
        text4 = "It looks like you have been living cramped in here with a dozen serviles, the short, humble servant race of the Shapers. Since you are a servile yourself, that seems like it would make sense.";
        text5 = "And yet, it doesn't feel right. The Shapers keep their serviles ignorant and terrified of authority. Somehow, you know that you deserve better than to be living in this squalor.";
        text6 = "The sounds of chaos and panic coming from outside are showing no signs of ending. You start to look around for something you can use to defend yourself.";
        action = SET_SDF 0 5 1;
        code =
            if (creature_type(pc_num()) == 46) {
                rs(2);
                rs(3);
                }
                else {
                    rs(4);
                    rs(5);
                    }
            sf(97,0,100);
        break;

    The state is, in a way, the address of the talk node. The nextstate value indicates the state of the next node in the 'series'. A state of -1 or nextstate of -1 indicates, respectively, that the talk node is the first in a conversation or the last. In this case, we have a modified dialogue script where the nextstate points to my Geneforge 5 character editor for testing purposes. Consequently, anything with state = 180 will show up as a conversation option in the list here. 

     

    Note: In this scripting language (which appears to basically just be C++), the comparison to see if something is equal is ==. A single = is used to set a value, e.g. short value = 1. Condition indicates whether the talk node can be reached. If it's an option in conversation, condition will determine whether the node will show up in the list of responses. 'Question' indicates the text of the option in the conversation list. when a talk node starts as the result of - for example - talking to a creature or object, the question is named "special". In a dialog list, the question would be whatever the player says or does, e.g. "Continue.", "Nevermind.", "Did that creation just say yanny or laurel?", etc.

     

    There follows a list of text items. Each is printed out in the dialog box, one after another. You can safely have--at most--8 text options. However, I would advise sticking to a maximum of 8. The lines of text of a few important characteristics. One, and this is very important, the length of the 'string' (that is, a section of text) cannot exceed 256 characters. If you attempt to do this, the dialog script will break. Secondly, as the string is enclosed in quotes, if you want to have quotes inside the text itself, you need to put underscores. That is, if you wanted to print out "Hail and well met," the cow said., the associated string would be "_Hail and well met,_ the cow said." Finally, the quotes enclosing the string are not optional. They indicate its beginning and end.

     

    The action can do a few different things. For the most part, you'll probably want no action. However, when you want the conversation to terminate on this option, you will want to set action = END_TALK;. You should also set state to -1 for this. You can also, as this conversation does, set an SDF. You can do literally the exact same thing in the code section, except with multiple stuff done flags, so I personally do not see any reason to use this. Take a look at the various dialogue scripts to find what various other ones do.

     

    The final section is the (optional!) code block. In this, you can do all the coolest things in a conversation. In this case, there are two functions being used. rs(number) removes a string with the appropriate number inside it. For example, rs(2) removes text2. In this case, it is being used to display different strings for serviles versus every other class. The other function is sf, which sets a flag (gf, for reference, gets the value of a flag). In this case, flag 97 0 is being set to a value of 100. There are various other things you can do here, including but not limited to:


    Give items with reward_give(item id number);
    Give special items with set_spec_item(special item id, number);
    Give the party XP with award_party_xp(amount,level of xp); (if you want the XP to scale with the PC's level, use get_level(pc_num()) for the 'level of xp' parameter).
    Alter the PC's stats with alter_stat(stat id, amount to increase);

     

    In this last case, the PC's stats include not only attributes and skills, but also spell and creation levels and resistances. A partial list of the different stat IDs is:

     

    Spoiler

     

    0: Strength
    1: Dexterity
    2: Intelligence
    3: Endurance

    4: Melee Weapons
    5: Missile Weapons
    6: Quick Action
    7: Parry 

    9: Battle Magic
    10: Mental Magic
    11: Blessing Magic
    12: Spellcraft

    15: Fire Shaping
    16: Battle Shaping
    17: Magic Shaping
    18: Healing Craft

    20: Leadership
    21: Mechanics
    22: Luck

    40-49: Battle Magic Spells
    50-59: Mental Magic Spells
    60-69: Blessing Magic Spells
    70-79: Healing Craft Spells

    80-84: Fire Creations
    85-89: Battle Creations
    90-94: Magic Creations
    95: Ornk

     

     

    The code block is terminated by a break statement. Talk nodes without code do NOT have break statements.

     

    This concludes the script editing portion of the tutorial. Stay tuned for the definitions tutorial, where we will learn how to modify items, spells, and creations.


  11. Well, if you're willing to wait for about a year, the Geneforge Modding Suite will probably have script editing.

     

    But in seriousness, scripts are fairly easy to edit. You need to go to the ...Geneforge 5\Geneforge 5 Files\Scripts folder.

    gf5objsmisc.txt holds the scripts for spells. gf5itemschars.txt holds the script information for creatures. At begindefineability 23 and begindefineability 24 are the spells for Drakon (and also Drayk, keep in mind) and Ur-Drakon fire. The Drakon creature is at begindefinecreature 220 while the Ur-Drakon is at begindefinecreature 223 or begindefinecreature 224 (probably should change both to be safe).

     

    The G2/3/4 scripts have similar names (except gf2/3/4 instead of gf5), and you can search in the file for the appropriate weapon/creature information.

     

    All scripts can easily be edited in notepad.


  12. 1 hour ago, Adrian11 said:

    copying and pasting the first and last frames to make the G4 asset 6 frames long

    This is the only way you can do it. Unless you think you can edit the G4 sprite frame to correspond to the frames you need to fill.


  13. 4 hours ago, Adrian11 said:

    Could you make a mod to replace G5 the drakon/ur-drakon with the model and abilities of the G2/G3 drakon and ur-drakon? Because IDK what Jeff was smoking when he nerfed them and replaced the model with what looks like a McDonalds toy that survived a factory fire.

    If you would like to do it yourself, it'd be fairly simple. Find the graphics from G2/3/4 for the Drakon in the appropriate data folder, and copy the images for the Drakon in the G5 folder. You may need to save the image file in 256 colors for it to work correctly, although G5 is new enough that it may not be necessary. Also, I do not quite recall, but the Drakon may be a different size in G5, in which case you'd need to mess with the images you're copying a little.

     

    To give them the same abilities, just look the character and spell definitions files, find the associated data (it looks like a mess, sure, but it's actually pretty simple) and alter the G5 version to correspond to the G2/3/4 versions.

     

    The spells will never look the same, though, because Jeff went back to proper projectiles instead of the expanding-spray thingy of G2/3.


  14. To put it explicitly*, there does not exist data in the game for zones past that point. However, there may exist a zone exit on the map past the gate, but if it goes anywhere, it will likely take you to Southforge Citadel or some kind of blank glitch zone.

     

    *Meaning clearly, not inappropriately

     

    Probably don't have the time to make a mod for that, unfortunately, Alhoon. Little bit busy with a bunch of other things, sorry.


  15. As we have nothing better to do, we have made a number of threads with various theories on the fates/origins of characters (primarily the Geneforge 5 protagonist, for obvious reasons). If you're interested in them, there is a reasonable amount of vaguely coherent conspiracizing theorizing and in-depth lore assessment. I've made a couple threads on Geneforge lore / the first game's protagonist, so if you're interested, there are those too. However, as Lilith says, the general view tends toward Monarch being the Geneforge 3 player.


  16. On 3/20/2018 at 9:27 PM, Aleister said:

    Fare points for sure, but yes I think everyone agree's there are a few slight mismatches in the series we'd hope to see patched

    ...I am fairly sure it is INTENTIONAL, so as to make no single ending completely canon, so nobody feels 'forced' to play it a certain way.


  17. On 3/19/2018 at 3:37 AM, Lilith said:

     

    You don't have to kill him in G3, depending on what route you're playing on. It's true that the events leading up to a game don't line up perfectly with any one particular route from the previous game, though.

     

    Personally, my thoughts on this are that you never actually SEE Khyryk die. You just see a bunch of exploded something from a -supposed- failed teleport. He probably just sacrificed some poor servile or something and teleported away.

×