Jump to content

Recommended Posts

Posted
18 minutes ago, MasterToma said:

Ok, now it works

Fix of the select with one case in master.

 

18 minutes ago, MasterToma said:

1. (4*(talker.param2 % 10))

Modulo precedence fix in master.

 

19 minutes ago, MasterToma said:

2. ((Rand(3)+1)*4)

This only will be problem if multiplication in NASC compiler has the same precedence as addition.

 

18 minutes ago, MasterToma said:

if (a && c || d)

This only will be problem if OR has the same precedence as AND.

Posted (edited)
12 minutes ago, verbrannt said:

This only will be problem if multiplication in NASC compiler has the same precedence as addition.

This only will be problem if OR has the same precedence as AND.

I understand it. But some of cases might like like with modulo.

 

I wouldn't noticed difference in if (a && c || d) if NASC would generated same code.

 

Could you please also add bracers for all nested expressions?

 

According to leaked code, all nested expressions have (). I'm not sure about such thing as precedence in script-engine, I could show you their VM code, where arguments only taken from stack in such and order in which compiler pasted them.

 

And NASC pasted them in opposite order :) (as I wrote in recent post)

Edited by MasterToma
Posted (edited)
12 minutes ago, MasterToma said:

I understand it. But some of cases might like like with modulo.

With modulo was different case. Modulo has same precedence as multiplication and division.

 

12 minutes ago, MasterToma said:

I wouldn't noticed difference in if (a && c || d) if NASC would generated same code.

I've tested it:


        1 && 2 || 3;
        (1 && 2) || 3;

        1 || 2 && 3;
        1 || (2 && 3);
        1 && (2 || 3);

         (1 || 2) && 3;

 

First two lines compiles in absolutely identical stack machine code. Also line 3 == line 4.
 

12 minutes ago, MasterToma said:

According to leaked code, all nested expressions have ()

It's because the decompiler, that was used to produce that leaked code, has no checks of operator precedence. It just adds braces everywhere after each operands pop from stack.

Edited by verbrannt
Posted (edited)

I never used shitty NASC decompilers :D No, Scripts from C0 were leaked. Real one with comments, etc. You should know it.

 

Okay, I will find good example, where OBJ code differs. Or if you don't want to hear about bugs, just say it clearly ;) I'm comparing two obj's with diff, so code differs... And Im trying to find good example, like with modulo

Edited by MasterToma
Posted
6 minutes ago, MasterToma said:

Or if you don't want to hear about bugs, just say it clearly ;)

Idk what you're talking about :) I've fixed every bug from your feedback, even not bugs (like increment/decrement & select with one case).
When you'll find another different obj code of course if will fix that.

Posted (edited)

Okay then... so as I told, nested bracers change resulted ai.obj

 

Try this one (output https://pastebin.com/6Su1S470)

	EventHandler TALK_SELECTED(talker) 
	{
		if ( HaveMemo(talker, @trial_of_scholar)==1 &&    
OwnItemCount(talker, @dieters_diary) >= 1 || OwnItemCount(talker, @scripture_chapter_1) >= 1 || OwnItemCount(talker, @strong_liquor) >= 1) 
		{
			AddChoice(0,"Mention what Raut said");
		}
	}

and with additional bracers

	EventHandler TALK_SELECTED(talker) 
	{
		if ( HaveMemo(talker, @trial_of_scholar)==1 &&    
(OwnItemCount(talker, @dieters_diary) >= 1 || OwnItemCount(talker, @scripture_chapter_1) >= 1 || OwnItemCount(talker, @strong_liquor) >= 1)) 
		{
			AddChoice(0,"Mention what Raut said");
		}
	}

https://pastebin.com/JL3sWgyz (output)

 

Scroll to the end in pastebin, to see the difference

 

The same in complex cases with + and *

 

Take into account, that NASC is actually simple stream translator, so it doesn't have (almost) context like AST. It translates line by line (with special handling of loops and if/else)

Edited by MasterToma
Posted (edited)
17 minutes ago, MasterToma said:

so as I told, nested bracers change resulted ai.obj

 

Yes, of course. I know this.

I've tried compile-decompile-recompile this code

class guard_babenco {
handler:
    EventHandler TALK_SELECTED(talker) {
        if (1 && 2 || 3 || 4) {
            Say("Hello");
        }

        if (1 && (2 || 3 || 4)) {
            Say("Hello");
        }
    }
}

And nothing changed. I've got same obj file as before decompilation.

But if you have any unfixed example of broken nesting of logical operators, provide an obj.

 

Of course if in OBJ we have something like 1 && (2 || 3 || 4) but after decompilation got 1 && 2 || 3 || 4 - it's a bug, and I need example.

But if we have (1 && 2) || 3 || 4 in OBJ and after decompilation got 1 && 2 || 3 || 4 - it's not a bug.

Edited by verbrannt
Posted (edited)
Quote

But if you have any unfixed example of broken nesting of logical operators, provide an obj.

I sent you ai.obj from C1. Being decompiled (bracers are missed) and compiled back, ai.obj with mixed and/or is produced. I pasted in my recent posts.

 

I have about 35 classes with such case. You can check drunkard_treaf for instance

Edited by MasterToma
Posted (edited)
1 hour ago, MasterToma said:

You can check drunkard_treaf for instance

Ok here I see difference. Looks like not logical operators bug, but IF statement bug. Also if c1 ai.obj was compiled with another compiler than you have, this differences can occur. Anyway original OBJ and recompiled OBJ produces same decompiled code.

Do you have leaked (original) source of this class?

 

UPD original code that produces identical to your ai.obj result:
 

(HaveMemo(talker, @trial_of_scholar) == 1 && (OwnItemCount(talker, @dieters_diary) >= 1 && OwnItemCount(talker, @scripture_chapter_1) >= 1 && OwnItemCount(talker, @strong_liquor) >= 1))


So there's useless braces in the original ai.obj.

 

Edited by verbrannt
Posted (edited)

Looks like we lost and talking about different things. I really understand, that if there are only &&, no point in extra bracers... belive me, because I've decompiled most of L2, and it works (including NASC itself). But this info about extra scope () is present in ai.obj. I posted examples, where you can see the difference. I posted the difference in pastebin. NASC generates DIFFERENT code for (a && (b && c)) and for (a && b && c). But decompiler restores them in SAME way - no bracers. I don't know how to be more clear. 

 

I have two concerns about it. First - messed diff. I can't compare original and recompiled objs due to much more trash. Second - there is might be some weird context, which might lead to bug.

 

OK, never-mind, you did great job anyway.

 

I have at least two more bugs apart this:

1. some jump is just missed. Have no idea, but in original class's obj there is just 1 more jump instruction. I can't say nothing concrete, because diff produces too much mismatches due to my previous point. Could you just add those bracers? Or point me the function and I'll fix it by my own maybe :)

 

2. in some classes (e.g. pet_manager_martin)

	push_event	//  i5
	push_const 212
	add

instead of

push_reg_sp
fetch_i

 

Edited by MasterToma
Posted

Original OBJ + Decompiled source + Recompiled OBJ: https://mega.nz/#!SSJ0FQ7L!EPXTDOTcGmy4QGJPIgZ7jMY7-AVQ9pcq_xfEHilwJzQ

Almost no differences. Only missed jump, as you mentioned.

Replaces made on both OBJs:
L\d+ -> L0
S\d+ -> L0
\r\nL0\r\n -> \r\n

Hope you would like the "((((((((((((((((((((((((((((((((((((((((" in decompiled source :D.

Posted (edited)

Well I think it's not so hard to do proper (), if this info present in ai.obj. But I understand your sarcasm.

Why should I replace labels If I ignore them during diff?

 

I have 35 files with differences (labels are ignored, and few more filters are ignored), but you don't want to hear :) And it's not "only jump" Okay I will fix it manually, not a big deal.

 

Tnx for your work, this decompiler at least somehow usefull

Edited by MasterToma
Posted (edited)
47 minutes ago, MasterToma said:

And it's not "only jump"

I've shared compiled OBJs right before your post. There's only 19 differences, and all is missing jump.

Those missing jumps might be a breaks inside if inside select. I have an old issue for it.
Idk, may be we're using different decompilers or something :)

Anyway, smiles mode now enabled by default in branch c1-support.
And you have only 35 files of 2200, I think it's not so bad.

Edited by verbrannt

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



  • Posts

    • ⚡ Fast order delivery is active 24/7! Upgrade your personal Gmail to Gemini Pro with full 2TB storage and premium Google One features today.
    • Update M54: Global HP/MP/CP consumable handling expanded beyond combat-only usage. Offensive mage idle recovery with learned skill Battle Heal. Spellhowler/Storm Screamer prioritizes Hurricane, using Vampiric Claw mostly below 90% HP. Major structural refactor initialized: Added category/class organization such as Archer, Dagger, Tank, Mage, Healer, Support and Specialized class files. Further structural cleanup. Extracted combat memory/state and more class-policy logic from the main controller. Added global stuck/inactivity watchdog for bots blocked by terrain/geodata. Added unreachable dropped ground-item timeout/temporary blacklist. Reworked Necromancer/Soultaker PvP: Dominator level 78+ maintains learned Arcane Power toggle on. Overlord/Dominator level 44+ maintains learned Soul Guard toggle automatically. Stability/scalability update: Bot controller ticks staggered instead of all starting in the same phase: Same 350 ms update rate retained Reduces simultaneous AI workload bursts. Removed the old manual aggressive-monster EVT_AGGRESSION bridge. Phantoms now use native Lucera setActive() behavior so monsters aggro them naturally. Reduced unnecessary NPC scans and native AI event pressure. Added saved-bot equipment overrides using a separate database table:         lucera_autobots_items Existing lucera_autobots remains the main saved-bot identity/state table. Equipment rows are linked to saved bots through bot_id. Added optional convenience view to show bot name together with equipment overrides:         lucera_autobots_items_view Added editable equipment slots in columns: Weapon Shield Helmet Chest Legs Gloves Boots Necklace Left/Right Earrings Left/Right Rings Equipment override values: 0 = use normal class/level profile item -1 = force slot empty >0 = equip that Item ID Custom equipment works only for saved database bots. Default class/level equipment profiles remain unchanged. Supports custom equipment from No Grade to S Grade, regardless of the bot's current level. Added validation for invalid item IDs and incompatible equipment slots. Added handling for: Two-handed weapons vs shields Full-body armor vs separate leggings Added all-grade Soulshots and Spiritshots to bot inventory/replenishment so custom lower-grade weapons still use the correct shots. Mage profiles that already use Blessed Spiritshots keep that behavior with all relevant grades available. First save the bot normally so it exists in table:         lucera_autobots Then open:         lucera_autobots_items Find the row with the same bot_id and edit only the equipment slots you want. Example: weapon_id = 6608 shield_id = -1 helmet_id = 0 chest_id = 0 legs_id = 0 gloves_id = 0 boots_id = 0 This means: weapon_id 6608 → custom weapon shield_id -1 → no shield all 0 values → keep normal default profile equipment After editing the DB, despawn and respawn the saved bot so M54 reloads its equipment overrides. Do not edit bot_id. Use it only to identify which saved bot the equipment row belongs to.   DOWNLOAD
    • It will be multi client so it will detect the client from the files and adapt the packets and asset loading. I am aiming for C4 and H5 after IL
    • this is just to simplify your life, time, and can be done for free by yourself just watch some tutorials, in case you don't wanna waste time check it out!   https://l2getwork.art   https://l2getwork.art/showcase.html  
    • Good job! Any chance for it to be downgradeable or at least compatible with older chronicles?
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..