Jump to content

Chokboyz

Member
  • Posts

    428
  • Joined

  • Last visited

    Never

Posts posted by Chokboyz

  1. Quote:
    I was looking into what would be necessary to add Chokboyz's improvements to the Windows Character editor to the Mac version that I had been maintaining, but from my examination of the code in your repository, it looks like you've already subsumed my code.

    I couldn't find the BoE editor on your website, thus i don't know what changes you've made. The only change i could find was in the news : you added a save as option (i won't add it for now : save should always be save as, as the Win32 char editor is still beta).
    I will gladly add to the Win32 Char Editor any further addition you've made and provide pieces of code missing from the Mac version (unfortunately, changes are mainly graphical, thus non-portable.).

    Quote:
    If that's the case, I'll take down my page and let you guys handle things. I was never really interested in being in the BoE business anyway, I just got the character editor up and running because there had been so much whining about it.

    Celtic Minstrel is the one maintaining/upgrading the Mac version of BoE, so he may have already merged your code...
    Oh, and you may safely go back to the BoA 3D Editor (or AScript project, or whatever you're working on), we will try to handle the (potential) whining wink

    Chokboyz
  2. Another bug fix :

     

    Originally Posted By: Alcritas
    Last missile weapon in a group that possess special abilities will fail when fired (note : upon testing only the special ability fails to happens) and last stack of an ordinary thrown item that is placed immediately prior to a stack of another missile weapon with a special ability in that PC’s inventory will gain the special ability of the adjacent missile weapon.

     

    The problem was that the function removed a missile ammo just before doing the firing. The last missile special would then be the next stack one (arrows/missiles are stored together). If there's no missile after the stack, then the special would be nothing (since you can't give missile special to a non-missile item) for the last missile, hence the failing of the last special.

     

    Here is my corrected fire_missile() function (i only displaced the ammo removing functions to proper location) :

    Click to reveal..
    void fire_missile(location target)

    {

    short r1, r2, skill, dam, dam_bonus, hit_bonus, range, targ_monst, spec_dam = 0,poison_amt = 0;

    short skill_item,m_type = 0;

    creature_data_type *cur_monst;

    Boolean exploding = FALSE;

     

    skill = (overall_mode == MODE_FIRING) ? adven[current_pc].skills[sKILL_ARCHERY] : adven[current_pc].skills[sKILL_THROWN_MISSILES];

    range = (overall_mode == MODE_FIRING) ? 12 : 8;

    dam = adven[current_pc].items[ammo_inv_slot].item_level;

    dam_bonus = adven[current_pc].items[ammo_inv_slot].bonus + minmax(-8,8,(int)adven[current_pc].status[1]);

    hit_bonus = (overall_mode == MODE_FIRING) ? adven[current_pc].items[missile_inv_slot].bonus : 0;

    hit_bonus += adven[current_pc].statAdj(1) - can_see(pc_pos[current_pc],target,0)

    + minmax(-8,8,(int) adven[current_pc].status[1]);

    if ((skill_item = adven[current_pc].hasAbilEquip(41)) < 24) { //accuracy items

    hit_bonus += adven[current_pc].items[skill_item].ability_strength / 2;

    dam_bonus += adven[current_pc].items[skill_item].ability_strength / 2;

    }

     

    // race adj.

    if (adven[current_pc].race == RACE_NEPHIL)

    hit_bonus += 2;

     

    if (adven[current_pc].items[ammo_inv_slot].ability == 172) //exploding arrows ?

    exploding = TRUE;

     

     

    if (dist(pc_pos[current_pc],target) > range)

    add_string_to_buf(" Out of range.");

    else if (can_see(pc_pos[current_pc],target,0) == 5)

    add_string_to_buf(" Can't see target. ");

    else {

    // First, some missiles do special things

    if (exploding == TRUE) {

    take_ap((overall_mode == 12) ? 3 : 2);

    add_string_to_buf(" The arrow explodes! ");

    run_a_missile(pc_pos[current_pc],target,2,1,5,

    0,0,100);

    start_missile_anim();

    add_missile(target,2,1, 0, 0);

    do_missile_anim(100,pc_pos[current_pc], 5);

    place_spell_pattern(radius2,target,

    50 + adven[current_pc].items[ammo_inv_slot].ability_strength * 2,TRUE,current_pc);

    do_explosion_anim(5,0);

    end_missile_anim();

    handle_marked_damage();

     

    if (adven[current_pc].items[ammo_inv_slot].variety != 25) {//no-ammo missile type ?

    if (adven[current_pc].items[ammo_inv_slot].ability != 170)//returning missile ?

    adven[current_pc].items[ammo_inv_slot].charges--;

    else adven[current_pc].items[ammo_inv_slot].charges = 1;

    if ((adven[current_pc].hasAbilEquip(11) < 24) && (adven[current_pc].items[ammo_inv_slot].ability != 170))//drain missile item equipped && not returning missile ?

    adven[current_pc].items[ammo_inv_slot].charges--;

    if (adven[current_pc].items[ammo_inv_slot].charges <= 0)// no more ammo ?

    adven[current_pc].takeItem(ammo_inv_slot);

    }

    return;

    }

     

    combat_posing_monster = current_working_monster = current_pc;

    draw_terrain(2);

    void_sanctuary(current_pc);

    //play_sound((overall_mode == 12) ? 12 : 14);

    take_ap((overall_mode == MODE_FIRING) ? 3 : 2);

    missile_firer = current_pc;

    r1 = get_ran(1,0,100) - 5 * hit_bonus - 10;

    r1 += 5 * (adven[current_pc].status[6] / 3);

    r2 = get_ran(1,1,dam) + dam_bonus;

    sprintf ((char *) create_line, "%s fires.",(char *) adven[current_pc].name); // debug

    add_string_to_buf((char *) create_line);

     

    switch (overall_mode) {

    case 13:

    switch (adven[current_pc].items[ammo_inv_slot].item_level) {

    case 7:m_type = 10;break;

    case 4:m_type = 1;break;

    case 8:m_type = 5;break;

    case 9:m_type = 7;break;

    default:m_type = 10;break;

    }

    break;

    case 12: case 14:

    m_type = (adven[current_pc].items[ammo_inv_slot].isMagic()) ? 4 : 3;

    break;

    }

    run_a_missile(pc_pos[current_pc],target,m_type,1,(overall_mode == 12) ? 12 : 14,

    0,0,100);

     

    if (r1 > hit_chance[skill])

    add_string_to_buf(" Missed.");

    else if ((targ_monst = monst_there(target)) < T_M) {

    cur_monst = &c_town.monst.dudes[targ_monst];

    spec_dam = calc_spec_dam(adven[current_pc].items[ammo_inv_slot].ability,

    adven[current_pc].items[ammo_inv_slot].ability_strength,cur_monst);

    if (adven[current_pc].items[ammo_inv_slot].ability == 176) {

    ASB(" There is a flash of light.");

    cur_monst->m_d.health += r2;

    }

    else damage_monst(targ_monst, current_pc, r2, spec_dam, 1300);

     

    // poison

    if ((adven[current_pc].status[0] > 0) && (adven[current_pc].weap_poisoned == ammo_inv_slot)) {

    poison_amt = adven[current_pc].status[0];

    if (adven[current_pc].hasAbilEquip(51) < 24)

    poison_amt++;

    cur_monst->poison(poison_amt);

    }

     

    }

    else hit_space(target,r2,0,1,0);

     

    if (adven[current_pc].items[ammo_inv_slot].variety != 25) {

    if (adven[current_pc].items[ammo_inv_slot].ability != 170)

    adven[current_pc].items[ammo_inv_slot].charges--;

    else adven[current_pc].items[ammo_inv_slot].charges = 1;

    if ((adven[current_pc].hasAbilEquip(11) < 24) && (adven[current_pc].items[ammo_inv_slot].ability != 170))

    adven[current_pc].items[ammo_inv_slot].charges--;

    if (adven[current_pc].items[ammo_inv_slot].charges <= 0)

    adven[current_pc].takeItem(ammo_inv_slot);

    }

    }

     

    combat_posing_monster = current_working_monster = -1;

    move_to_zero(adven[current_pc].status[0]);

    print_buf();////

    }

    There are two locations for the functions because we need to remove ammo when it's an exploding arrow (first case) and when it's not (last case). Note that i placed the remove ammo functions in a way that doesn't remove ammo if the target is out of range or not in line of sight (originally you would lose a missile in both case ... that didn't made sense for me since you don't fire anything). I always modified the position of exploding arrow code so that you can no longer fire everywhere on the map even if out of range or not in sight.

     

     

    Quote:
    The links in the first post in the Bug Fixes section may help with the time issue...

    I've read them. What would be wonderful is an example of the bad behavior wink

    I think that event check skipping during Rest (outdoor/inn/have_a_rest node) is the cause of (what i've percieved as) the bug. I didn't find any difference between an in-town and outdoor day, as others mentionned ... So i'm wondering if i have really understood the problem grin

     

    Quote:
    Small change to consts.h

    Adopted.

     

    Chokboyz

     

    Edit1 : Concerning the "When the party is split up, Affect PC special nodes should only affect the active PC" problem, the only affected nodes are : Affect Health, Affect SP, Affect Skill Points, Kill/Raise Dead (Raise (resp. Kill) revives (resp. obliterates) the whole party ... that obviously shouldn't be changed for compatibility reasons. The compatibility switch for legacy ressurection should be adapted too), Give Mage Spell, Give Priest Spell, Affect Statistic.

    A possible approach could be to use an extra (or pic) value to specify if the node is to only affect the present pc or the whole party. I think simply "fixing" this (i.e correcting the functions) is asking for compatibility problem. I may be wrong though ...

     

    The three Affect Stealth, Affect Firewalk and Affect Flight nodes correctly give the power to the whole party (i have to investigate Stealth as i don't know what it does).

     

    Edit2 : The game didn't crash when i leaved town with number more than 100. However, during one of my test, the last (dummies) towns i created to reach number 100 were completely screwed (all named ÿÿÿÿ, mixed graphics in town terrains, ...), so i suspect an array error to lurk somewhere in the code. I will continue the investigation.

     

    Two more "bugs fix" :

     

    The game displays no more than 10 areas description out of the 16 proposed (Alcritas)

     

    This is a little more complicated, depending on the size of the town you can use 4 (small), 10 (medium) or 12 (large) maximum area descriptions.

     

    In GRAPHICS.cpp in the function draw_text_bar(), the hardcoded array num_rect[3] = {12,10,4} is the cause of this limitation.

    Not seeing why one couldn't use all the 16 area descriptions, i remove the array and replace the check for (i = 0; i < num_rect[town_size]; i++) by for (i = 0; i < 16; i++). Don't hesitate to tell me if i've missed something.

     

    - The Spell “Resurrection” (note : and Raise Dead) does not require a Resurrection Balm, despite advertisements to the contrary.

     

    I wonder if we should fix this one (any broken compatibility ?), but since it may prevent the spell from being cast...

    In function cast_priest_spell(), case 40 and 50, find the line if ((item = adven[pc_num].hasAbil(13)) == 16) { and replace it by if ((item = adven[pc_num].hasAbil(160)) == 24) {. The add_to_buffer(...) should be replaced by a sprintf(c_line,"Need ...") to prevent redundant Spell: Resurrection lines to be printed.

    The game was (originally) checking if an item causing fear was present in slot 17 of the inventory (a leftover of Exile II, when you had only 16 slots in the inventory !!!), thus having a Cause Fear weapon in slot 17 prevent the pc from casting Resurrection.

     

    Note that such leftovers are present in the do_mindduel() function (if (adven[pc_num].hasAbilEquip(53) < 16 should read if (adven[pc_num].hasAbilEquip(53) < 24) and in statAdj() in the line if (hasAbilEquip(99) < 16) tr++; (moreover, ability 99 doesn't exists ... this object is supposed to grant a damage bonus when the skill used is intelligence (mostly magic). With what should we replace it ?)

     

    Edit3 : Should stop editing the same post crazy

    The Random Number ? Node is affected by the "100 % means almost always" bug (and no, it doesn't happen on a negligible set wink ).

    In Ifthen_spec() (SPECIALS.cpp), the third case (132), put a less or equal instead of less in the random check.

  3. Ishad Nha, I've continued your work on the char editor.

    Here are the changes i implemented, following your suggestions:

     

    • The editor now display the filename of the scenario you are in.
    • The editor now get the list of items from the scenario you're in. If not in a scenario, bladbase.exs is used. (clicking a item with food (resp. gold) type will give a random (1-20) amount of food (resp. gold).)
    • References to registration and shareware are removed.
    • Status Screen now show Food, Gold and Day.
    • Corrected the garbled status due to a non-alive character (Ishad Nha)
    The code can be found in the openexile repository on Google Code (sorry about the two blank revisions, but i was trying a GUI and it automatically committed the changes. Nothing like the command line, hey wink ) since i think this part of the code is pretty complete (ressources files should be cleaned though, lots of useless dialogs i think).

     

    Note that the editor tries to find the scenario files under your scenario folder (the joke of changing the current directory has been fixed here too) and bladbase.exs under your blade of exile directory (this is where it should be, right ?).

     

    Hope it helps,

    Chokboyz

  4. Quote:
    I think a better way to do this would be to add "occasional splash" as an additional option for the step sound. I've implemented this, and can post the code if you'd like, but it should be noted that it will cause older scenarios to produce the squish sound instead.

    That's definitely an option. I will stick with the original behavior right now because i work mainly on bug fixing, but that belongs to the suggestion list.

    Quote:
    The check was already there outside the loop. That confused me. I'll remove it.

    Odd, it wasn't there in my code ... Remove it safely.

    Quote:
    Okay. I'll change that back. Did you adopt MONSTER_TYPE_MAGICAL too?

    No, i just adopted SDF flag and shortened ...PROTECT_FROM... and NonSpell Use constants.

    Quote:
    What sort of compatibility switch? A stuff done flag, or checking an extra field in the terrain definition?

    Right now it's a stuff done flag ([309][3] if i remember correctly), mainly for testing purpose.

    Quote:
    Oh, that's good then. When will it be added to the repository, though?

    When majors bug will be ironed out (that's not so far ...) and i cleaned the code a little (nobody wants to be noticed the party.age each step, huh ? wink ) ...

    Chokboyz
  5. Originally Posted By: Celtic Minstrel
    I'm not convinced it will play a "first big splash". I took your code as a base and made my own version:

    It will, because it's not this function that play the "big splash" (it's one_sound() if I remember correctly). Then if the last sound played with one_sound is big_splash, it will not replay the sound (same for dumbfound, ...).

    Originally Posted By: Celtic Minstrel
    So, if you're moving from a poison square to a poison or disease square, or from a disease square to a poison or disease square, the sound will be ignored. However, if you move onto a poison or disease square from some other type of square, the sound will be played. I'm pretty sure this code will do that. (In case you're not aware, a static local variable retains its value over multiple function calls. It's essentially a global variable that can only be accessed from one function.)

    In the original code, swamps produces no sound when walking on it; what you did is to add a squish (by default) sound when first stepping on it. That seems a little weird to me though (the big splash playing once in a while is enough i think, and since this is done in another function ...).

    Originally Posted By: Celtic Minstrel
    Well, I did that, but there was something odd there. This is what that chunk of the code now looks like:

    Why did you duplicate the check outside of the loop ? What it will do is to recheck the last rectangle to see if there is a conveyor here ... And the others field = true lines are indeed supposed to be outside the loop (the game assumes that such field are always present thus active).

    Originally Posted By: Celtic Minstrel
    One more thing. I notice you've commented out some of the constants I added? Not that it really matters, but may I ask why?

    To remind me that i have to look for references in the code wink

    Originally Posted By: Celtic Minstrel
    As for the MONSTER_TYPE_ constants, I kind of like the idea of using MONSTER_RACE_ instead. Any objections?

    Oh, and drop the _CREATURE from MAGICAL_CREATURE.

    Like ADoS, i think we should stick with the editor calling ... In the opposite, the others changes in CONSTS.h are a good idea and i have adopted them.

    Originally Posted By: Celtic Minstrel
    In other news, I split off the dialog code, the sound code, and much of the graphics code into a place where it can be shared. The Scenario Editor compiles, links, and runs successfully, which honestly isn't terribly surprising since there is little to no actual change between this code and the version of the code the Scenario editor used.

    Good news, keep on going ...

    Originally Posted By: Thuryl
    It probably shouldn't be corrected -- or if it is, there should be a compatibility option. I'm not sure if there are any scenarios that rely on pushing PCs through walls with conveyor belts (although there could be), but there are definitely scenarios that rely on pushing items onto blocked terrains like tables.

    Suspecting that, i added a compatibility switch for that one.

    Originally Posted By: Thuryl
    By the way, I really appreciate all the work you're putting into this. You and Celtic Minstrel are both doing a great job.

    Thanks wink

    By the way, do you have an explanation of what the precise problem with event timers/time passing is ? For what i have found, the only problem is that Resting outside/in Inn/through a Have a Rest Node bypass the event check. I didn't found a difference between in town and outdoor day as mentionned, so maybe i'm missing the point confused

    Originally Posted By: Celtic Minstrel
    by the way, when are you going to merge your code with his?

    I have already merged his code with mine (using the last 2009 BoE sources available at the time). I am indeed doing the changes but Ishad Nha is kind enough to compile and make available an in-progress version (kind of weekly build) for those who want it (and why not want to beta test the changes grin ). And he is the one working on the Windows Scenario Editor.

    Chokboyz
  6. Quote:
    Oh, okay. I'm actually still using the original, purchaseable BoE and scenario editor, out of fear of corruption and bugs introduced in the last version of Ormus's BoE that I used. I'm waiting for a stable version that's as bug-free as possible before I upgrade. Sorry.

    No problem, i can understand that ... and we're trying to provide this stable, bug-free version wink

    Concerning the timers problems, i don't know what i'm supposed to look after ... (the time unit for me is the town step move, here after shortened to move)
    Taking a step (with or without horses) in town counts as 1 move, taking a step outside counts as 10 moves (5 while on horses), waiting 40 moves on town actually waits 80 moves and resting outside counts as 1700 moves.
    Outside, the moves are taken modulo 10 (modulo 5 while on horse), so if the party_age is 147 when exiting a town, it is rounded to 150. I doubt that causes bugs though.
    Resting (Inn) is 700 moves.
    A day is 3700 moves.
    When trying scenario event timers, everything worked fine (dialog displayed every 150 moves) except when resting. In fact,resting bypass (if rest successful) the 1200 last resting moves (that may get timers slightly off : if my party age is 1200 and i rest, three dialogs appears (150*3 = 450 ; 1700-450=1250) but the fourth one will appears a little (100 moves) after awaking (2850<1200+1700=2900< 3000)).
    Is that the problem encountered ?
    On a side note, a day passed outside is the same as a day passed in town (3700 moves).

    Chokboyz

    Edit : sleeping in Inn and Have a Rest Node also bypass the event check ... So that must be the source of the problem (whatever it is) ...
  7. That would be a neat addition indeed ... put on the to-do list wink

    The actual phase being bug-fixing,(time passage investigated right now), those features may not be in for a while though smile

     

    Thanks for your comments/ideas,

    Chokboyz

     

    Edit :

    Quote:
    Also, on the editor end, when editing a sign, the dialog box incorrectly says that " creates a line break, rather than |. This has caused several scenario authors to use underscores instead of quotes, which frankly is rather silly.

    Corrected in my version confused

     

    Oops, i didn't gave the last version of the step sound code. The last one was buggy (while on boat and horse you would hear footsteps), here is the corrected version :

     

    Click to reveal..
    void move_sound(unsigned char ter,short step)

    {

    short pic,spec;

     

    pic = scenario.ter_types[ter].picture;

    spec = scenario.ter_types[ter].special;

     

    if ((monsters_going == FALSE) && (overall_mode < 10) && (party.in_boat >= 0)) {

    if (spec == 21)

    return;

    play_sound(48);

    }

    else if ((monsters_going == FALSE) && (overall_mode < 10) && (party.in_horse >= 0)) {////

    play_sound(85);

    }

    else if(scenario.ter_types[ter].special == 5) //if poisoned land don't play squish sound : BoE legacy behavior, can be removed safely

    return;

    // else if(scenario.ter_types[ter].special == 6) //if diseased land do the same

    // return;

    else switch(scenario.ter_types[ter].step_sound){

    case 0:

    if (step % 2 == 0) //footsteps alternate sound

    play_sound(49);

    else play_sound(50);

    break;

    case 1:

    play_sound(55); //squish

    break;

    case 2:

    play_sound(47); //crunch

    break;

    case 3:

    break; //silence : do nothing

    default:

    if (step % 2 == 0) //safety footsteps valve

    play_sound(49);

    else play_sound(50);

    }

    }

  8. Quote:
    Yes. Just because you and I can't think of any intelligent use for such a function doesn't mean someone else won't, and I see no reason to unnecessarily limit someone's creativity.

    And i see no reason why i wouldn't have implemented it ... That was a true question you know wink
    A use ? Put the party on a giant conveyor outdoor belt (let say they are caught in the ford of a river, so water graphics), if they have done the right thing they will ends up on a dam/whatever_structure_you_want. If they have not, the town remains hidden and they continue their way to the sea and their doom. And i'm sure people would find way better use for this wink

    Chokboyz

    Edit: Fixing is finished : now, if you change the terrain (using it, stepping on it, lock/unlocking (bash/lockpick/magic/node), crumbling, whatever) while in town and the terrain is a conveyor belt, it springs to life, eager to push you into a wall (yes, that as not yet been corrected). Outdoors version is on the to-do list.

  9. Quote:
    We still need to fix the already existing terrain types, however.

    Don't worry, half of it is already done (lock/unlock rectangle).

    Quote:
    Also, perhaps we could make them work outdoors, while we're making waterfalls work indoors.

    Why not ... Besides, that would be pretty easy ...

    Quote:
    If we do that, we need to make sure to fix the check for hidden/revealed towns to notice the terrain change as well.

    It seems I don't understand what you mean ... You want to hide a town under a potential conveyor belt terrain ? grin

    Chokboyz
  10. Indeed, it does change (having the help file on hand is essential when using this editor rolleyes ). I think i should check the "Change when step on" status too wink

     

    Oh, by the way, your "Show room description more than once" option is back. We only needs to agree on what special to check and hop, it's implemented.

     

    Chokboyz

  11. Quote:
    It's almost as if the chances of the two are reversed then...

    It's exactly that smile The other approach would have let the nimble one with the same chance, but heavily (+12) penalized the non-nimble.

    Quote:
    The hard part is actually adding the LED without the ability to preview the dialog. The code changes shouldn't be too difficult

    Inspire yourself from the already existing ressources files ... I can't help you unfortunately, i can't even open .rsrc crazy

    Quote:
    In that case, I'll create my own set of constants for that purpose. If you could send me your current version of consts.h by PM or email, that would be nice.

    Done

    A final bug fix (thanks Thuryl) :
    Quote:
    Conveyer Freezes upon loading fixed.


    In load_file() in FILEIO.cpp, find the lines
    if (town_restore == FALSE) { and add the lines :
    Click to reveal..
    if (town_restore == FALSE) {
    center = party.p_loc;
    load_area_graphics();
    }
    else {
    load_town(c_town.town_num,2,-1,NULL);
    load_town(c_town.town_num,1,-1,NULL);
    for (i = 0; i < T_M; i++)
    {monster_targs.x = 0; monster_targs.y = 0;}

    town_type = scenario.town_size[c_town.town_num];
    // Set up field booleans
    for (j = 0; j < town_size[town_type]; j++)
    for (k = 0; k < town_size[town_type]; k++) {
    // Set up field booleans
    if (is_web(j,k) == TRUE) web = TRUE;
    if (is_crate(j,k) == TRUE) crate = TRUE;
    if (is_barrel(j,k) == TRUE) barrel = TRUE;
    if (is_fire_barrier(j,k) == TRUE) fire_barrier = TRUE;
    if (is_force_barrier(j,k) == TRUE) force_barrier = TRUE;
    if (is_quickfire(j,k) == TRUE) quickfire = TRUE;
    if ((scenario.ter_types[t_d.terrain[j][k]].special >= 16) &&
    (scenario.ter_types[t_d.terrain[j][k]].special <= 19))
    belt_present = TRUE;
    }
    force_wall = TRUE;fire_wall = TRUE;antimagic = TRUE;scloud = TRUE;ice_wall = TRUE;blade_wall = TRUE;
    sleep_field = TRUE;
    center = c_town.p_loc;
    load_area_graphics();
    }

    so that each time the game is loaded while in town, it checks if there is a conveyor and acts accordingly.

    Chokboyz
  12. Quote:
    Well, the approach you've chosen means that a non-nimble character has an unchanged chance, right? So I guess that's fine.

    Actually no, both approach modifies the non-nimble chance to succeed (remember that the bonus was applied to the non-nimble characters). The approach I choose is to suppose that non-nimble characters are the norm and that nimble ones should have a bonus when trying to lockpick/poison/disarm. With theses changes, non-nimble characters would have (at same skill, items, ...) the same chance of succeeding than a nimble character has in the buggy version (on opposite, nimble characters would be more efficient, exactly as a non-nimble character in the old buggy version).

    Quote:
    I should probably implement that. It would require delving into the DITL resource and attempting to add another LED, then adding code support for it if necessary (I would assume it is).

    That's an easy change. Once you've figured out how the dialog/ressources works (hint : study pick_preferences() and prefs_event_filter() in dialogutils.c of your code), all you have to do is, indeed, to tweak the plop_fancy_startup() function to check if the SDF[305][4] (or whatever you use) is set or not.

    Quote:
    I suppose the change is simply that you don't call the plop_fancy_startup() function on startup?

    You can do that. I tweaked the function so that it only display briefly the Spiderweb Software logo (with no sound) then prompt the menu. It's all up to you wink

    Quote:
    And I should add the preferences in SDF(306,x) to consts.h, too... have you done so? If so, what did you call them?

    No, i didn't, but i've added items specials skills, monsters skill, etc ... that the consts.h in the google code repository lacks. A copy of this consts.h (may not be up-to-date) can be found in one of the recent posts.

    Quote:
    I'm in the process of gathering the dialog code into a single place. Currently the code is mostly duplicated across the three programs, so merging the various versions of it will (hopefully) help when improving the code. I'm also splitting out common graphics functions as well as the sound code (which I think it mostly the same in all three programs).

    It would be nice (and maybe a start to cross-platforming). Having take a look at the code, good luck with that though wink

    Quote:
    By the way, I've been wondering – if you change the name of a file that's under SVN version control, will it be included in the next commit or would you have to remove it (under the old name) and re-add it?

    Unfortunately, i don't know, since i haven't tried it ...

    Chokboyz

    Edit : finally the three pieces of code that i had to post :

    Quote:
    Placed conveyor resulting from place/swap/transform terrain when no prior conveyor was present weren't functional. Fixed.

    Function town_mode_spec() in SPECIALS.cpp
    Click to reveal..
    case 171:
    set_terrain(l,spec.ex2a);
    if(scenario.ter_types[spec.ex2a].special >= 16 && scenario.ter_types[spec.ex2a].special <=19)
    belt_present = TRUE;

    *redraw = TRUE;
    draw_map(modeless_dialogs[5],10); // previous bug fixes : redraw map when terrain has changed
    break;
    case 172:
    if (coord_to_ter(spec.ex1a,spec.ex1b) == spec.ex2a){
    set_terrain(l,spec.ex2b);
    if(scenario.ter_types[spec.ex2b].special >= 16 && scenario.ter_types[spec.ex2b].special <=19)
    belt_present = TRUE;
    }
    else if (coord_to_ter(spec.ex1a,spec.ex1b) == spec.ex2b){
    set_terrain(l,spec.ex2a);
    if(scenario.ter_types[spec.ex2a].special >= 16 && scenario.ter_types[spec.ex2a].special <=19)
    belt_present = TRUE;
    }
    *redraw = 1;
    draw_map(modeless_dialogs[5],10); break;
    case 173:
    ter = coord_to_ter(spec.ex1a,spec.ex1b);
    set_terrain(l,scenario.ter_types[ter].trans_to_what);
    if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special >= 16 && scenario.ter_types[scenario.ter_types[ter].trans_to_what].special <=19)
    belt_present = TRUE;

    *redraw = 1;
    draw_map(modeless_dialogs[5],10);
    break;

    This has previously (a few post above) been done on the change/swap/transform rectangle terrain. I forgot to apply the draw_map fix to the rectangle functions though. This has been fixed.

    Quote:
    Affect Statistic Node probability check was wrong. It draws a number between 0 and 100 and if the number is strictly less than pic the stats were changed. Obviously even a 100 percent chance had 1 chance on 101 to fail.

    Find case 98 in the affect_spec() function (SPECIALS.cpp) and replace the get_ran(1,0,100) < spec.pic with get_ran(1,1,100) <= spec.pic. Similar fix has to be applied to monster radiate field, field placement (to CM : you already did this) and monster dropping (place_glands() ). The monster summon ability get_ran must be taken over 0 and 99 to be accurate (i.e 50% means not 50/101 chance).

    Quote:
    No Step on sound option was taken in account. Fixed

    Replace the move_sound() function in EXLSOUND.cpp by something like that :
    Click to reveal..
    void move_sound(unsigned char ter,short step)
    {
    short pic,spec;

    pic = scenario.ter_types[ter].picture;
    spec = scenario.ter_types[ter].special;

    if ((monsters_going == FALSE) && (overall_mode < 10) && (party.in_boat >= 0)) {// is on boat ?
    if (spec == 21) //town entrance ?
    return;
    play_sound(48); //play boat sound
    }
    else if ((monsters_going == FALSE) && (overall_mode < 10) && (party.in_horse >= 0)) {//// is on horse ?
    play_sound(85); //so play horse sound
    }
    if(scenario.ter_types[ter].special == 5) //if poisoned land don't play squish sound : BoE legacy behavior, can be removed safely
    return;
    // if(scenario.ter_types[ter].special == 6) //if diseased land do the same
    // return;
    else switch(scenario.ter_types[ter].step_sound){
    case 0:
    if (step % 2 == 0) //footsteps alternate sound
    play_sound(49);
    else play_sound(50);
    break;
    case 1:
    play_sound(55); //squish
    break;
    case 2:
    play_sound(47); //crunch
    break;
    case 3:
    break; //silence : do nothing
    default:
    if (step % 2 == 0) //safety footsteps valve
    play_sound(49);
    else play_sound(50);
    }
    }


    Note that, this code preserve the legacy BoE behavior (i.e no sound when walking on swamp, except the first big splash). Remove the poisoned land lines and the squish sound will be used.
  13. Quote:
    So, as far as I can tell, you didn't alter any code after the monster_loaded check...

    If i remember correctly i changed a > to >= (or < to <=) in one of the check so that the monster appears on day X and not day X+1. I may have flipped a 0 to 1 also, i don't remember exactly.

    Quote:
    Presumably you deleted that code? It doesn't appear to be in the Mac version, but I commented out the two lines in combat.c that give you a bonus if you're in the Anama

    Commented it for nostalgia value grin The windows version seems to be a straight adaptation of the Exile III engine (not that is a bad thing of course), hence the numerous leftovers.

    Quote:
    What about cases 217 and 218? Do they need the belt_present check too? I'd guess they do...

    Nop, locking/unlocking rectangle have nothing to do with conveyor as far as i can tell. wink

    Quote:
    Also, I changed all instances of get_ran in that switch statement to the corrected version. That's correct, right?

    It is indeed wink

    Quote:
    Okay... but is that actually equivalent? What were the chances of disarming a trap before and after this fix, with and without the Nimble trait?

    Not having the Nimble trait were giving you bonus (-6 when poisoning weapons, disarm traps, -8 when lockpicking), being Nimble then makes you more clumsy.

    The two possible approachs are :
    • Ok, so he tried to penalized characters not having the nimble traits. Correct the - in + and that's ok (the "base" roll to succeed in lockpicking/disarm trap/put poison correctly, becomes de facto the one a nimble character needs to make; this makes the game harder)
    • Ok, so he put FALSE instead of TRUE; must be a leftover of an older function. Correct FALSE to TRUE and that's ok (the "base" roll to succeed in lockpicking/disarm trap/put poison correctly, becomes de facto the one a non-nimble character needs to make; this makes the game easier)

    Why did I choose the second approach ? Mainly becauses it makes more sense to me to give bonus to someone nimble rather than penalizes a normal one and, more esoteric, if you tries to lockpick with thieving item equipped, 12 is substracted to r1. Add the -8 you would supposely get if nimble and that makes a nice, round 20 substracted to r1. I thought i would be the initial intention of Jeff when he wrote the function smile As always, this is open to discuss ...

    Quote:
    Oh wait, this answers one of my questions above, doesn't it...?

    Well, yes wink

    On a side note, i've reverted "Show room description more than once" to the original (useless) behavior so that, when we will agree on the sdf to use, it can be made into a working option. "Show startup picture/music" has been moved to the (unused) SDF[305][4].

    Chokboyz
  14. Quote:
    We could use SDF(306,5) for that? It wouldn't really break compatibilty since it's only a preference.

    I thought the same. Turn off frills on shore is now SDF[306][5] in my code.

    Quote:
    I like this idea. It shall be added to the suggestions in the first post.

    Yup, we only need to agree on what Extra field to use wink

    Chokboyz

    Edit : seems like disarming wasn't the only thing that Nimble Fingers makes harder ... In fact, everytime a check is done involving Nimble Fingers, having the trait penalizes you ..
    This is easily fixed (i choose to give bonus to Nimble ones rather than penalizing those without the trait) :
    find the check if (adven[pc_num].traits[3] == FALSE) and replace FALSE by TRUE. Delete eventual previous fix : the adjustement to r1 must be substracting(i.e -= 6). In my version of the code, there were only 3 times this check was done : disarming trap, lockpicking and putting poison on weapon ...

    Concerning the 100% problem, the monsters radiates field (COMBAT.cpp) abilities, the monster special summon abilities (must take a random between 0 and 99, not 100 to be accurate), the placement of fields (fire, ice, force ...) and the dropping chances (place_glands function) were affected by the glitch (to fix, get a random number between 1 and 100 and checks if less or equal).

    On a lighter side, more cleaning must be done to the code : browsing it i found that having the PSD[4][0] set to 3 was making you a member of the anama (Exile III relic wink ) and then gives you a significant bonus (+25 to damage) when casting ravage spirit on a demon. If the right dialog was present (the sound plays though smile ), you could even be penalized if you spend xp in mage spell !!!
    Click to reveal.. (proof)
    if (which_skill == 9) { // mage spell skill
    if (PSD[4][0] == 3) { //member of the anama ?
    if (FCD(3049,1010) == 2) {//display dialog : Are you sure ? Anama won't be pleased, etc ...
    FCD(3050,1010); //display dialog : Ok, you asked for it ...
    PSD[4][0] = 1; party.spec_items[39] = 0; // no more a member, remove the Anama rings
    for (i = 0; i < 6; i++) {adven.max_sp -= 6; adven.skills[10] -= 2; //remove 6 spell points and 2 priest spell skill
    for (j = 30; j < 62; j++) {if (get_ran(1,0,2) < 2) adven.priest_spells[j] = 0;} //randomly remove high level priest spells
    }
    }


    Finally, the Change/Swap/Transform rectangle function must be adapted to make working conveyor appearing. Here my proposition of such code (tested and worked) : (function rect_spec(), file SPECIALS.cpp ; notice the corrected get_ran wink )
    Click to reveal..
    case 214:
    if (get_ran(1,1,100) <= spec.sd2){
    set_terrain(l,spec.sd1);
    if(scenario.ter_types[spec.sd1].special >= 16 && scenario.ter_types[spec.sd1].special <=19)
    belt_present = TRUE;
    }
    break;
    case 215:
    if (coord_to_ter(i,j) == spec.sd1){
    set_terrain(l,spec.sd2);
    if(scenario.ter_types[spec.sd2].special >= 16 && scenario.ter_types[spec.sd2].special <=19)
    belt_present = TRUE;
    }
    else if (coord_to_ter(i,j) == spec.sd2){
    set_terrain(l,spec.sd1);
    if(scenario.ter_types[spec.sd1].special >= 16 && scenario.ter_types[spec.sd1].special <=19)
    belt_present = TRUE;
    }
    break;
    case 216:
    ter = coord_to_ter(i,j);
    set_terrain(l,scenario.ter_types[ter].trans_to_what);
    if(scenario.ter_types[scenario.ter_types[ter].trans_to_what].special >= 16 && scenario.ter_types[scenario.ter_types[ter].trans_to_what].special <=19) belt_present = TRUE;

  15. Ok, so here is my code for the Appears/Disappears on day X/event Y fix (include before and after the monster_loaded check).

     

    Click to reveal..
    for (i = 0; i < 4; i++)

    if (town_number == party.creature_save.which_town) {

    c_town.monst = party.creature_save;

    monsters_loaded = TRUE;

     

    for (j = 0; j < T_M; j++) {

    if (loc_off_act_area(c_town.monst.dudes[j].m_loc) == TRUE)

    c_town.monst.dudes[j].active = 0;

    if (c_town.monst.dudes[j].active == 2)

    c_town.monst.dudes[j].active = 1;

    c_town.monst.dudes[j].m_loc = t_d.creatures[j].start_loc;

    c_town.monst.dudes[j].m_d.health = c_town.monst.dudes[j].m_d.m_health;

    c_town.monst.dudes[j].m_d.mp = c_town.monst.dudes[j].m_d.max_mp;

    c_town.monst.dudes[j].m_d.morale = c_town.monst.dudes[j].m_d.m_morale;

    for (k = 0; k < 15; k++)

    c_town.monst.dudes[j].m_d.status[k] = 0;

    if (c_town.monst.dudes[j].summoned > 0)

    c_town.monst.dudes[j].active = 0;

    monst_target[j] = 6;

    }

     

    // Now, travelling NPCs might have arrived. Go through and put them in.

    // These should have protected status (i.e. spec1 >= 200, spec1 <= 204)

    for (j = 0; j < T_M; j++) {

    switch (c_town.monst.dudes[j].monst_start.time_flag){

    case 4: case 5 : case 6:

    if ((((short) (party.age / 1000) % 3) + 4) != c_town.monst.dudes[j].monst_start.time_flag)

    c_town.monst.dudes[j].active = 0;

    else {

    c_town.monst.dudes[j].active = 1;

    c_town.monst.dudes[j].monst_start.spec_enc_code = 0;

    // Now remove time flag so it doesn't get reappearing

    c_town.monst.dudes[j].monst_start.time_flag = 0;

    c_town.monst.dudes[j].m_loc = t_d.creatures[j].start_loc;

    c_town.monst.dudes[j].m_d.health = c_town.monst.dudes[j].m_d.m_health;

    }

    break ;

     

    // Now, appearing/disappearing monsters might have arrived/disappeared.

    case 1:

    if (day_reached(c_town.monst.dudes[j].monst_start.monster_time, c_town.monst.dudes[j].monst_start.time_code) == TRUE)

    {

    c_town.monst.dudes[j].active = 1;

    c_town.monst.dudes[j].monst_start.time_flag=0; // Now remove time flag so it doesn't get reappearing

    }

    break;

    case 2:

    if (day_reached(c_town.monst.dudes[j].monst_start.monster_time, c_town.monst.dudes[j].monst_start.time_code) == TRUE)

    {

    c_town.monst.dudes[j].active = 0;

    c_town.monst.dudes[j].monst_start.time_flag=0; // Now remove time flag so it doesn't get disappearing again

    }

    break;

    case 7:

    if (calc_day() >= party.key_times[c_town.monst.dudes[j].monst_start.time_code]){ //calc_day is used because of the "definition" of party.key_times

    c_town.monst.dudes[j].active = 1;

    c_town.monst.dudes[j].monst_start.time_flag=0; // Now remove time flag so it doesn't get reappearing

    }

    break;

     

    case 8:

    if (calc_day() >= party.key_times[c_town.monst.dudes[j].monst_start.time_code]){

    c_town.monst.dudes[j].active = 0;

    c_town.monst.dudes[j].monst_start.time_flag=0; // Now remove time flag so it doesn't get disappearing again

    }

    break;

    case 0:

    break;

    default:

    break;

    }

    }

     

    for (j = 0; j < town_size[town_type]; j++)

    for (k = 0; k < town_size[town_type]; k++) { // now load in saved setup,

    // except that barrels and crates restore to orig locs

    temp = setup_save.setup[j][k] & 231;

     

    misc_i[j][k] = (misc_i[j][k] & 24) | temp;//setup_save.setup[j][k];

    }

    }

     

    if (monsters_loaded == FALSE) {

    for (i = 0; i < T_M; i++)

    if (t_d.creatures.number == 0) {

    c_town.monst.dudes.active = 0;

    c_town.monst.dudes.number = 0;

    c_town.monst.dudes.monst_start.time_flag = 0;

    c_town.monst.dudes.m_loc.x = 80;

    }

    else {

    // First set up the values.

    monst_target = 6;

    c_town.monst.dudes.active = 1;

    c_town.monst.dudes.number = t_d.creatures.number;

    c_town.monst.dudes.attitude = t_d.creatures.start_attitude;

    c_town.monst.dudes.m_loc = t_d.creatures.start_loc;

    c_town.monst.dudes.mobile = t_d.creatures.mobile;

    c_town.monst.dudes.m_d = return_monster_template(c_town.monst.dudes.number);

     

    c_town.monst.dudes.summoned = 0;

    c_town.monst.dudes.monst_start = t_d.creatures;

     

    if (c_town.monst.dudes.monst_start.spec_enc_code > 0)

    c_town.monst.dudes.active = 0;

     

    // Now, if necessary, fry the monster.

    switch (c_town.monst.dudes.monst_start.time_flag) {

    case 1:

    if (day_reached(c_town.monst.dudes.monst_start.monster_time,

    c_town.monst.dudes.monst_start.time_code) == FALSE)

    c_town.monst.dudes.active = 0;

    break;

    case 2:

    if (day_reached(c_town.monst.dudes.monst_start.monster_time,

    c_town.monst.dudes.monst_start.time_code) == TRUE)

    c_town.monst.dudes.active = 0;

    break;

    case 3:

    // unused

    break;

    case 4: case 5: case 6:

    if ((((short) (party.age / 1000) % 3) + 4) != c_town.monst.dudes.monst_start.time_flag) {

    c_town.monst.dudes.active = 0;

    c_town.monst.dudes.monst_start.spec_enc_code = 50;

    }

    else {

    c_town.monst.dudes.active = 1;

    // Now remove time flag so it doesn't keep reappearing

    c_town.monst.dudes.monst_start.time_flag = 0;

    }

    break;

    case 7:

    if (calc_day() < party.key_times[c_town.monst.dudes.monst_start.time_code])

    c_town.monst.dudes.active = 0;

    break;

     

    case 8:

    if (calc_day() >= party.key_times[c_town.monst.dudes.monst_start.time_code])

    c_town.monst.dudes.active = 0;

    break;

    case 9:

    if (c_town.town.town_chop_time > 0)

    if (day_reached(c_town.town.town_chop_time,c_town.town.town_chop_key) == TRUE) {

    c_town.monst.dudes.active += 10;

    break;

    }

    c_town.monst.dudes.active = 0;

    break;

    case 0:

    break;

    default:

    break; }

    }

    }

    I fixed the day_reached function so that it is equivalent to the (correct) mac one.

     

    Quote:
    On an almost-related note, could someone possibly inform me what SDF(306,x) are used for?

    [306]

    [0] is Don't Save Maps

    [1] is No Sounds

    [2] is No graphics frills (lose special effects)

    [3] is (by default) Show room description more than once

    [4] is Never show instant help

    [6] is the game speed

    [7] is Make game easier (monsters much weaker)

    [8] is Fewer wandering monsters

    [9] is Turn off terrain animation

     

    [296][0] is Turn off frills on shore (yup, it's an unprotected index ... you can change this option by having a set flag node setting the [296][0] to 0 (turn off) or whatever else (turns on) ... Should be fixed in my opinion )

     

    [305]

    [6] is No targeting line (use if getting crashes)

    [5] is Fewer sounds (use if getting crashes)

     

    display_mode is the variable storing the display mode.

     

    Quote:
    I await your code for these.

    I will post it shortly, now i have access to the code.

     

    Quote:
    Finally, I have disabled the password check in the editor – it was a simple matter of commenting out an if block in load_scenario(). I'm not sure if the Windows editor has disabled this – you might want to check.

    That was one of the very first thing Ormus did wink

     

    Chokboyz

  16. I should add the links i used to find bug to fix.

     

    First, Alcritas' Things that don't works : http://www.geocities.com/blyceum/DForum/023.html

     

    ADoS previous link

     

    Lew Titteron's Still More Things that Don't Works : http://www.geocities.com/blyceum/DForum/034.html

     

    The first link has a load of things to fix in the official bladbase.exs (alien blade, knowledge brew, ...).

     

    Hope it helps,

    Chokboyz

  17. Quote:
    Hmm... some of the preferences make sense to store in the save file. "Don't save maps", "Show room descriptions more than once", "Make game easier", and "Fewer wandering monsters" make sense in the save file. (Of course, one of those doesn't even do anything.) It also makes some sense to store "No sounds" in the save file, but it also makes sense not to.

    I wasn't really precise in my explications smile
    Not all preferences are stored in the ini file : only the give intro hint (start-up tips), play sounds, first time launch ?, display mode and instant help are stored in the ini file, the others options are stored in the savegame file. The option I replace (intro picture/music at start-up) has been added to the ini file, the sdf being used only for storage of the value. So it seems to me we agree on this one wink

    Should the need for a two-tier system arise (i.e people posting for this peculiar feature), i would gladly implement it, but for now i don't think it is needed (don't hesitate to say so if i'm wrong) ...

    Quote:
    I think it was experience or skill points where I encountered that.

    Ok, i will check all the nodes to be sure ...

    Quote:
    I have implemented something like Ishad's "display the name of the current town". In order to do this, I used an additional string, and moved the terrain area up about 6 pixels so that it can be fully seen (changed #define TER_RECT_UL_Y 25 to be 19).

    Isn't this a Scenario Editor change ? If so, i'm okay with all of this (Ishad Nha is the one maintening/improving it) wink

    Chokboyz
  18. Quote:
    The SDF preferences are (presumably) stored in the savegame file, rather than the preferences file, but that setting has nothing to do with the savegame; rather, it affects startup.

    In the Windows build there is no preferences file (to the best of my knowledge). Bladmisc.dat has been replaced by blades.ini .
    The SDF array is an 310x10, the 300 first being the one you use in the editor (0 to 299) and the last 10 being the "system" protected one (for example, preferences is the array SDF[306][x]). I don't know if this is the original behavior (but i think so) or an Ormus' change. Besides, in the Ormus' build an ini file is used to store the preferences/compatibilities (to not relies on the savefile. Note that all the 3100 values of the SDF array is stored in the savefile). Each time you load a game/begin a scenario/End a scenario, the preferences are reloaded from the ini file. The SDF [306][x] is used to store the value (to prevent reading the ini file over and over), but the ini file is where preferences are really located.
    What i did was to transform an useless (never used anywhere) option (and index in the SDF array) into a potentially useful one.
    Finally, note that the SDF array is initialized to 0 (every 3100 values) each time a new scenario is loaded.

    Hope that clarifies the situation smile

    Quote:
    I doubt it, but if you're worried you could probably incorporate some kind of switch into the node.

    Ok, temporary or not, that will be done wink

    Quote:
    Currently, an Affect Party node will affect the whole party even if the party is split up (if I recall correctly). That makes no sense at all. Unless someone knows a scenario that relies on this entirely counterintuitive behaviour, I don't think it would be an issue.

    Upon my differents testing, i found that damage/health reduce/spell points reduce did only affect the lone pc. But give skills points affect the whole party. Not sure about the rest of the Affect PC nodes ...

    Concerning the conveyor freezing upon loading, did anyone knows a scenario where this happens ? (i couldn't reproduce this with a scenario of mine) ...

    Thanks,
    Chokboyz
  19. Quote:
    I don't know of any fixes applied to the Mac version that aren't in the Windows version. You could look back at my recent mammoth posts – there are a few things I did that weren't based on things you and Ishad did – but prior to that I have no idea.

    Ok, i will. Thanks ...

    Quote:
    What do you mean by "Show start picture and music"?

    If the option is activated, show the picture with the guy wielding a sword and looking to a tumulus-like structure and play the intro music. If not, just show the spiderweb logo and prompt to the main menu (a shortcut; the intro picture and music were desactivated by Ormus to quicken the loading and the test of the modificitions ...)

    Quote:
    (CM)When the party is split up, Affect PC special nodes should only affect the active PC.

    That would be easy to fix, but wouldn't it break some legacy scenario compatibility ?

    Chokboyz
  20. The corrected list seems fine to me except i don't know what

    Quote:
    (Miramor)Fix up time passage as per this post and this post .
    refers to ...

    Speaking of which, are there any fixes done to the mac version that hasn't been applied to the windows one ?

     

    Quote:
    And I filled out the overall_mode set of constants (several were missing).

    Nice, thanks for that wink I will merge the CONSTS.h if the changes are in the svn.

     

    Quote:
    Or was that SDF(309,x) or something?

    That was 309 indeed smile Will post the preferences corresponding to [306][x] when i returns (i can already say that [306][3] is "show room description more than once", never called in the code and replaced by a "Show start picture and music" in my code smile )

     

    And TRAP_FALSE_ALARM is adopted.

     

    Chokboyz

  21. Quote:
    ...Wait... SDF(306,x) is already used for several of the preferences. See the pick_preferences() function in your equivalent of dialogutils.c.

    That was my point here confused

    Quote:
    Yes, I adapted the fix but it didn't work, so I still need to investigate that

    Post your code if you need help, that one we will know wink

    Quote:
    Currently I'm going through the code to make use of your consts.h. I added a #define TRAP_FALSE_ALARM 6 to the file, since that's what trap 6 is officially supposed to be.

    Nice to see that, I would have to do the same with my code smile
    In the last (not posted) version of CONSTS.h, i set the trap 6 to TRAP_NO_TRAP_AFTER_ALL if i remember correctly (either we use one or another is not important, we need to use the same) and added the terrain specials. I will, of course, post it as soon as i get back.

    Chokboyz
  22. Quote:
    Well, the squish sound makes perfect sense to me, so I say leave it (at least as the default). If someone doesn't like it, they can change it for their scenario.

    The default is no sound when walking on swamps wink (it plays one big splash then nothing for a while)

    Quote:
    (Milu)When "Custom Scenario" is clicked and then cancelled, the following message appears: "This scenario was created by BoE v2.0 or later and can't be run using this copy..."
    This is a legitimate message if you don't have v2.0 or later. Why it is being called wrongly I don't know.

    Didn't encountered this bug ... Does it happen on Windows build ?

    Quote:
    I also made the game show exactly how much food you have lost when you go over the waterfall (the maximum seems to be 50 food, in which case it says "Many supplies lost.").

    I prefer the original version though smile

    Quote:
    I just made one change to the petrification touch, for consistency of indent and for proper grammar

    I will correct this when i will be back home.

    Quote:
    For some obscure reason the function is called general_spec in the Mac version.

    Odd, even on the (windows) scenario editor the Hide Town Node is in town spec ...

    Quote:
    First, in the loop you altered just before of the if (monsters_loaded == FALSE) statement, why is case 6 commented out? Second, what (if anny) changes did you make to the switch statement inside the if (monsters_loaded == FALSE) conditional (just after "// Now, if necessary, fry the monster.")?

    By memory, the case 6 wasn't commented in windows code (correspond to sometimes appears here C). I did some changes to the second switch statement, but i don't have access to my code right now smile

    Oh and the
    if (which_event > 10) // if major event specified is > to 10 returns because it isn't assigned in the code (the major event array is 100 long but only the 10 first are initialized at 30000)
    return FALSE;
    if ((which_event > 0) && (party.key_times[which_event] < which_day)) // if events to cross checks hasn't happens return
    return FALSE;


    It is an (undocumented ?) feature : events happens on day time_code if event "second field" has happened (0 always happens). The 8 check on Windows code is to be corrected.

    Originally Posted By: Celtic Minstrel
    On an almost-related note, could someone possibly inform me what SDF(306,x) are used for?


    Originally Posted By: Celtic Minstrel
    I don't really see the point of this...
    Originally Posted By: Chokboyz
    How is the game supposed to know what option is activated ? (preferences for example is array party.stuff_done[306])

    wink
    Quote:
    Your fix hasn't worked yet; it's not helped by the fact that your code is quite different in that area. I think I've made the change necessary, but it didn't work when I tested it. Have you tested it?

    The Conceal Ability fix has been tested and worked. The function IsIdent() or IsConcealed() or even ITEM.cpp doesn't exists on mac (i think this is ormus' C++ conversion process). So the fix must be adapted but works.

    Hope it helps,
    Chokboyz
  23. Quote:
    I'm slightly confused – what exactly have you done here?

    The function draw_one_tiny_terrain_spot() wasn't handling correctly custom graphics correctly so we :

    first, remove the safety fix that were printing black box instead of custom ones : Remove the lines 890 and 891 :

    then correct the lines handling custom graphics in the function :
    if( ... > 1000){
    SelectObject(hdc,store_bmp); <= add this line
    from_rect = get_custom_rect(picture_wanted % 1000);
    rect_draw_some_item(spec_scen_g, from_rect, ter_draw_gworld, dest_rect, 0, 0);

    store_bmp = (HBITMAP)SelectObject(hdc,ter_draw_gworld); <= add this line
    }

    Hope it's clearer,
    Chokboyz
×
×
  • Create New...