Jump to content

Metatron

Member
  • Posts

    89
  • Joined

  • Last visited

Everything posted by Metatron

  1. What happens when you bring the Xian Skull to X? I THINK nothing special, but does anyone feel like checking?
  2. I used to use plain Wordpad. Now I use Notepad++. But I don't really use a text editor to keep track of my semicolons and brackets; if I make a "{" bracket, I immediately make a "}" bracket as well. At the end of a loop or large block enclosed in {} brackets, I also usually add a comment to say what code I enclosed. Code: while (i < 3) { if (char_has_item() > 0) print_str(); else { if (my_loc_x() > 35) damage_near_loc(); else message_dialog(); } // this closes the original else block } // this closes the while loop
  3. We want designers to write more scenarios, right? Perhaps the most promising designers should have their distractions removed, so that they can write more fine scenarios. I propose that we TAKE AWAY games from the best designer.
  4. You could create water that rises to the player's waist-height with unblocked floors and terrains that are made to look like water. Then the characters could fight in, say, a high river. Have you played Frostbite? Lazarus did something similar with snow.
  5. Undead and Demon melee attacks bypass armor calculations.
  6. Metatron Make a scenario where the party has to assassinate someone. The scenario will take place in rocky mountains or hills. The party will spend most of the time fighting human cultists. Three things will be important to the plot: a celebration, nature's aid, and unwarranted self-importance. I just popped in and saw this. It looks exciting. My alleged second scenario has, uh... been on a six-month hiatus. I've been busy slacking off.
  7. Originally Posted By: Vituperation Free Albemuth —Alorael, who would proclaim the majesty of RWG if he thought any of you newcomers could possibly appreciate his majestic wit and ancient wisdom. Pfah. His post-future wisdom far surpasses his ancient wisdom though.
  8. Australia never has and never will be as good as a real country.
  9. Name: Tron. OS: Windows Vista. E-mail: In my profile, if you don't mind. Favorite fish: Salmon. Really. I would begin testing on Saturday. Saturday.
  10. Okay, there was another error, but I sorted that out reasonably well. I must have spent at least an two hours trying to figure out why my target was -1, and it was as simple as that... Thanks Niemand! Some information which I have discovered and which I don't think are readily available: 1) Variables can be negative and store their negative value. However, print_num(variable) will not print a number. It will print a blank space. 2) A creature will run through the state that it was last in, three more times. That is, its final state will be called four times. 3) if (dist_to_char(i) <= 8) and while (i < 3) are both interesting. Or I spend too much time on instant messenger programs. 4) I would like to reaffirm this, although it's probably known: if you use set_state(state_number), anything after this call in this state will not be read.
  11. Originally Posted By: Niemand Should each of those 'i = target;' lines be 'target = i;'? Because i'm fairly sure that target only gets assigned to in the INIT_STATE. ... D'oh. Quote: Could you show how you tired to use it? As far as I recall that call should work, and in a pretty straightforward manner. Code: if (char_ok(i) && char_attitude_to_char(ME,i) == 2 && can_see_char(i) == 1 && dist_to_char(i) <= 8) { gives an error, saying "turret Error: Function call error (unary) in line 72." where line 72 is the line where I just added && "dist_to_char(i) <= 8)" to. The line if Code: (char_ok(i) && char_attitude_to_char(ME,i) == 2 && can_see_char(i) == 1) { works. Quote: There is, sadly, no way known, I think, to turn this off. The best you can do is change the creature so that it will always miss or do no damage. This is why the tables in Echoes: Renegade will, in some way that is unclear upon reflection, try to strike unwary enemies during a certain fight. I see. Oh well; it's just nice to actually know why this problem exists.
  12. Background: I intended to write a creature script that, each turn, cycles through all monsters in the level (while i <= 120). For each monster, the script would check that the monster is alive hostile to the script runner visible to the script runner If those conditions are true, the script should check that the monster is in a select hemisphere determined at initialization. The way I checked for this was to use xchange and ychange to calculate the difference between the x position and y position of the script runner and of the target. It is always change = origin location - monster location. If a monster is to the north, ychange is positive If a monster is to the west, xchange is negative If a monster is to the south, ychange is negative If a monster is to the east, xchange is negative If the monster is in the correct hemisphere (north of origin, south of origin, east of origin, west of origin) then we proceed to state 3 and attack the monster, and am done for the turn. See the complete code here or just open the spoiler. Click to reveal.. Code: // turret.txt// Memory Cells:// Cell 0 - Where creature faces// 0 - print my number, print an error alert// 1 - facing north// 2 - facing west// 3 - facing south// 4 = facing east// Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this // is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when// creature is killed, sets SDF(3,5) to 1.)// Cell 3 - Dialogue node to start with if talked to. if left at 0, this// character doesn't talk.begincreaturescript;variables;short i,target;short last_abil_time;short xorigin,yorigin;short xchange,ychange;short quadrant;body;beginstate INIT_STATE; target = -1; set_mobility(ME,0); last_abil_time = get_current_tick(); if (get_memory_cell(0) == 0) { print_named_str(ME,"does not have a set direction to face."); print_num(my_number()); } if (get_memory_cell(0) == 1) set_character_facing(ME,0); if (get_memory_cell(0) == 2) set_character_facing(ME,2); if (get_memory_cell(0) == 3) set_character_facing(ME,4); if (get_memory_cell(0) == 4) set_character_facing(ME,6); force_instant_terrain_redraw();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);break;beginstate START_STATE; i = 0; //target = -1; // Conjecture: if you run this state and set target equal to something, it will not progress immediately to state 3 // it will instead run this stupid state again, thereby resetting i and target. i has checks so that is // not a problem, but target gets reset so that in state 3, the turret ends up attacking a character of value -1 if (tick_difference(last_abil_time,get_current_tick()) >= 1) { // not going to waste all that script time if you have already done your ability this turn // perhaps calling this in the START_STATE will take up too much run time... this is distressing // should stress-test BoA to see if a large number of turrets slows down the game. Meh. Burn that bridge when you come to it i = 0; target = -1; xorigin = my_loc_x(); yorigin = my_loc_y(); while (i <= 120) { // one flaw of this procedure is that if one character is in the range of two turrets, and if that character is the first character, // he will be targeted twice. The lowest person is very unlucky // check ALL monsters to see if they fit my criteria if (char_ok(i) && char_attitude_to_char(ME,i) == 2 && can_see_char(i) == 1) { //print_num(i); print_named_str(ME,"got to the if checks."); // just watching the script closely, and not trusting it // so we've established that I don't like this guy, and he's at some unknown range. Now let's check if he's in my attack field // Me, the turret, is at the center of the universe; at point (0,0); // as you move west, x goes down // as you move east, x goes up // as you move north, y goes down // as you move south, y goes up // if the target is in the hemisphere that I want, and if he is a valid i (as calculated above with the if chain) // then I can set target = i, set i = 121, and then go to state 3; from there, do the damage and animation and all that [censored] // if I set i to several different values, it'll be unexpected and unexplained but eh //1 = north, 2 = west, 3 = south, 4 = east xchange = xorigin - char_loc_x(i); ychange = yorigin - char_loc_y(i); if (get_memory_cell(0) == 1 && ychange > 0) { i = target; set_state(3); last_abil_time = get_current_tick(); i = 120; print_str("North"); //set_state(3); } if (get_memory_cell(0) == 2 && xchange > 0) { i = target; set_state(3); last_abil_time = get_current_tick(); i = 120; print_str("West"); //set_state(3); } if (get_memory_cell(0) == 3 && ychange <= 0) { i = target; set_state(3); last_abil_time = get_current_tick(); i = 120; print_str("South"); //set_state(3); } if (get_memory_cell(0) == 4 && xchange <= 0) { i = target; set_state(3); last_abil_time = get_current_tick(); i = 120; print_str("East"); //set_state(3); } } i = i + 1; } //i = i + 1; // remember to set last_abil_time at the end of this, once you've actually done the attack sequence }break;beginstate 3; // attacking print_named_str(ME,"got to the attack state."); if (char_ok(target)) print_str("char ok"); if (char_attitude_to_char(ME,target) == 2) print_str("hates target"); if (can_see_char(target) == 1) print_str("can see target"); if (char_ok(target) && char_attitude_to_char(ME,target) == 2 && can_see_char(target) == 1) { print_named_str(ME,"has a target with the right traits"); print_num(target); print_named_str(ME,"fires at an enemy."); put_straight_zap(my_loc_x(),my_loc_y(),char_loc_x(target),char_loc_y(target),0); change_char_health(target,-1 * get_ran(2,1,get_level(my_number()))); print_num(target); run_animation_sound(104); } if (target < 0 || char_ok(target) == 0 || char_attitude_to_char(ME,target) != 2 || can_see_char(target) == 0) { print_named_str(ME,"had an invalid target"); //set_state(START_STATE); }break;beginstate TALKING_STATE; if (get_memory_cell(3) == 0) { print_str("Talking: Turrets cannot talk. You idiot."); end(); } begin_talk_mode(get_memory_cell(3));break; This code does not work. It seems to think that target = -1. When a party member is positioned so that an attack should proceed, the script prints the following messages: Sentry turret got to the attack state hates target can see target Sentry turret had an invalid target Notice that what the script does NOT say is that, while in state 3, target is a character that is alive and okay. Problems: Does anyone have insight into why the target gets set, but is an invalid character? Also, I couldn't get the call dist_to_char(i) to work properly; when I tried to add this check to my if () conditionals, the game told me that I had a unary error, I believe. Not a big problem, but it would be good to know why I was using it incorrectly. Finally, almost all of a monster's attacks seem to only be prompted by a do_attack call. All except one... When a character moves away from a monster and the two are hostile to each other, the stationary monster always gets an attack of opportunity, regardless of what the script has to say about this. If I have a character who move away from a turret, the turret can attack my character. This is of course silly because a stationary robot turret should not get an attack of opportunity, but there's little to be done about it except to either set the turret's strength to 0 or set it to do burning damage. Unless someone has any idea what else to do about this.
  13. I made a pretty nice try at finding the old character cards. Are those coming back too?
  14. Wow Ephesos, that was fast. Thanks. I suppose it's my own fault for showing up so late, that there are few players left. Hmm. I wonder if it's better for several designers to release scenarios together in an easily accessible package, or for all designers to stagger releases to avoid overloading the player market... Also, I'll rate yours if you rate mine.
  15. Bump. Enemy at the Gates could still use some reviews. And I really would like some chivalrous Mac user to do a Mac-compatible zip of the graphics. Please. Work on the sequel is progressing at a very slow, but steady pace. Screenshot.
  16. Perhaps Salmon didn't realize that this would get such an explosive reaction.
  17. I felt that more vivid imagery should be used in the descriptions and overall there should be more action either shown or described, but on the other hand the upside of this Spartan writing was that it was very clear. I never had to wonder what I was supposed to be doing or what my quest was, because I was basically given a roadmap from point A to point B. However, that didn't mean that the plot was predictable. There were two or three good surprises, and I liked the gradual revelation of the truth. The little emotional tugs failed to move me, though; try developing a character or my relationship with a character more, before making me kill him. Similarly, I think that the bitter irony of the daughter's plot could have been played up a lot more. PS if I hear a man's gone missing in bandit territory, that's a death sentence right there. Either I'll kill him, or he's been killed. The line "You really have to stop falling for that." was great! Indeed, you did get me again. Well played. I would advise the designer to sometimes pause in his work, and consider this: does this thing that I'm doing add value to a play-through of the scenario? For example, having descriptions of the items contained in the boxes was a new way of doing things, and it probably took a lot more time than the conventional process of actually storing items in boxes. But I feel like it didn't really make the game more interesting to me; instead of just letting me see mundane items, you made me read about mundane items? But this didn't really affect my gameplay either way, so it has no effect upon the score I give. I found the weapons of the brigands to be far too powerful. My fresh party of four is supposed to take on six monsters at a time, of level 5, who have ranged attacks. Ranged attacks that sometimes have a status effect and +40 damage. I found the combat to be tough for even my level 8 party, on Normal difficulty. I liked this scenario, but the lack of detail and development holds this scenario back. If a player needs a way to pass the time, it's a good exercise. [rating]Average[/rating]
  18. http://www.silverchat.com/~silver/Avernum/Wrappers1/NepharFort.html
  19. Originally Posted By: Archaon while ((my_ap() == ap) && (g < 5)){ //Try to attack more than once. Sometimes even g < 500 doesn't work... do_attack(); g = g + 1; } Oh, that IS clever. Long live the magical while() loop. If the creature running the script, a creature I'll call cr_tele, is standing right next to a character which it intends to attack, does that attack proceed correctly? That is, if some random monster stands next to cr_tele and they're hostile to each other and both immobile, will they attack each other properly? I know that get_nearest_char() doesn't actually get the nearest char; it gets the nearest char at a secret time of BoA's choosing. It usually isn't a problem, unless you want to, say, relocate a character repeatedly in one combat turn. I discovered this when I tried to do get_nearest_char(), relocate_char(), and then get_nearest_char(); I got the same character twice. Do_attack might rely upon the same tracking of location that get_nearest_char makes use of, which would mean that the game believes cr_tele is in a very different location than it actually is. Or at least, the part of the game engine that handles things like get_nearest_char and do_attack. I suppose that, if my theory is true, we should be thankful that relocate_char() works at all. It might be possible to force BoA to reset its tracking of characters, but I have no idea how; maybe placing and then removing terrain, or placing and then deleting a character? Assigning a waypoint for the monster to move to? But overall, I think do_attack() is more trouble than it's worth. If you get it working, you might find that it operates slowly due to the game's inefficient running of the script, or because it takes a while to play the animations and sounds. So I still suggest change_char_health(), run_animation_sound(), set_char_pose(), and force_instant_terrain_redraw() in order to achieve an effect that is like an attack, but which gives you more control.
  20. Yes, generating numbers at random is wrong and I'm a bad person. But I also can't do math.
  21. Okay, I uploaded V1.01 of Enemy at the Gates to "my" webspace, changing the dialog problems mentioned above. As of 3 am Pacific on 2/15, there is no Mac version. Niemand was converting graphics and making Mac-friendly versions, but I feel bad constantly asking him to do help me out. So if anyone would like to e-mail me an updated Mac zip, that would be awfully nice. My e-mail is in my profile description, and the updated Windows version of EatG is still available for download through the link in the original post.
  22. If you put this in the creature's START_STATE, as soon as the monster's script starts running, it will run all of its movement code and try to attack the party. Might I suggest that you put this code in state 3 instead, and include a last_abil_time check? And you should definitely use "run_animation_sound(10)" to play your animations and sound instead of play_sound and force_instant_terrain_redraw. I also agree that do_attack is useless; it's the part of the game that Jeff didn't allow designers to modify, so naturally it's horrible. I would suggest using damage_char() or change_char_health() instead. I wrote a script that allows the monster to jump from one target to the next, and damages his targets as he jumps around. It has sound effects, zaps, and all the bells and whistles. I suggest that you check it out. If you don't want to, I'm pasting the relevant section of code anyway. This is what the code runs for character a: Code: while (ready == 0 && e < 60) { x_to_place = char_loc_x(a) - 1; y_to_place = char_loc_y(a) - 1; x_to_place = get_ran(1,0,2) + x_to_place; y_to_place = get_ran(1,0,2) + y_to_place; if (char_on_loc(x_to_place,y_to_place) <= -1) ready = 1; e = e + 1; }if (ready == 1) { change_char_health(a,-1 * get_ran(2,1,12)); put_jagged_zap(my_loc_x(),my_loc_y(),x_to_place,y_to_place,1); put_jagged_zap(my_loc_x(),my_loc_y(),x_to_place,y_to_place,1); put_jagged_zap(my_loc_x(),my_loc_y(),x_to_place,y_to_place,1); put_boom_on_char(ME,2,0); relocate_character(my_number(),x_to_place,y_to_place); run_animation_sound(71); set_character_pose(ME,2); set_character_facing(ME,get_ran(1,0,7)); force_instant_terrain_redraw(); set_character_pose(ME,1); force_instant_terrain_redraw(); f = 1; }
×
×
  • Create New...