Jump to content

Fort

Member
  • Posts

    1,418
  • Joined

  • Last visited

    Never

Everything posted by Fort

  1. I think the absolute first thing that made me cringe when I tried to do anything in the editor was when I realized how difficult drawing walls was in comparison to BoE walls. You might see that the wall being a terrain issue as a bad limitation for what you can do in a room, but how often have you ever thought (when playing any of the Avernum games) that the rooms look terrible because there wasn't sufficient decoration?
  2. I believe the problem IS Windows 98SE. Err, did you try reinstalling? Checking error logs? Turning off all background programs? Changing resolution? Removing unwanted programs from your computer?
  3. Interesting that you noticed this effect with simple One Shot specials. Something that DOES slow down the engine is pathing to an impossible spot when the monster has many fake options to try. For example, pushing 3 or 4 creatures away from their starting points and locking them out will cause the game to slow down horribly.
  4. Whn i scrounge my 30 $$$, my scen will rock all of U!!!! By the way, is everything working now, AM?
  5. The set_creature_type_level() call only takes affect when you load the scenario, so its affect isn't shown in the scenario editor. Items that the creature had before it died are what are dropped. The default items that you are describing are part of the huge script that defines all the original monsters, items, floors, and terrain.
  6. Let him create whatever he wants, within reason. If no one plays it, I'm sure the world was worse off without it.
  7. I think that Jeff erred on the side of using if (condition) end() if (condition) {stuff} because that is the direct translation of "if ... then ... otherwise ..." in BoE. I E-mailed this to Jeff and he said that the code is stored in memory and the code IS NOT interpreted, just scanned through for the closing brace. While this takes up some CPU time, I'd think this would be equivalent to doing a spell check in a word processor. As a note, don't use end() in a creature script for various reasons.
  8. No, you don't. Be sure not to confuse state with cell, by the way. There are 9000 SDFs, and the number that associates itself with a monster's wellbeing is its global (as opposed to local) ID, not an SDF. As a side note, all memory cells for terrain scripts and creatures default to 0, so you can't have SDF 0,0 set from any of the default scripts. I think it is best to use 0,0 for the flag for the intoductory message in your scenario.
  9. In A3, you just need to complete the Slime's plague and collect the evidence of Erika Redmark's mark in the tunnel to the north of the Alien Slime's chambers. Then you give the evidence to Berra in Fort Emergence after collecting all feasible rewards. The rest of the events should be explained to you by the game. In A1, you need a boat to the Northern Isles, or whatever they are called. It is not an easy journey, since you need to get the boat from the Giants. In specific, you need to go to the Giant's Castle east of Bargha and get trapped in the basement. Get out, but be sure to kill the chief AND take the wrought iron Giant's key. Proceed to the giant Giant's outdoor gate and unlock it. Grab an oversized boat and have fun. Be sure to explore ALL the little islands. I believe the tower is in the same spot in A2, although I wouldn't have the slightest clue as to how to get there, seeing as though I don't have the game.
  10. Every memory cell is a chunk of memory that can be set INSIDE the editor (it is an integral part of every creature), and will always have that value when the object is initialized. The purpose of memory cells is to allow us, the designers, to pass paramters to the scripts and to store that kind of information directly inside of the lades of [A]vernum cenario file. But, I'm pretty sure what you mean is what each memory cell is 'supposed' to represent. Basicnpc.txt (the default script for every creature) designates memory cell 0 as the movement type, cell 1 and cell 2 as the SDF to be set upon creature demise, and cell 3 for the dialogue node to be activated when the creature is talked to. Look inside the script in question because there are usually comments to tell you what each memory cell is for.
  11. You can make a town friendy by setting its status to 1 when you are OUTSIDE of the town. Strange things might happen otherwise. If you want the people to suddenly like you again, you will have to cycle through all the creatures and make them friendly with a loop.
  12. I don't remember in what Avernum game, but there was one encounter where you got really drunk and had to fight some creatures. I remember that the creatures were magically resistant, but the drunkness made my fighters inept... Can anyone refresh my memory about this? Actually, it might have been an Exile game with curses, I don't remember.
  13. If you don't mind wearing out the spring of your keyboard, stick a weight onto the 'r' button with lots of food and just wait it out. Tricking the computer to believe that you are constantly waiting will prove to be much more difficult, but it is better than the crude method described above. By the way, shouldn't you get a little more levels before wanting to go murder the demons? It sounds like you are level 10, and you have a craving for demonic pseudo-flesh.
  14. Variables are saved, don't worry about that one too much.
  15. There are several things that cause horrible errors like this. Outrageously out of range numbers and giving the wrong kinds of items to certain monsters don't work well with the game. There is a small possibility that the file is corrupted, although it is probably something you did in the town. Check to see if the scenario works fine without Town 4, and then add it back in.
  16. So, what you are saying is that you want to document the previous value of a flag when you enter a town in which you want to reuse certain flags, and then it is reset when exited. For all practical purposes, the flag's scope will only be inside the town. You should remember that there is a limit to how many variables you can declare in a single script, but this could be useful for those who like to have multipurposes for flags. Warn players about forcefully leaving the town with the editor. EDIT: Now for my personal opinion: I do not think that this is a good idea. You have up to 30 flags for each town number + outdoor sections. Mind you that you can have 100 outdoor sections, and even the largest scenarios didn't have that many, though the flags will still be there. I like running the extra flags in town over to the flags for outdoor sections that don't exist.
  17. Be careful with the text bubbles; they can only be 38 characters in length, although you may have already checked up on that.
  18. I do not blame you for not understanding Jeff's manual. Some things are phrased very badly, like this: ==== Issuing a begindefine command does not just tell the program you are starting to change a thing. It also makes that thing a copy of the thing of that type you last edited. In other words, if your script contained these commands: begindefinefloor 135; (a bunch of stuff) begindefinefloor 136; // no extra data begindefinefloor 137; ==== This would be better phrased as: A begindefine[object] command tells the program that everything after it modifies that [object]. But it also copies all the information from the previous [object] into the current one. This was done to make repetitive objects more easily. For example, take this code excerpt for townfolk: begindefinecreature 74; clear; cr_name = "Townsman"; cr_level = 2; cr_start_item 0 = 19; cr_start_item_chance 0 = 100; cr_start_item 1 = 20; cr_start_item_chance 1 = 100; cr_start_item 2 = 46; cr_start_item_chance 2 = 100; cr_default_attitude = 2; cr_which_sheet = 1503; cr_small_or_large_template = 1; cr_default_courage = 0; begindefinecreature 75; // the information from the above creature has been copied into the current one cr_name = "Townswoman"; // just change the name cr_which_sheet = 1504; // change the graphic begindefinecreature 76; // the information from creature 75 has now been copied into 76 cr_name = "Townsman"; // name changed, but everything stays the same, etc. cr_which_sheet = 1506; begindefinecreature 77; cr_name = "Townswoman"; cr_which_sheet = 1505; begindefinecreature 78; cr_name = "Townsman"; cr_which_sheet = 1575; begindefinecreature 79; cr_name = "Townswoman"; cr_which_sheet = 1576; Defining the default courage, level, items, and such would have been very lengthy and a waste of space for such similar creatures.
  19. Bump. Oh, yes, and do you think the 20 turn wait is a little much? EDIT: I just read something disturbing in Kelandon's latest article and decided to whip this slightly modified version of the script together. My computer is an Athlon 64 3000+ with 512 MB of DDR400 RAM and a NVGF 5200 VC, so I can't really tell the difference myself, I'm afraid. Code: // groupguard.txt v1.03b// by Keep[EZ] <net4less@sbcglobal.net>// Version 1.0 - Released July 23, 2004, ready for test in the wild// Version 1.03 - Fixed quite a things that were really bugging me// Version 1.03b - Is there a performance difference between 1.03 and 1.03b?// A more advanced guard script. Retains all the functionality of the original// while giving it the ability to work together with other guards. When attacking,// the guard will issue a call out to all the other characters in its group, which// will hopefully respond by coming to its aid. When the guard receives a message,// he will attempt to approach the calling character while noting the distressed// character's latest location. If that character should die, the guard still tries// to go to the deceased's position. For no real reason except to make the guards// more lively, I made them fidget and patrol much more often. These guards will drop// treasure unless you change the summon level line in the INIT_STATE. These guards// won't actively hunt down the party, though they will be alerted, and as a side// effect, will automatically target the party if there is no other choice.// Memory Cells:// Cell 0 - How creature moves.// 0 - If 0, wander randomly. // 1 - Stands still until a target appears.// 2 - Completely immobile, even if target appears.// 3 - Walk to a waypoint and then back to start. Use Cell 4 to// indicate a waypoint.// Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this // is killed, set to 1.// Cell 3 - Dialogue node to start with if talked to. if left at 0, this // character doesn't talk.// Cell 4 - If Cell 0, is not 3, this value is ignore. Otherwise, it is // the number of a waypoint. This guard spends its time walking to that// waypoint and back.// Cell 9 - The group this guard belongs to; has to be 1-7// Even if it isn't part of a group, the guard will still resond to ANY messages given// to it so be careful when using this script along with other scripts that broadcast.// If the guard is not part of a group, it will broadcast to creatures within 16 spaces.begincreaturescript;variables;// loc_x and loc_y contain the coordinates of the character the guard is trying to help// time_after counts how many turns have passed since the guard has had no one to helpshort i,loc_x,loc_y,time_after = 0;short gone_to_waypoint = 0;short helping_char = -1; // the character that called for helpshort no_message = 0; // counts how many turns the guard has had no messagesbody;beginstate INIT_STATE; if (get_memory_cell(0) == 2) set_mobility(ME,0); set_char_script_mode(ME,1); // act even at distance if ((get_memory_cell(9) <= 7) && (get_memory_cell(9) > 0)) add_char_to_group(ME,get_memory_cell(9)); if (get_attitude(ME) >= 10) set_mobility(ME,1); set_summon_level(ME,0); // change 0 to 1 if you don't want the guard dropping treasure break;beginstate DEAD_STATE; // Set the appropriate stuff done flag for this character being dead if ((get_memory_cell(1) != 0) || (get_memory_cell(2) != 0)) set_flag(get_memory_cell(1),get_memory_cell(2),1); if (what_group_in(ME) > 0) { // dying call for help alert_char(1000 + what_group_in(ME)); give_char_message(1000 + what_group_in(ME),my_number()); } else broadcast_message_from_x_y(my_loc_x(),my_loc_y(),my_number(),16);break;beginstate START_STATE; // Has the town gone hostile? if (get_attitude(ME) >= 10) { alert_char(ME); set_mobility(ME,1); } // if I have a target for some reason, go attack it if (target_ok()) { if (dist_to_char(get_target()) <= 16) set_state_continue(3); else set_target(ME,-1); } // Look for a target, attack it if visible if (select_target(ME,8,0)) { set_state_continue(3); } // Have I been hit? Strike back! if (who_hit_me() >= 0) { set_target(ME,who_hit_me()); set_state_continue(3); } // If I have a message, go help the character whose number is the same as the message // Otherwise, just peacefully move around. Go back to start, if I'm too far // from where I started. if ((my_current_message() >= 0) && (helping_char == -1)) { // current message will keep changing, so helping_char stores the first message helping_char = my_current_message(); no_message = 0; // automatically breaks the 'not having messages' streak/counter } if (helping_char >= 0) { set_state_continue(4); // state that deals with messages } if ((helping_char == -1) && (tick_difference(time_after,get_current_tick()) >= 10)) { // tick_difference thrown in to make sure he doesn't go away in case he's needed if (my_dist_from_start() >= 6) { if (get_ran(1,1,100) < 40) return_to_start(ME,1); } else if (get_memory_cell(0) == 0) { fidget(ME,100); } else if (get_memory_cell(0) == 3) { // march to waypoint and back if (gone_to_waypoint == 0) { if (approach_waypoint(ME,get_memory_cell(4),1)) gone_to_waypoint = 1; } else if (gone_to_waypoint == 1) { if (return_to_start(ME,1)) gone_to_waypoint = 0; } } } // if we're in combat and the above didn't give me anything to do, just // stop now. Otherwise, game will keep running script, and that eats up CPU time. if (am_i_doing_action() == FALSE) end_combat_turn();break;beginstate 3; // attacking if (target_ok() == FALSE) set_state(START_STATE); do_attack(); // give message every time when attacking and doesn't have anyone to help // NOTE: In general, this means that there will only be 1 broadcast every 7 // turns per group. if (helping_char == -1) { if (what_group_in(ME) > 0) { alert_char(1000 + what_group_in(ME)); give_char_message(1000 + what_group_in(ME),my_number()); helping_char = my_current_message(); print_named_str(ME,"calls for help!"); } else broadcast_message_from_x_y(my_loc_x(),my_loc_y(),my_number(),16); }break;beginstate 4; // if I had someone to help... if (helping_char != my_number()) { stop_moving(ME); // make sure he forgets the old path if (char_ok(helping_char)) { // document last location of helping_char while he's alive approach_char(ME,helping_char,1); loc_x = char_loc_x(helping_char); loc_y = char_loc_y(helping_char); } else { // else he died, so move to last known location helping_char = -1; if (move_to_loc_x_y(ME,loc_x,loc_y)) time_after = get_current_tick(); // time since there was no helping_char } } if ((my_current_message() == -1) && (am_i_doing_action() == FALSE)) { no_message = no_message + 1; if (no_message >= 20) { helping_char = -1; // if there was no messsage for 20 turns, probably no need to help anyone time_after = get_current_tick(); } } set_state(START_STATE);break;beginstate TALKING_STATE; if (get_memory_cell(3) == 0) { print_str("Talking: It doesn't respond."); end(); } begin_talk_mode(get_memory_cell(3));break;
  20. I'd imagine a self-employed mage who thinks he's better than he really is, and likes to live in seclusion by the ocean in a reclusive tower with brigands, a spiny worm, and lots of slimes to keep him company would love to call himself Slick. He sure got a deal on the fake estate. [party steps into secret inner sanctum] "Hi, I'm Slick. Want to be my friend?" [party leader shrugs, shoots arrow at Slick's head] "People that call themselves Slick don't deserve to live..."
  21. Every state is code, Overwhelming. You only need to use the code = thing inside of data files that allow scripting, which would currently only be dialogue ones.
  22. I also wonder why Jeff endorses that game. But, if the demo ran under XP, why doesn't the full version? Trying to access 9x libraries?
  23. Check out my first script! Code: // groupguard.txt v1.03// by Keep[EZ] <net4less@sbcglobal.net>// Version 1.0 - Released July 23, 2004, ready for test in the wild// Version 1.03 - Fixed quite a things that were really bugging me// A more advanced guard script. Retains all the functionality of the original// while giving it the ability to work together with other guards. When attacking,// the guard will issue a call out to all the other characters in its group, which// will hopefully respond by coming to its aid. When the guard receives a message,// he will attempt to approach the calling character while noting the distressed// character's latest location. If that character should die, the guard still tries// to go to the deceased's position. For no real reason except to make the guards// more lively, I made them fidget and patrol much more often. These guards will drop// treasure unless you change the summon level line in the INIT_STATE. These guards// won't actively hunt down the party, though they will be alerted, and as a side// effect, will automatically target the party if there is no other choice.// Memory Cells:// Cell 0 - How creature moves.// 0 - If 0, wander randomly. // 1 - Stands still until a target appears.// 2 - Completely immobile, even if target appears.// 3 - Walk to a waypoint and then back to start. Use Cell 4 to// indicate a waypoint.// Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this // is killed, set to 1.// Cell 3 - Dialogue node to start with if talked to. if left at 0, this // character doesn't talk.// Cell 4 - If Cell 0, is not 3, this value is ignore. Otherwise, it is // the number of a waypoint. This guard spends its time walking to that// waypoint and back.// Cell 9 - The group this guard belongs to; has to be 1-7// Even if it isn't part of a group, the guard will still resond to ANY messages given// to it so be careful when using this script along with other scripts that broadcast.// If the guard is not part of a group, it will broadcast to creatures within 16 spaces.begincreaturescript;variables;// loc_x and loc_y contain the coordinates of the character the guard is trying to help// time_after counts how many turns have passed since the guard has had no one to helpshort i,loc_x,loc_y,time_after = 0;short gone_to_waypoint = 0;short helping_char = -1; // the character that called for helpshort no_message = 0; // counts how many turns the guard has had no messagesbody;beginstate INIT_STATE; if (get_memory_cell(0) == 2) set_mobility(ME,0); set_char_script_mode(ME,1); // act even at distance if ((get_memory_cell(9) <= 7) && (get_memory_cell(9) > 0)) add_char_to_group(ME,get_memory_cell(9)); if (get_attitude(ME) >= 10) set_mobility(ME,1); set_summon_level(ME,0); // change 0 to 1 if you don't want the guard dropping treasure break;beginstate DEAD_STATE; // Set the appropriate stuff done flag for this character being dead if ((get_memory_cell(1) != 0) || (get_memory_cell(2) != 0)) set_flag(get_memory_cell(1),get_memory_cell(2),1); if (what_group_in(ME) > 0) { // dying call for help alert_char(1000 + what_group_in(ME)); give_char_message(1000 + what_group_in(ME),my_number()); } else broadcast_message_from_x_y(my_loc_x(),my_loc_y(),my_number(),16);break;beginstate START_STATE; // Has the town gone hostile? if (get_attitude(ME) >= 10) { alert_char(ME); set_mobility(ME,1); } // if I have a target for some reason, go attack it if (target_ok()) { if (dist_to_char(get_target()) <= 16) set_state_continue(3); else set_target(ME,-1); } // Look for a target, attack it if visible if (select_target(ME,8,0)) { set_state_continue(3); } // Have I been hit? Strike back! if (who_hit_me() >= 0) { set_target(ME,who_hit_me()); set_state_continue(3); } // If I have a message, go help the character whose number is the same as the message // Otherwise, just peacefully move around. Go back to start, if I'm too far // from where I started. if ((my_current_message() >= 0) && (helping_char == -1)) { // current message will keep changing, so helping_char stores the first message helping_char = my_current_message(); no_message = 0; // automatically breaks the 'not having messages' streak/counter } if (helping_char >= 0) { if (helping_char != my_number()) { stop_moving(ME); // make sure he forgets the old path if (char_ok(helping_char)) { // document last location of helping_char while he's alive approach_char(ME,helping_char,1); loc_x = char_loc_x(helping_char); loc_y = char_loc_y(helping_char); } else { // else he died, so move to last known location helping_char = -1; if (move_to_loc_x_y(ME,loc_x,loc_y)) time_after = get_current_tick(); // time since there was no helping_char } } if ((my_current_message() == -1) && (am_i_doing_action() == FALSE)) { no_message = no_message + 1; if (no_message >= 20) { helping_char = -1; // if there was no messsage for 20 turns, probably no need to help anyone time_after = get_current_tick(); } } } if ((helping_char == -1) && (tick_difference(time_after,get_current_tick()) >= 10)) { // tick_difference thrown in to make sure he doesn't go away in case he's needed if (my_dist_from_start() >= 6) { if (get_ran(1,1,100) < 40) return_to_start(ME,1); } else if (get_memory_cell(0) == 0) { fidget(ME,100); } else if (get_memory_cell(0) == 3) { // march to waypoint and back if (gone_to_waypoint == 0) { if (approach_waypoint(ME,get_memory_cell(4),1)) gone_to_waypoint = 1; } else if (gone_to_waypoint == 1) { if (return_to_start(ME,1)) gone_to_waypoint = 0; } } } // if we're in combat and the above didn't give me anything to do, just // stop now. Otherwise, game will keep running script, and that eats up CPU time. if (am_i_doing_action() == FALSE) end_combat_turn();break;beginstate 3; // attacking if (target_ok() == FALSE) set_state(START_STATE); do_attack(); // give message every time when attacking and doesn't have anyone to help // NOTE: In general, this means that there will only be 1 broadcast every 7 // turns per group. if (helping_char == -1) { if (what_group_in(ME) > 0) { alert_char(1000 + what_group_in(ME)); give_char_message(1000 + what_group_in(ME),my_number()); helping_char = my_current_message(); } else broadcast_message_from_x_y(my_loc_x(),my_loc_y(),my_number(),16); }break;beginstate TALKING_STATE; if (get_memory_cell(3) == 0) { print_str("Talking: It doesn't respond."); end(); } begin_talk_mode(get_memory_cell(3));break; EDIT: The script works very well in my opinion, except in this situation: Someone (possibly one of my guards that aren't part of a group) broadcasts a message. A guard in range picks it up and goes to help, but he won't tell the others in his group. This could be easily solved, but the code must be as efficient as possible, and I only want them broadcasting messages WHEN THERE IS NEW INFORMATION. Does anyone have any ideas?
  24. Remember, of course, that you can't reach these places in the demo.
×
×
  • Create New...