المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : دعم الكتابة العربية في Half-Life 2 SDK



حسـن
06-02-2005, 10:47 AM
لعبة هالف لايف تو لا تدعم الكتابة بالعربية بشكل مباشر مع ان المحرك نفسه يدعم اظهار الاحرف العربية و لكن اذا جربت مثلا الدردشة في كاونتر سترايك سورس بالعربي ستجد ان الحروف منفصلة و انها تظهر من اليسار لليمين يعني المحرك لا يميز هذه الحروف و يتعامل معها مثل اي رمز اخر لا يحتاج الى معالجة خاصة.

بالنسبة للعبة كونتر سترايك سورس فلا نستطيع عمل شيء لها الا اذا قامت الشركة باضافة دعم للغة العربية .. و هذا امر ف يعلم الغيب لان الشركة قامت باضافة عدة لغات و ربما و الله اعلم تقوم باضافة المزيد و لكن لا ادري ما اللذي سيجدفعهم لدعم الغة العربية فلا اظن الزبائن العرب كثر ..

المهم .. انا قلت اننا لا نستطيع عمل شي لكاونتر سترايك, لكننا نستطيع عمل شي في هاف لايف تو نفسها :D لان هناك SDK للعبة و يحتوي على كمية كبيرة من كود اللعبة بما في ذلك الـ vgui او واجهة "فالف" المرئية, و هذا يتضمن هذا ادوات التحكم vgui controls مثل ادوات تحرير النصوص (اللتي يستخدمها الشات) و غيرها الكثير.

قرأت في احد المواضيع القديمة في منتدى العاب البي سي واحد من الشباب يقول انه سيحاول ان يظبط حركة لدعم العربي باستخدام الـ SDK لكني لا اذكر من ذلك الشخص و لم اتابعه .. المهم انا اعرف الان ان السرفر السعودي يعمل حيلة لاظهار نصوص الشات بالعربي و ذلك بتحليل النص و اظهاره في الركن العلوي من الشاشة .. اظن هذا يحدث عن طريق plug-in للسرفر, و لا ادري ان كان من برمجه هو نفس ذلك الأخ ام لا .. لكني نزلت برنامج صغير له يقوم بعمل شي مشابه و لكن على الـ OpenGL و اظن اسم البرنامج هو Glal32 او شي من هالقبيل ..

المهم انا وقتها فكرت في اني احاول اعمل هذا الشي, و انا من هواة برمجة هاف لايف تو و عندي الاس دي كي فقلت ليش ما اجرب :D
طبعا بعد ما عرفت كمية الكود المتوفرة و اعطائنا حق الوصول لاشياء دقيقة مثل هذي الأمور, قررت اني احاول استكشف عن طرق لتحويل النصوص العربية المكسرة الى نصوصو صحيحة .. اي ترتيبها من اليمين الى اليسار و ربط الحروف ببعضها ..
بصراحة بحثت كثيرا و لكن دون جدوى, هناك اشياء في الوندوز اظن ان الواحد ممكن يستدعيها و هي تقوم له بهذا العمل .. و لكن لم اعرف كيف يتم ذلك ..
المهم .. في النهاية قررت اني اكتب هذي الأشياء بنفسي :p ليش لا .. هي شينرادلهة؟ تاخذ مجموعة حروف و تبرتبها من اليمين لليسار اذا كانت عربية, و بعدين تاخذ كل حرف و تشوف شنو اللي كبلة و شنو اللي بعده و على اساها تحدد ما هو الشكل اللذي يجب ان يكون عليه الحرف!

طبعا كان على اقيام ببعض البحث او "البحوث" لاحصل على الأقل على جدول يضم اكواد الحروف العربية و احوال فهم كيف يمكن اخذ نص متداخل يحتوي حروفا عربية و انجليزية و تحليله لتكوين نص جديد تكون فيه الحروف العربية مرتبة بالشكل الصحيح .. الخ.
المشكلة اني لا احب التعامل مع النصوص c-style strings كثيرا و لكن على كل حال في الجامعة اجبرونا ان نكتب عدة برامج تتعامل مع النصوص مباشرة دون استخدام مكتبات جاهزة لذا تعودت على الأمر بعض الشيء .. فهذه نقطة ..

الجزء المقرف في العملية هي انني لازم اخذ رقم الـيونيكود لكل حرف و ادخاله في ما يشبه جدول, في الحقيقة هو ليس جدول بمعنى الكلمة, هي linked list تربط objects من نوع CHarf و هو كلاس كتبته لاحتواء الحروف العربية و خصائصها .. مثلا كل حرف عنده اربع اشكال مختلفة (ابتدائي, متوسط .. الخ) و كذلك بعض الحروف لا ترتبط بالحروف اللتي تليها. المهم .. المشكلة كانت استخراج الاكواد المختلفة لكل حرف و ادخالها في الكود ..
طبعا لم ادخل كل الحروف .. ادخلت فقط الحروف الأساسية بالاضافة الى التاء المربوطة .. و لكن مثلا الحركات و الحروف اللتي فوقها همزة لم أدخلها .. (على الأقل حتى الآن)

الحمد لله حصلت على نتيجة لا بأس بها, حيث استطيع الان كتابة النصوص و تظهر بشكل صحيح اثناء كتابتها و عند الانتهاء من كتابتها كذلك .. المشكلة الوحيدة ان بعض الحروف تظهر بشكل سيء و اظن ان المسألة تكمن في صغر حجم الخط او شي من هذا القبيل .. لأنني حين اكبر الخط قليلا تتحسن الأمور و لكن الخط يخرج عن النطاق المحدد له :p
كذلك استطيع تحريك مؤشر الكتابة و ادخال حرف في أي مكان و لكن قد لا يظهر الحرف الجديد دائما في مكانه الصحيح (المكان اللذي فيه المؤشر) فهذه نقطة لا تزال تحتاج لبعض العمل ..
النقطة الاخرى هي ان بعض الحروف هي عبارة عن دمج بين حرفين .. مثل الالف و اللام "لا" و انا لم اضف هذه الخاصية .. و كذلك الحركات يجب ان تظهر فوق الحروف .. هذه لا اعرف ان كان من الممكن اضافتها حيث لا اظن ان هناك كود لكل حرف فوقه حركة بل دمج الحرف مع الحركة يجب ان تكون من مهام الـ renderer اللذي سيرسم النص.

المشكلة الاخرى ااني اكتشفت للتو انني نسيت اضافة الألف المقصورة :D

هناك شي آخر مزعج شوية, عندما تضغط حرف الذال يطلعلك الكونسول! اظن ممكن نتلص منها بسهولة .. بس عموما!

المهم اظن ان هذا العمل سيذهب دون ان يستفيد منه احد سواى, و الاستفادة هنا اقصد بها اكتساب بعض الخبرة.
لذلك اريد عرضه هنا لعل تكون فيه فائدة إن شاء الله.

الفكرة هنا هي اخذ النص غير المرتب ثم ترتيبه .. كالتالي:
لو كتبت كلمة "عربي" مثلا, فسوف تظهر بهذا الشكل:
ي ب ر ع
بدون مسافات ..
ما اريد عمله هو عكس ترتيب الحروف و تغيير هيئتها, لتصبح هكذا:
عـ ـر ـبـ ـي
ايضا بدون مسافات, و هذه الحروف موجودة بهذا الشكل (تقريبا) في جودل اليونيكود.
لا تقرأو الحروف من اليمين لليسار, بل من اليسار لليمين! يعني في السابق كان اول حرف هو "ع", أنا اريد تحوله الى "ـي" .. و هكذا.
فبهذه الطريقة, نستطيع اظهار الحروف بشكل مرتب!
و لكن ترتيب الحروف المرئي هكذا لا علاقة له بترتيبها في الذاكرة, و هذا يترتب عليه عدة مشاكل, احداها ان مؤشر المكتابة عندة يكون بين اول و ثاني حرف, فمكانه الفعلي هو بين العين و الراء:
ي ب ر | ع
و لكننا بعدما نحول النص الى العربي, سيظهر المؤشر بين الياء و الباء
عـ ـر ـبـ | ـي

لكننا لو كتبنا هنا حرف فان الحرف سيدخل في الذاكرة بين العين و الراء, فبالتالي سيدخل في النص بين العين و الراء, لذلك نحتاج لتحليل مكان المؤشر و معرفة انه من الناحية البصرية يجب ان يظهر بين الحرف الثالث و الرابع
عـ | ـر ـبـ ـي

فهناك اذا شيئين: هناك تمثيل للنص في الذكارة و هذا التمثيل غير مرتب اي انه يعامل الحروف العربية مثل اي رمز اجنبي ولا يضعها في نطاقها الصحيح.
و هناك تمثيل بصري للنص, يظهر الحروف للقاريء في مكانها الصحيح لكنه ليس سوى تمثيل بصري للنص, و النص الحقيقي اللذي يقوم اللاعب بإدخاله هو في الـ string الغير مرتب.
نفس الشي للمؤشر, هناك مؤشران, مؤشر يعني بمكان المؤشر الحقيقي وسط الحروف كما هي ممثلة في الذاكرة, و مؤشر بصري يعني بمحاكاة مكان المؤشر وسط الحروف المرتبة ليسهل على المستخدم ادخال حروف وسط الحروف العربية لتظهر في مكانها الصحيح.

المهم, قمت باضافة ملفين, او بالأحرى صنفين two classes ووضعت كل كلاس في ملف.
الاول يعنى بتوصيف الحروف و الاخر يعنى بمعالجة النصوص و تحويلها الى العربية, كما يقوم ايضا يمعالجة مكان المؤشر ..
و قمت بعمل function ياخذ string و int يمثل مكان المؤشر و يحولها الى العربية.

void ParseRTL( wchar_t *str, int &cursor )
فهذا كل ما احتاج اليه من "الخارج" لاستخدام الكود اللذي يقوم بعمليات التحويل ..
لاتسخدامه, قمت بعمل شيئين, اولا أضفت member variable للـ CTextEnty كلاس و هو المعنى بإدخال النصوص في الـ VGUI, اضفت متغير int _cursorRtlPos لاحتواء مكان المؤشر (البصري) او اللذي سيرسم على الشاشة.

في

void TextEntry::PaintBackground()
اضفت هذه الأسطر اول شي:

//hasan: my RTL thing
wchar_t chat_text[300];
//copy cursor
_cursorRtlPos = _cursorPos;
if(m_TextStream.Count())
{
//copy string ..
for ( int i = 0; i < m_TextStream.Count(); i++)
{
chat_text[i] = m_TextStream[i];
chat_text[i + 1] = 0;
}
ParseRTL( chat_text, _cursorRtlPos );
_font = 128;
}
و هي ببساطة تنظر في ما إذا كان هناك نص يتم ادخاله, ففي تلك الحالة سنقوم بعمل c-style string او مصفوفة من نوع wchar_t ننسخ فيها النص المكتوب في الشات ثم نقوم بتعديله. و كذلك نقوم بتحليل مكان المؤشر "البصري".
في اسفل الـ method هناك كود تقوم بلوب على الحروف حرفا حرف و ترسمه.
قمت بتغيير بسيط في هذا الكود ليأخذ الحروف من النص المعدل بدل النص الأصلي.

else
{
// draw the text
for ( int i = startIndex; i < m_TextStream.Count(); i++)
{
wchar_t ch = m_TextStream[i];
حولتها إلى:

else
{
// draw the text
for ( int i = startIndex; i < m_TextStream.Count(); i++)
{
//wchar_t ch = m_TextStream[i];
wchar_t ch = chat_text[i];
و أخيرا في

bool TextEntry::DrawCursor(int x, int y)
قمت بتغيير بسيط لكي يقوم المحرك باستخدام _cursorRtlPos بدل _cursorPos

bool TextEntry::DrawCursor(int x, int y)
{
if (!_cursorBlink)
{
//hasan
//use RTL cursor position ..
int cx, cy;
//CursorToPixelSpace(_cursorPos, cx, cy);
CursorToPixelSpace(_cursorRtlPos, cx, cy);

هذا فيما يتعلق بالـ vgui_controls
اما الكود اللتي قمت بكتابتها لمعالجة الحروف و النصوص فأرفقها إن شاء الله و حقوق الاستخدام للجميع تحت شروط الـ GPL (اللتي لا اعرفها كلها اصلا) لكن باختصار اذا قمت بتعديل فلا يحق لك الاحتفاظ به لنفسك (يعني لازم تنشره!!) و طبعا يحق لك استخدامها و التعديل عليها كما تشاء بشرط عدم اساءة الاستخدام مثل ان تدعي انك انت من كتب الكود او ان تستخدمها فيما يغضب الله او يضر الاسلام ولا ينفعه.

اسف لضعف الشرح .. شرحت فقط ما قمت بعمله في الـ SDK نفسه بدلا من ان اضع ملفا كبيرا من اجل عدة اسطر فقط قمت بتغييرها ..
اما الكود الحقيقي فقد قمت بإرفاقه فقط دون شرح حقيقة.

طبعا اعرف ان الكود قد لا تكون له فائدة عملية (على الأقل حاليا) لان هناك ربما طرق اسهل باستخدام وندوز لكني كما قلت لا اعرف بالظبط كيف يمكن استدعاء وندوز للقيام بالعملية لأجلنا, كما ان برمجة مثل هذه الأمور تفيد الانسان لتعلم و اكتساب الخبرة.
و من يدري .. مش يمكن يأتي ناس ياخذون الكود هذي و يطوروها و يستخدموها بشكل جدي؟ :P (من محسب نفسه الأخ!)

المهم .. enjoy :D

إن شاء الله قريبا ارفق فيديو لعملية الكتابة باستخدام هذا الكود .. إن شاء الله

حسـن
08-02-2005, 02:54 PM
عموما هذا فيديو صغير جدا .. يظهر فيه كتابة بالعربي ..
اللي يريد يعرف شكل الكتابة قبل التعديلات يجرب يكتب عربي بـ counter-strike:source

wellknownQ8
11-02-2005, 08:39 AM
--- السلام عليكم ---

ما شاء الله.. مجهود رائع..
و نتمنى لك مزيدا من التقدم :)

Son Of UAE
11-02-2005, 03:25 PM
السلام عليكم ورحمة الله وبركاته :
احيك على هذا المجهود .. و اسف على التاخير بالرد . ولكني لم افهم نقطة واحده . و هي هل تريد ان تقول ان مصدر اللعبة موجود معك ؟ علماً بان الSDK يعلمك كيفيه استخدام الاوامر لبرنامج معين او مكتبة ؟ فكيف دخلت ببرمجة اللعبة نفسها ؟ و هل هذا اقرب الي التعريب من البرمجة ؟

و السؤال الاخير .. ما هو طموحك عندما قمت بتعريب اللعبة و عدلت بالبرنامج .. ؟ هل تريد تغير كل المجسمات لتبدو عربية 100 % ؟ وشكرا

اعجبني الموضوع .. استمر :)

حسـن
11-02-2005, 05:25 PM
الـ SDK هنا هو عبارة عن مجموعة كثير من الادوات تساعد في عمل تحويرات للعبة Mods من دون ما تخربطك اللعبة الاصلية (يعني مثل اضافات)
.. يعني مثل ما counter strike هي mod على half-life تستطيع تنزيلها من دون ما تخربط هاف لايف .. نفس الشي, اي واحد يستخدم الـ SDK يقدر يعمل لعبة باستخدام محرك اللعبة.

من ذمن الـ SDK هناك لـ source code لجزء كبير من اللعبة (لكن ليس كلها) محرك الرسم مثلا غير موجود و كذلك محرك الفيزياء غير موجود, اللي موجود (بشكل عام) هو الكود المستخدم في بناء server.dll و client.dll و هذولي لو عندك ستيم تلاقيهم في:
\Steam\SteamApps\<user name>\half-life 2\hl2\bin
هذولة الاصليين تبع هاف لايف تو, عاد الي موجود هو الكود المستخدم في بنائهم, و هو كامل يعني تستطيع تعمله compile من دون ان تغير اي شي و سوف تحصل على الـ dlls هذولة :D

عموما انا اسف, انا الان مستعجل لازم اطلع, إن شاء الله لمن أرجع باكمل :)

حسـن
12-02-2005, 12:39 AM
الكود الموجود هو معظمه ببساطة الـ game logic يعني اللعبة كلها هناك, و اي شي تريد تغيره او تضيفه تحطه هناك.

المود هو باختصار لعبة تستخدم المحرك, و يمكن لو شوية نرجع لهف لايف واحد .. لانه الشرح شوية اسهل.
في half-life طبعا هناك مجلد للعبة به hl.exe و الخ, و كان هناك مجلد داخل هذ المجلد اسمه valve, هذا المجلد فيه محتويات اللعبة (يعني الخرايط و النماذج models و الاصوات .. الخ). اللي يريد يسوي مود للعبة كل ما عليه ان يعمل مجلد جديد مثل valve لكن يسميه باسم اللعبة, و علشان يشغل لعبته, يضيف بارامتر -game متبوع باسم المجلد

.....\hl.exe -game <mod_name>
و هكذا تعمل تغييرات على اللعبة من دون ما تخربط اللعبة الأصلية, لأن اللعبة الاصلية هي نفسها مثل المود فهي مووعة في مجلد اسمه valve و انت لعبتك محطوطة بمجلد اسمه اي اسم انت تختاره. :)

هاف لايف تو شوية مختلفة, لانه ستيم داخل بالنص ..
هالمرة مكان مجلد المود هو ليس نفس مجلد اللعبة, بل مكانه في

....\steam\SteamApps\SourceMods\<mod_name>

و هنا steam هو مجلد steam اللي فيه steam.exe

طيب نرجع للكود, هناك مشروعين Microsoft Visual c++ project واحد منهم لما تسويله كومبايل يطلعلك server.dll و الاخر يطلعلك client.dll
واضح من الاسم ان واحد منهم سرفر و الاخر كلاينت .. و هذا يبدو معقولا في الملتي بلير, و لكن في الحقيقة السنجلر بلير نفس الشي, الفرق الوحيد انك انت السرفر و الكلاينت في نفس الوقت. مثل لما تتصفح موقع موجود في جهازك انت .. انت الموقع و انت الزائر :)
السرفر مسؤليته هي ادارة اللعبة .. يعني اي شي يتحرك اي واحد يموت الخ .. كلها مسؤل عنها السرفر. الكلاينت مسؤل عن الـ hud و الـ input و خلافه من الامور اللتي تحث فقط عند الكلاينت. و كذلك الكلاينت فيه كود الحركة من اجل ان يخمن مكان اللاعبين و الاشياء الأخرى, لكنه مجرد تخمين و في النهاية لازم ياخذ معلوماته من السرفر.

المهم قصة طويلة ...

باختصار الـ SDK ليس مجرد اسماء الـ functions و لكنه الكود الفعلي للعبة! يعني فقط على سبيل المثال .. الذكاء الصناعي كله موجود! :shock22: و الحركة و الـ collision detection مثلا كيف صاروخ الار بي جي يلحق النقطة الحمرة .. كلة موجود و أكثر!! و تستطيع ان تغير فيه كما تشاء.

يعني باختصار تستطيع تعمل لعبة على محرك الـ source engine ببلاش :biggthump

حسـن
12-02-2005, 04:43 AM
آسف لكثرة الردود المتلاحقة, و لكن لا يمكنني تعديل الموضوع السابق (اظن هناك فترة زمنية محددة, بعدها لا استطيع التعديل ..)

نسيت أهم شي بالموضوع:

و السؤال الاخير .. ما هو طموحك عندما قمت بتعريب اللعبة و عدلت بالبرنامج .. ؟ هل تريد تغير كل المجسمات لتبدو عربية 100 % ؟
لا لا .. هذا ممكن يكون هدف ثانوي, هدفي الحقيقي هو عمل مود .. يعني لعبة :) لانه هذه طريقة ممتازة و فعالة للدخول في عالم صناعة الألعاب, من كافة النواحي تقريبا, خصوصا اذا كان مشروع المود مشروع لعبة حقيقية و ليس مجرد تغييرات بسيطة.
كاونتر سترايك اول ما بدت كانت مود بسيط بعدين تطور و انشهر و قامت الشركة بتبنيه ..
هاف لايف ليست اللعبة الوحيدة اللتي فيها هذه الخاصية, عدة العاب اخرى تسمح بذلك و هناك موقع عن مودات كل الالعاب
http://moddb.com/
لكن في نظري هاف لايف هي الافضل من هذه الناحية .. عموما يكفي ان محركها قوي و عندها قاعدة جماهير عريضة و مساحة الحرية المتاحة لنا كبيرة :)

على فكرة انا حاولت مرة (من زمان) اجمع فريق لعمل مود على هالف لايف (hl1) لكن فشل المشروع لاني ما عندي مهارات قيادية, و الموضوع ما زال مثبت في منتدى التعريب مع انه قديم و ميت .. :p

Kunio-Kun
09-03-2005, 06:17 AM
مشاءالله تبارك الرحمن .. والله هذا افضل موضوع شفتة لحد الأن عن طريقة تعديل الخطوط الذي فعلاً اسعدني جداً
والله يعطيك العافية ... ;)

لكن يا اخ حسن هل راح تستمر في تطوير هذي الكودات ام نشرتها للتعم الفائدة والتوقف عن تطويرها
وانا لاحظة في المقطع عند الكتابة تكون سليمة نوعاً ما لكن عند ادخلها تكون غير واضحة
وفهمت من كلامك هو حجم الخط .. هذي المشكلة في العاب التي لا تدعم العربية ونريد ان تدعمها :31: عذاب والله T_T

وايضاً عندي استخدام محرك جوجل من فترة طويلة وجدة برنامج يقوم بترقيع اي برنامج هذا إلي فهمت
لكن يجب ان يكون لدى من يود ان يستعملة خبرة قوية جداً ( وضعي للبرنامج يمكن يفيد لكن ان لم يكن كذلك ارجو انك تنسى البرنامج ^^ )
http://kobik.videodot.net/codefusion.asp
لنا شاهدة احد يستخدم هذا البرنامج ينزال رقعة داخل للعبة نسيتها وقدر يظيف اي شي يبيه ..

وشكراً:)

حسـن
09-03-2005, 06:41 AM
شكرا أخي .. :)
انا حاليا اقوم بتطويرها و و إعادة تصميمها بحيث تكون أسهل للتعديل و التطوير و ما شابه.
في النسخة القديمة (الموجودة في المنتدى) هناك method يقوم تقريبا بأغلب العمليات و هو CBilStringContainer::SortRtl و هو معقد و طويل و procedural جدا جدا. أما الآن فأحاول قدر الإمكان اعادة كتابة الكود بحيث تصبح أكثر مرونة و object-oriented بقدر المستطاع.

بالنسبة لـ code fusion بصراحة لم أفهم ما المقصود منه

Kunio-Kun
09-03-2005, 08:07 AM
ممتاز :biggthump بتوفيق ان شاءالله وحنا ينتظارك وخذ راحتك .. لنا بصراحة موضوعك جاا في الصميم ..:)


بمسبة للبرنامج code fusion سوف اشرح بختصار شديد .. لنا ليس لدي الخبرة الكافية للستخدامة

نفترض تريد تعديل شغلة مثال تريد تكبير حجم الخط في للعبة طبعاً انت ليست صاحب اللعب
طبعاً البعض منهم يستخدم الـHex في تحرير اللعبة ومن ثمى يجري التعديل .. هذا البرنامج يسهل عليك بعمل رقعة للجميع ودون الحاجة للجميع الدخول وتحرير اللعبة بالـHex للتكبير الخط .. المقصود فيه هو رقعة
طبعاً اشياء كثيرة لة ... وهذا ما لدي عن البرنامج..( والله اعلم)

حسـن
22-03-2005, 08:23 AM
بسم الله الرحمن الرحيم

الحمد لله رب العالمين, وصلت الى نسخة تعمل من البنية الجديدة للكود, من ناحية التنفيذ, هذا الكود تقريبا ينفذ نفس العملية اللتي كان ينفذها الكود السابق, لكن هذه المرة حاولت تصميم الكود بشكل يسمح بتغييرها بشكل اسهل, يعني كما يقولون حاولت اخليها reusable و extendable.

السبب في ذلك انه طريقتي في ترتيب الحروف ربما ليست أفضل طريقة, و هي قطعا ليست الطريقة الرسمية (http://www.unicode.org/reports/tr9/) و كذلك كنت اقوم بعدة افتراضات غير صالحة دائما, مثل ان النص ككل هو left-aligned, كمثال فقط. لذلك أردت ان افتح الباب للتغيير و التصحيح, و الآن استطيع بكل سهولة التغيير ما بين اعتبار النص left-aligned او right-aligned, و طبعا ربما ايضا افكر في طريقة أفضل لترتيب الحروف, لكني لا أدري إن كان لدي "الواهس" لذلك.

هذه المرة يوجد العديد من الملفات, و ليس فقط ملفين, هناك العديد من الـ classes, بعضها ربما تحمل أسماءا غريبة... و قد قمت بكتابة template من أجل الـ linked list (اعرف ان هناك list في الـ STL لكني اظنه معقد أكثر من اللازم)

الكود لم تكتمل بعد, لا يزال هناك بعض الاصلاحات و الرتوشات, مثلا هناك بعض المشاكل و بعض الأشياء اللتي وضعتها على السريع لكي أجرب الكود فقط, لكن بعد أن وجدتها تعمل كما هو مطلوب, قررت وضعها هنا حتى قبل ان اكمل ترقيع كل شيء :D

لا توجد بعد طريقة لاستخدام الكود من برنامج خارجي لأني كما قلت لم أكمل ترقيعها بعد, لكن يمكن النظر إلى النتيجة في نهاية BidiString::Process بالنظر إلى

wstr.c_str();
في visual studio أثناء الـ debugging, حيث لا احتاج حتى الى متغير مؤقت, فـ visual c++ يقوم بإظهار الناتج مباشرة.
و هذا الـ wstr هو مجرد شغلة مؤقتة وضعتها لاختبار الكود,و المفروض تنشال أثناء ما تبقى من العمل إن شاء الله.

الكود مرفق: (عبارة عن project في Visual C++ .Net 2003, و من يريد تحويله الى Visual C++ 6 يستطيع استخدام هذا البرنامج http://www.arstdesign.com/articles/prjconverter.html