-
Posts
6,157 -
Joined
-
Last visited
Never
Content Type
Profiles
Forums
Blogs
Everything posted by Ephesos
-
Rock on!
-
I agree 100% with Jeff. And I think if the polar bear eats you during speed skating, it should be able to take your spot.
-
MM got one-shot by UBB. Had to re-roll.
-
Originally Posted By: CRISIS on INFINITE SLARTIES This analogy works so long as different characters have dramatically different rates of advancement. Yes, well Alo loses lots of xp from skribbane withdrawal, so it all basically balances out. Also, diminishing returns, and all that.
-
...and then there's still the unfortunate issue that a lot of people never ported their reviews over here. Which makes this CSR about as helpful as the original SW-hosted one. (if anyone with reviews at SV is reading this, HINT HINT)
-
Originally Posted By: I need no introduction so will there be any more deathmatches? Originally Posted By: The Mystic I'm not calling for another one; that's why I said "if," not "when." Originally Posted By: Triumph Noooooooooooooo! Don't unleash another one! Originally Posted By: Randomizer Please no more deathmatches. It takes too long to reach the end. Originally Posted By: Delicious Salmon ...at least it is over. In short, I hope not, and I think a lot of other people would agree. We seem to be rather short on Spiderweb Lore as of late... a lot of the people from the original deathmatch don't really hang out here anymore, and not as many people have filled the gimmicky gaps. That said, *crickets* Originally Posted By: Monroe For good measure, it's probably best that you disregard anything you might 'learn' on this site. It will be for the best, I promise. (concurs)
-
Honestly, that's probably a good thing. I would prefer that anyone working in a nuclear power plant spends their time working, rather than romping about Avernum.
-
Everyone's changes have been noted on the Roster page. And Blood Marsh people! Still waiting on a few responses for the calendar. Please try to get to that as soon as you can. Originally Posted By: Ikthak, goblin archmage, journal notes "A noticeable flux in the fifth hemi-quadrant of the pole star is vexing me. I have read that the stars shift across the aeons as they do across a day, but this irregularity seems like an omen. Perhaps a visit to Keoshor is in order."
-
Originally Posted By: Student of Trinity So computing = typing? No, this is just something I find irritating when people talk about new devices. "Oh, I wish it had the features of X, which already exists." Buy X. ...but watch out for anvils.
-
(eagerly awaits the next chapter) (...totally not a bump)
-
...didn't one of the license agreements contain copy-pasted text from some NASA document? I seem to recall that coming up a few months ago.
-
...see, and again, I find myself thinking "If what you want is a computer, get a computer." This thing, whatever it is, is not a computer. It's a toy. A fancy toy, but basically a toy.
-
Originally Posted By: Metatron 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. ...wait, the version in the first post works fine, and has a totally-functional .cmg file. Is there an updated version that needs conversion? If that is the case, shoot me an email and I'll have it done in no time. And I promise I'm quicker about converting graphics than I am at testing.
-
The epic conclusion of the award-winning Avernum series is now available for Windows! Travel into the strange subterranean land of Avernum, full of dungeons, labyrinths, and constant warfare. A final set of disasters threatens to destroy your homeland in a spasm of famine and warfare. Only you can help your people to get to safety before everything falls apart. Avernum is a world underground. It is a nation of people living in an enormous warren of tunnels and caverns, far below the surface of the world. Once a prison colony for rebels and thugs, it is now a wild frontier, full of adventurous souls looking for wealth, fame, and magical power. Avernum's sole link to the surface world: a single magical portal, small and difficult to maintain. And then the Blight came. Almost overnight, the mushrooms Avernum needed to feed itself withered and died. Then the denizens of the low tunnels, the savage, reptilian Slithzerikai, emerged. Sensing weakness, they struck, destroying much of a weakened Avernum and creating waves of hungry, desperate refugees. Now chaos and hunger stalk this land, and none seem to be able to find a solution or a way to stop the Slith Horde. In the midst of all of this chaos, you joined the army. You had a good, simple reason: Soldiers get food. And yet, through a run of good (or bad) fortune, you find that you have a chance to discover and confront Avernum's enemies. The nation of Avernum is rapidly approaching its final destiny, and you will be at the center of events. Can you save your homeland? And, if Avernum survives, what will become of it? Come get the huge, free demo!
-
It takes a surprisingly short time to type "Rocks fall, everyone dies". What can I say, I was inspired. ...er, yeah. That totally never happened. (jedi hand wave) Originally Posted By: Zarusa, pyromancer "Sometimes, vengeance is incredibly fulfilling. It helps distract you from the pain of the original wrong, at least until you are prepared to deal with it."
-
Session 4 of Selos and the Oracle is complete, and the log is posted here! Nixak became the first party member to use Khashen's Blessing, Vitze incited an angry mob, and Lanrezac blew up a house. Fun stuff! The following characters are eligible to level up after this session: Boregloaf Kundak Lanrezac Nixak And now, quotes! Click to reveal.. (I have a +11 bonus on Quote rolls...) Boregloaf: "We get to head back to Quera today! And we'll probably have food with us again!" Zarusa: "I think we're here. And I think we have a problem." Lanrezac: "If he deserves death, it doesn't matter that he's unconscious. Does he deserve death?" Ghak: "I tell you, I know nothing. Osherl had a plan, next thing we knew Quera is on fire. Maybe I help if you GIVE ME MY SWORD BACK." Nixak: "Everyone blames the humans for everything, it nothing more then ignorance of the other races." Kundak: "All this derring-do and so little learned." Vitze: "Hello again, Zarusa. This is not nearly as bad as it looks. If you let me explain, I'm sure you will understand." Blood Marsh party! The calendar for your next session is right here, so please fill it out. From my point of view, the best day is Saturday March 6th... just sayin'.
-
Cows fall, everyone dies.
-
I also expect they will be vastly different in personality. Also, it's Harosh. Small difference, but yeah.
-
Oi! Don't forget, we play tomorrow, Saturday, at 5pm CST! Originally Posted By: Orlis the Cliffpainter "You see a wasteland, I see potential."
-
But wait, there's more! Originally Posted By: Lazarus More Strings to Fiddle Withmessage_dialog("","") when used in the 'code' part of a dialog node will not display the text in a popup box as it usually does, but rather will display them as text1 and text2 for that dialog node. Useful for if you have more than 8 strings for a specific node. Note that when you use this call that is the only text that will display. So if you use message_dialog("Hey","there"); and text3 = "adventurers"; only "Hey there" will display (with a return obviously) not "Hey there adventurers." All strings are erased. For this reason this is only useful for responses of 2 or less strings. Still, with this you have an unlimited number of responses for a node as long as no response has to be over 2 strings. Originally Posted By: Niemand In my above post in this thread I outlined a method for storing large numbers in the SDF matrix. I have stated before that it cannot be used to store negative values. However, here's one that can:Assuming that you want to store the value of a variable named z to SDFs 1,1 and 1,2 Code: set_flag(1,1,(1 + -2 * (z < 0)) * z); set_flag(1,2,(z / (256 * (1 + -2 * (z < 0)))) + (128 * (z < 0))); You can then retrieve that value with Code: z = (1 + -2 * (get_flag(1,2) > 128)) * (get_flag(1,1) + 256 * (get_flag(1,2) - (128 * (get_flag(1,2) > 128)))); I've tested this and it seems to work as expected for numbers in the range [-32767,32767]. Note that you have to be careful about using the right coordinates in the numerous get and set sdf calls for the retrieval. Call the two SDFs A and B, and if the two set calls store to A and B respectively, then the order in the retrieval line is BABB. Originally Posted By: Lazarus Picking the First Party MemberA pretty straightforward task. Most people know that Code: i = 0;while(char_ok(i) == 0){ i = i + 1;} will do this just fine, but I was trying to think of a way to do this in one line of code and came up with a few simpler alternatives. Firstly, first_group_member(0) will always return the first living party member, and so will random_party_member() if you have a singleton (The docs make it sound like this call is basically just get_ran(1,0,6), but it picks out only living party members, which is what I expected but wasn't really spelled out. Totally off topic-- thinking about this brought me to the realization that dead party members aren't part of group 1000, which wasn't what I'd expect.) Anyways, this isn't really useful to most of you, but I figured I'd throw it out there since most people seem to use the loop option, but the first_group_member option is slightly easier.
-
Other miscellaneous tricks: Originally Posted By: Niemand One of my favorite tricks is storing a 16 bit number using a pair of SDFs: Code: z = 5280;set_flag(1,1,z/256);set_flag(1,2,z%256); //Note that the %256 operation is implicitly performed every //time you call set_flag, but it is clearer if stated explicitly. (Clearly any pair of SDFs will do.) You can the retrieve the value using: Code: z = (256 * get_flag(1,1)) + get_flag(1,2); By doing this, you can do things like store time values needed, say, by a town script, so that they will preserved even if the party leaves and re-enters the town. It allows you to store a value up to 32767, even though flags can only hold values up to 255. Originally Posted By: Nioca Here's the shortest, simplest, and smallest way possible (that I know of) to have a message display only once depending on a flag. Code: if (get_flag(x,y) == 0) { message_dialog("I'm a message!","With two paragraphs!"); set_flag(x,y,250); } Originally Posted By: Nioca Increasing Health and Energy over MaximumIt's impossible to increase Health and Energy over the maximum amount for a character using ordinary health and energy modification calls. However, the alter_stat(char,stat) call can be used to boost Intelligence or Endurance, thus increasing the maximum amount can have at anyone time. Health and energy modification calls can then be used to increase the health or energy of the character to the desired amount, and then alter_stat(char,stat) can again be used to drop the character's Intelligence and/or Endurance back down to their original state whilst retaining the adjusted amount of health and/or energy. This could be used in encounters that grant a blessing of some sort, or other situations where you want a character, or even the party to have higher-than-maximum health. Originally Posted By: Arancaytar I've changed ambient sounds in ED. It's not really an advanced trick, but more of an easy workaround - still, here it is: Code: beginstate INIT_STATE; if (should change music?) { set_incidental_sound(1); // turn off the normal music play_sound(-150); // and play new music ticks=0; } else set_incidental_sound(0); // turn on normal ambiencebreak;beginstate START_STATE; if (should change music?) { ticks=ticks+1; if (get_ran(3,1,6)==18 && ticks>200) { play_sound(-150); ticks=0; } }break; The added check for rolling a triple-six on three dice randomizes the result somewhat, because it was too clockwork-like otherwise. Note that the timing requires a lot of experimentation, as your timer will run on game time, while the music is played in real time. You may end up with too long gaps of silence, or cutting off music early. Originally Posted By: Dintiradan The move_to_loc function is adequate for most cases, but it lacks the within_dist parameter that approach_char, approach_ter_script, and approach_waypoint have. If you try to make a monster move to a spot too close to itself, it won't move at all. Since you can't create a waypoint or terrain script at runtime, you need to create a creature at or near the destination, move, then erase the spawned creature. Code: must_remove = 0;dest_char = char_on_loc(x, y);if (dest_char == -1) { must_remove = 1; place_monster(x, y, WAYPOINT_MONST, 1); dest_char = char_on_loc(x, y);}approach_char(ME, dest_char, WITHIN_DIST);if (must_remove) { erase_char(dest_char);} Blades Invaders gives WAYPOINT_MONST an empty graphic, but this doesn't seem necessary; if a creature needs to be spawned, it doesn't appear in gameplay.
-
More from Lazarus: Quote: Forcing Dialog W/ Names/Faces By passing a flag to a creature script and then checking that flag in the creature's start_state, you can 'force' dialog (That is to say not initiated by actually talking to someone) but still have a creature's name/dialog pic displayed, and still be in normal talking mode. Flag should be reset somewhere in the dialog, so that it doesn't run every turn. You can see this technique in any of the Tales, specifically talker.txt (Ed. note: Also utilized in Adrift) Marking Characters This is a way to mark PCs, so that the player can't switch party order and throw you off. Some practical uses would be to keep track of the 'main' PC that is the story's protagonist, or to keep track of characters for special spells. It is done by giving each PC an ability at the start of the scenario. This can be a simple ability, like "The Way Out" or "Set Cutscene Speed". Give each PC a different number of charges of that ability, so that PC 0 has 1 charge, PC 1 has 2 etc. So even if the player switches party order you can always tell what order the PCs were in when they first entered by checking how many ability charges they have. Freezing the Party set_mobility() works on the party-- which is just something kind of weird that I wasn't expecting. Since block_entry() in the start_state won't actually keep your party from moving around, you can use set_mobility(1000,0) to imobilize the party. Practical Applications: I've never used this, but one use might be if you don't want the party to proceed until they equip an item. You could freeze them and then check in the start_state until that item is equipped, then unfreeze them. And refreeze them if they take it off. The ever-running Start State If you set a terrain script to run every turn, it runs every single turn. This means that even between combat turns it will run, unlike the town script start_state which only runs at the start of each combat round. I was once toying with a way to make 'scripted' weapons using this, but it became too convoluted. Still, it can be used for something as simple as checking a monster's health all the time, instead of waiting until the end of a turn. Booting the party from town It isn't supposed to be possible to force a party to exit a town via scripts. Usually designers would simply relocate the party to a location where their only option is to walk out of town. However, if you use relocate_character() to relocate the party outside of the town boundaries, they are instantly placed outdoors. Kind of nifty. (This only works when called from a special rectangle, like the limitations of move_to_new_town.) Setting a Party's EXP Unfortunately, there is no call to check character experience, only to add/subtract to it. You can set a PC's experience, though, by dropping their EXP by a massive number (So that it winds up at 0. You can't have negative EXP) and then moving it back up to the amount you want to set it to. Useful for prefabs. (This one was Nikki's) Weird Functions of Kill_char Kill_char with 0 for death type erases the character. With 1 for death type the creature goes through it's death poses, dumps his items, but doesn't actually die. 5 kills the character, but changes his face to the 'flee' graphic. 6 kills the character but changes his face to the 'blank portrait' graphic. 7 and 8 will kill the character, not play any death sound, and set their portrait to blank. The different death types correspond with the char_status types. (Thanks to Niemand for telling me this.)
-
Nioca did some work with the base classes: Originally Posted By: Nioca The base classes. You know, the ones you click by before settling on 'Custom'. Out of curiosity, I decided to gather data on the base classes, to see if any of them had certain advantages over the others. And this is what I found. Skill Points for base classes in comparison to Custom (this includes the 8 extra skill points the player gets in each base class). Soldier = +7 Skill Points (72 Total) Berserker = +8 Skill Points (73 Total) Cleric = +12 Skill Points (77 Total) Sorcerer = +10 Skill Points (75 Total) Rogue = +8 Skill Points (73 Total) Archer = +9 Skill Points (74 Total) Rebel = +13 Skill Points (78 Total) Hedge Wizard = +13 Skill Points (78 Total) Shaman = +8 Skill Points (73 Total) And, a table of skills each base class other than custom. Code: +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+CLASS SKILLS |STR|DEX|INT|END|MEL|POL|BOW|THR|HRD|DEF|ASS|MAG|PRI|ARC|POT|TUS|NLO|AID|LCK|+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Soldier |*4*| 4 | 2 | 5 | 4 |*3*| 1 | 0 |*2*|*2*| 0 | 0 | 0 | 1 | 0 | 2 |*2*| 2 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Berserker |*4*| 4 | 2 |*6*|*5*| 0 | 1 | 1 |*2*|*2*| 0 | 0 | 0 | 1 | 0 | 2 |*2*| 1 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Cleric | 2 | 2 | 5 | 5 | 3 | 0 | 0 | 1 | 0 |*2*| 0 | 0 |*4*| 5 | 4 | 1 | 1 |*3*| 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Sorcerer | 2 | 2 |*6*| 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |*5*| 0 |*6*| 2 | 1 | 1 | 1 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Rogue | 3 | 4 | 2 |*6*| 3 | 0 | 3 | 0 |*2*|*2*|*2*| 0 | 0 | 1 | 0 |*6*|*2*| 0 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Archer | 2 |*5*| 2 |*6*| 2 | 1 |*6*| 1 |*2*|*2*| 0 | 0 | 0 | 1 | 0 | 4 | 1 | 0 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Rebel |*4*| 4 | 2 | 5 | 2 | 2 | 2 |*2*|*2*|*2*| 1 | 0 | 0 | 3 | 2 | 4 | 1 | 2 |*1*|+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Hedge Wizard| 2 | 2 | 5 | 5 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 3 | 3 | 5 |*5*| 2 | 1 | 1 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|Shaman | 3 | 3 | 4 | 5 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 |*5*| 2 | 1 | 1 | 0 |+------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ From this, we can discern a few things about each class. Soldier: A decent melee class. Spreads its points around a bit too much, negating its skill point advantage, but is extremely useful for acquiring Blademaster. Berserker: A very powerful melee class, with very little spread and a healthy skill point advantage. Cleric: As an overall priest character, this class falls a bit short. As a dedicated healer character, though, this class rises to the occasion. It's capable of running every sort of healing available, and even has passable weapon skills. The luxurious skill point advantage is an added bonus. Sorcerer: A magnificent glass-cannon style mage character, with a large skill point advantage and a little extra endurance. Rogue: Not one of the better classes unless you have a very specific character in mind that works with this class. If you do, than this class, with its decent combat and lockpicking skills, might work out well with a little added advantage in skill points. Archer: A masterful archer template with a cushy skill point advantage. Its low strength is a potential drawback, though. Rebel: While it might have a massive skill point advantage, this class is really just awful. Points are spread so thin into every niche that it has no actual power. On the plus side, it is the only class to invest in a point of Luck. Hedge Wizard: Has a identical skill point advantage to the Rebel, but lacks most of the ridiculous spreading of skill points. Decent with all kinds of magic, including potion making. Shaman: Similar to Hedge Wizard, but with Melee instead of Mage spells. Also has a smaller skill point advantage and lackluster defensive capabilities, meaning that engaging in melee with this template might not be a good idea until it gets a few levels behind it.
-
Also originally posted by Niemand: A tricky engine detail related to scripting: It appears, although I haven't been able to completely verfiy this, that Avernumscript does NOT utilize short circuit evaluation of binary operators. For persons not familiar with the jargon, this means that in an example like Code: if(call_1() && call_2()) //do stuff call_2 will be executed even if call_1 evaluates to false. This is unlike more sophisticated systems in which the evaluation of call_2 would be skipped in this situation if call_1 proves to be false, since if call_1 is false no possible value of call_2 could make the && evaluate to true. This has two effects: (1)lack of speed and (2)lack of safety: (1) is fairly simple: if you write Code: if(A && B && C && . . . && Z) //do stuff the avernumscript interpreter will ploddingly evaluate A, B, C and so on all the way to Z, even if B turns out to be false and most of the work could have been skipped. (2) is more complicated and rarer, but often the more serious; as an example I have found the the char_attitude_to_char call doesn't like having being asked to evaluate a character's attitde toward an invalid character number like -1. But what if you wanted to do something if character i hates the character to its north? It's then natural to write: Code: if(char_attitude_to_char(i, char_on_loc(char_loc_x(i),char_loc_y(i) - 1) == 2) //do stuff However, char_on_loc may return -1 if there is no character at the specified location, which would make char_attitude_to_char unhappy. Unfortunately, trying Code: if((char_on_loc(char_loc_x(i),char_loc_y(i) - 1) > -1) && (char_attitude_to_char(i, char_on_loc(char_loc_x(i),char_loc_y(i) - 1) == 2)) //do stuff won't cut it; the game discovers that, by golly, there's nobody at that location, and then tries the attitude call anyway. The safe way to do this check is: Code: if(char_on_loc(char_loc_x(i),char_loc_y(i) - 1) > -1){ if(char_attitude_to_char(i, char_on_loc(char_loc_x(i),char_loc_y(i) - 1) == 2) //do stuff} Although I haven't been able to think of a clear test for this, the chunk of the interpreter code which is in the 3D Edior supports this theory, and is likely equivalent to the game's own code. I have also observed the problems described in the last example, so I'm reasonably certain that all this is accurate. In conclusion, try to avoid writing really long chains of &&'s and ||'s because they will always be slow, and be aware that every bit of code you write in a condition will run if any of it runs.
-
Originally posted by Niemand: Node counting in Avernumscript: As we are all well aware, there is a strict upper limit to how many 'nodes' of Avernumscript the game will execute before it assume that the script has entered an infinite loop and kills it. The question which had always bothered me was: What is a 'node' in Avernumscript? The following is derived from the script interpreter code contained in the editor, but I have found no relevant differences in behavior between that code and the code actually used in the game. From reading the code, I found that each of the following objects costs one node: if(...){ or if(...) while(...){ foo(...) var=...; where var is some variable ; (an extra not associated with any other statement } This shows that, unlike what one might guess, 'nodes' do not correspond at all directly to tokens, since the items in the list above range from 'if(...){' which contains a minimum of 5 tokens to '}' which is a single token. Happily, they aren't totally incomprehensible, as they will tend to correspond pretty much one-to-one with complete statements. The weirdest one, and something of a surprise, is '}' which counts even though it is typically not thought of as actually doing anything (especially in the case of an if statement, where it merely serves to hint to the interpreter which statements are inside and which aren't, and really does do nothing at run time). I tested this by testing each of the little block below, and found them to all have the node counts that the above rules predict: Code: i=10000+(5+j)/(1+j); //counts as a single node i=5; //counts as 17 while(i>0){ i = i - 1; } i=5; //counts as 3 if(i<10) j=1; i=5; //counts as 4 if(i<10){ j=1; } i=5; //counts as 3 if(i>10) j=1; else j=2; (note that there is a separate limit on the length/complexity of arithmetic expression: they may not contain more than 100 tokens.) So, from this we see that is probably advantageous to pack as much work into fewer statements as possible when trying to fit within the node limit. This could take the form of refactoring code like: Code: a=(get_health(target)-get_energy(ME))/2;if(a<10) //do one thingelse if(a<20) //do something elseelse //sit down and cry into a form more like: Code: if(((get_health(target)-get_energy(ME))/2)<10) //do one thingelse if(((get_health(target)-get_energy(ME))/2)<20) //do something elseelse //sit down and cry Basically manually inlining computations that are reused, rather than storing them in an intermediate variable. This will make the code execute slower, but, if I'm correct, trick the game into believing that there's less of it. Also, I wasn't sure if I had ever seen a specific, actual value for the games limit on the number of nodes. In testing, I found that I could execute 32000 'nodes' according to the above criteria before the script was cut off. The code I used was: Code: beginstate 24; x=10666; while(x>0){ x = x - 1; }break; The variable initialization takes one node, the loop takes 10666*3, the final, failing check of the loop condition takes one, for a total of exactly 32000. Any further added code caused the script to be killed.
