ไปที่เนื้อหา


รูปภาพ

TSO Data


  • กรุณาลงชื่อเข้าใช้เพื่อตอบกระทู้
มี 10 โพสต์ตอบกลับกระทู้นี้

#1 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 22 April 2007 - 09:52:34 PM

เห็นว่าคนแถวนี้ เอ่ยถึงเกมนี้ อาจมีคนสนใจ
แต่คงไม่ร้อนแรงเหมือนเรื่องบอท biggrin.gif
เกมฟรี(มั้ง) กับ บอท มันช่างเข้ากันไม่ได้จริงๆ
ทุกกครั้งที่บอทเปิดตัว อยากเห็นหน้าเจ้าของเกมจัง
แต่เดี๋ยวนี้คนเขียนบอท ก็หัวใสซะงั้น ทำเงินจากบอท
แล้วก็มีคนเล่นหัวใส แครกบอทอีก แหมหนุกหนานจริงๆ โลกนี้

เอ้ามาพูดถึงเกมนี้ดีกว่าแฮะ
เนื่องจากมันเป็น 2D ก็เลยเป็นอีกเกมเป้าหมาย ภาพสวยๆ เยอะดี
โดยส่วนตัวไม่ค่อยชอบพวก 3D เท่าไหร่ เพราะภาพสวยๆ ไม่ค่อยมี ส่วนใหญ่จะเป็นแค่ texture
มักจะแกะตอนที่เล่นเกมแล้วเวลขึ้นยาก นานนนนกว่าจะได้ใส่ชุดเทพ
แก้ง่ายๆ ก็ไปเปลี่ยน texture มันซะ แค่นี้ก็ได้ใส่ชุดเทพ ใครไม่เห็นเราเห็น ก็พอใจได้เหมือนกัน 555

พอดีวันนี้เพิ่งลองนั่งแกะ
แหมลายตาไปหมด มีแต่ *.nri
(เกมนี้ใช้ OpenIL แต่ไม่เห็นกล่าวถึง license เลยแฮะ จ่ายตังซื้อหรือเปล่าก็ไม่รู้)
นั่งดูรายชื่อไฟล์สักพัก แล้วเริ่มแกะ ก็ได้ข้อมูลประมาณนี้

Trickster Pic Info (.nri)

struct FileHeader
{
    DWORD dwSignature;//0x4952 4F4E=IRON or NORI in mem
    DWORD dwUnknown1;
    BYTE biUnknown2[20];
    DWORD dwNum;
    DWORD dwUnknown3;
    DWORD dwSize;//file size
};

struct EntryHeader
{
    DWORD dwSignature;//0x4957 4147 =IWAG or GAWI in mem
    DWORD dwUnknown1;
    DWORD dwNumBits;
    DWORD dwVersion;
    DWORD dwMinorVersion;
    BYTE biUnknow[16];
    DWORD dwNumEntry;
    DWORD dwSize;
};

struct EntryInfo
{
    EntryHeader;
    PDWORD pdwEntryOffset;
};

struct PicHeader
{
    DWORD dwUnknow;//num plane?
    DWORD dwSize;
    DWORD dwWidth;
    DWORD dwHeight;
    BYTE biUnknow[12];
};

struct PicInfo
{
    PicHeader;
    PBYTE pbiPicBit;
};


อย่างที่บอก เพิ่งแกะ ยังไม่ได้เขียนโปรแกรมทดสอบอย่างเป็นชิ้นเป็นอัน
(โพสเสร็จ จะเริ่มเขียนละ)
จากที่ลองดู ข้อมูลแค่นี้ก็โอเคละ พวก unknown ช่างมัน 555
แต่ดูเหมือนภาพ 8 bits จะมีรูปแบบแตกต่างออกไปนิดๆ แล้วค่อยว่ากันอีกที
เหตุที่เอามาโพส ก็เผื่อมีคนสนใจเขียนโปรแกรมพวก utility เช่น แต่งตัวละคร หรือ viewer หรือเอาภาพไปใช้
ข้อมูลแค่นี้ผมคิดว่าคงเพียงพอ สำหรับคนที่ เป็น และ สนใจ
ส่วนใครที่สนใจ แต่ยังไม่ค่อย เป็น ก็ถามได้ครับ ส่วนใครที่เจออะไรเพิ่มเติม ก็เพิ่มมาครับ
(เขามี ฟอรัม ก็เพื่อสิ่งนี้ไม่ใช่รึ "แลกเปลี่ยน แบ่งปัน")

ส่วนใครที่เห็นแล้ว ก็เกิดอาการ อารายของมานว้า
ก็ปล่อยให้กระทู้ตกไป อีกหน่อยบอร์ดก็ล่ม tongue.gif ข้อมูลเหล่านี้ก็หายไปกับสายลม
ช่วงนี้ก็ทนปล่อยให้ขวางหูขวางตาไปสักพักละกัน biggrin.gif biggrin.gif biggrin.gif

จะว่าไป maple กะ eco ก็น่าสนแฮะ ไว้ค่อยว่ากัน ไปดีกว่า

เพิ่ม
-dwVersion
-dwMinorVersion
(ยังไม่ชัวร์เหมือนกัน ว่าจะเรียกอะไรดี)

แก้ไขโดย AssertionFailed 24 April 2007 - 05:17:32 PM


#2 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102427 โพสต์
  • Gender:Male

โพสต์เมื่อ 23 April 2007 - 12:54:24 AM

กะลังว่าจะเขียนอยุ่พอดี เพิ่งกลับมาจากสงขลา ^^

ขอบคุณสำหรับข้อมูลงับ

ts.gif

manutd18wm.png


#3 SezunA

SezunA

    เฝิงจี้

  • Special Member
  • 100 โพสต์

โพสต์เมื่อ 23 April 2007 - 05:52:36 PM

ไม่รู้เรื่องเลยฮะ*0* แต่ลองเข้ามาอ่านดูเผื่อได้ความรู้เห็นพี่ AssertionFailed เป็นคนตั้งกระทู้เลยมาลองอ่านดู โค้ดข้างบนเกี่ยวกับการทำงานของรูปภาพหลอคับ(เดาๆ)

#4 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 24 April 2007 - 04:03:43 AM

(SezunA @ Apr 23 2007, 05:52 PM) ดูโพสต์

...โค้ดข้างบนเกี่ยวกับการทำงานของรูปภาพหลอคับ(เดาๆ)


มันเป็นโครงสร้าง ในไฟล์ *.nri ของเกมอ่ะครับ
ซึ่งเป็นที่เก็บข้อมูลของเกม พวกรูปภาพต่างๆ หน่ะครับ

หลังจากเขียนโปรทดสอบ
ก่อนจะขัดเกลา ก็ทดสอบว่ามันทำงานโอเคหรือเปล่า
เลยสุ่มเปิดดูภาพสักภาพ (เห็นชื่อว่า npc ในใจก็หวังจะเจอ สาวน้อยน่ารักๆ สักคน)
เปิดออกมา หัวใจแทบวาย


#5 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102427 โพสต์
  • Gender:Male

โพสต์เมื่อ 24 April 2007 - 09:03:53 AM

55555555555+ สาวน้อยโคดๆ -0-

ts.gif

manutd18wm.png


#6 TSRobo

TSRobo

    TSRobo Developer

  • Exclusive Programmer
  • 10063 โพสต์

โพสต์เมื่อ 26 April 2007 - 07:58:24 PM

แจ่มๆ หุหุ

_______________________________________________________________________
ทำไม่ได้แน่ใจว่าลองทำแล้วหรือยัง??

#7 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 06 May 2007 - 03:43:24 PM

นึกว่าจะไม่มีใครสนใจ
พอดีมีคน pm มาถาม
ตามสัญญา ถามมาก็ตอบไป

พอดีผมเห็น ท่าน โพส แกะ file *.nri ของ Trickster หน่ะครับ ผมเลยอยากสอบถามว่า
ท่านรู้ได้ยังไงเหรอครับ ว่า code มันเขียนยังไง
แล้วรู้ได้ยังไงเหรอครับว่ามัน มาจาก OpenIL อ่ะครับ


คำตอบที่สั้น แต่จริง ก็คือ เดา ครับ
เดา แล้ว ลอง ถ้า ใช่ ก็คือ เดาถูก

เรื่อง OpenIL ก็ดูจาก *.dll ครับ ดูชื่อก็รู้
ถ้าหากคิดว่าชื่อมันอาจเหมือนกัน ก็ใช้ hex editor เปิดดู ดูท้ายๆ ไฟล์ก็จะเห็นชื่อฟังก์ชันที่ไลบรารี มัน export
หรือจะใช้ Dependency Walker เปิดก็ได้ ง่ายดี
เห็นขนาดนี้แล้ว คนเคยใช้ ก็อ๋อหล่ะครับ
ถ้าไม่เคยใช้ ก็ google เดี๋ยวก้สาวถึงต้นตอหละ
ส่วนเขาจะใช้จริงหรือเปล่า ก็คิดง่ายๆ มันมากับเกม ถ้าไม่ใช้ เอามาทำไม
แต่ไงก็ช่าง ใช้ไม่ใช้ก็เก็บไว้เป็นข้อมูลสำหรับการแกะ ถ้ามันไม่สร้างปัญหา ก็ไม่ต้องไปสนใจ

ลำดับขั้นของการแกะ ผมเคยโพสไว้ทีกระทู้ปักหมุด
อย่างเกมนี้ก็ใช้หลักการเดียวกัน

รวบรวมข้อมูลต่างๆ ที่อาจเกี่ยวข้องกับการแกะ เช่น ไลบรารี ที่ใช้

เนื่องจากมันมีแต่ *.nri
ก็ดูชื่อไฟล์ ก็น่าจะได้คำตอบว่าไฟล์ไหน เก็บภาพ

เดาเบื้องต้น มันแค่เปลี่ยนนามสกุลหรือเปล่า
ปรกติไฟล์ฟอร์แมต ชื่อดังทั้งหลาย มักจะมีเครื่องหมายบอก ที่เขาเรียก signature อยู่ที่ไบต์แรกของไฟล์
อย่าง *.exe กะ *.dll ก็จะเป็น MZ
*.bmp ก็เป็น BM
ใช้ hex editor เปิดดู คำตอบคือไม่ใช่ ก็เป็นอันว่า เดา ผิด

เดาต่อไป ไฟล์ที่เราจะแกะ มันมี ภาพเดียว หรือ หลายภาพ
โดยทั่วไป ภาพเล็กๆ ก็จะเก็บรวมกัน 1 ไฟล์
ส่วนภาพใหญ่ ก็มักอยู่แยก 1 ไฟล์ หรืออาจจะรวมกัน 2-3 ภาพ ต่อ 1 ไฟล์
ที่ทำอย่างนี้ก็เพื่อ ไม่ให้จำนวนไฟล์มากเกิน ไม่ให้ขนาดใหญ่เกิน
ถ้าเป็นไปได้ ควรเลือกแกะ 1 ไฟล์ 1 ภาพ ก่อน เพราะมันแกะง่ายกว่า
แต่ปัญหาก็มีนะ 1ไฟล์1ภาพ มันมักจะเป็น *.jpg ซึ่งแกะยากกว่า *.bmp
ตัวให้คำตอบก็คือ ชื่อไฟล์
ตัวละครเอย ไอเทมเอย เขามักรวมกัน
loading screen หรือ แผนที่ มักมาคนเดียวโดดๆ
แล้วผมก็ไปเจอ ไฟล์เป้าหมายอยู่ที่
..\Trickster\data\UI_nori\

เดาต่อไป ไฟล์ที่เราจะแกะ มันบีบขนาดหรือเปล่า
ใช้ hex editor เปิดดู ถ้าเจอข้อความที่คนอ่านออก หรือมีเลขศูนย์ เยอะๆ ก็พอเดาได้ว่าไม่บีบ
แต่บางทีก็มีนะ ที่บีบเป็นบางส่วน
การที่เราดูชื่อไลบรารีในเบื้องต้น ก็ช่วยจุดนี้ได้เหมือนกัน
คือเผื่อมันบีบ เขาอาจไม่เชียนโค้ดเอง แต่ใช้บริการไลบรารี ที่มีคนทำอยู่แล้ว
ถ้าเป็นอย่างนั้น ก็ใช้ google หาข้อมูลชอง ไลบรารี เพื่อศึกษาอัลกอริทีม
แต่ถ้าเป็นแบบเขียนเองหรือรวมโค้ดไว้ใน *.exe การแกะของเราด้วยวิธีนี้อาจจะไร้ผล คือ แกะไม่ได้ครับ
ข่าวดีก็คือว่า เกมที่เปลี่ยนแมปบ่อยๆ เขามักไม่บีบครับ เพราะจะเสียเวลาในการโหลด
โชตดี เจอข้อความทีอ่านออก ศูนย์ก็เยอะ

แค่นี้ก่อน เสียเวลามาเยอะละ ไป coding ต่อก่อน
(กินไป ดูเวปไป พีเอมมา แทบสะดุ้ง)

#8 wengweng

wengweng

    ซาลาเปาเนื้อ

  • Members
  • 8 โพสต์

โพสต์เมื่อ 06 May 2007 - 04:43:32 PM

ขอบคุณมากๆครับ ผมติดตาม ทุกกระทู้ที่มีความรู้หมดเลยครับ แต่ขอ Print ไปค่อยๆอ่านละกันครับ ^^ เพราะเยอะมากจริงๆ

#9 MoshiKung

MoshiKung

    จอมยุทธใหม่

  • Members
  • 1 โพสต์

โพสต์เมื่อ 06 May 2007 - 11:10:29 PM

คือผมเองยังไม่ค่อยจะเก่งเรื่องถาษาเท่าไหร่ พองูๆปลาๆไปได้ จากที่ผมอ่านจากข้างบนแล้ว ผมอยากลองเอาโคดไปใช้ แปลงไฟล มันใช้ยังไงคับ
แล้วโคด มันเป็นภาษาอะไรหรอคับ แอสเซมบี้รึป่าว แค่นี้หล่ะคับ ขอบคุณคับ



#10 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102427 โพสต์
  • Gender:Male

โพสต์เมื่อ 07 May 2007 - 03:52:07 AM

code ข้างบน ไม่ใช่โปรแกรมครับมันคือโครงสร้างของไฟล์ .nri ซึ่งคุณต้องเอาไปเขียนโปรแกรมเอาเอง ซึ่งคุณจำเป็นต้อง เขียนโปรแกรมเป็น, ติดต่อกับไฟล์เป็น, ....

code ที่เห็นเป็นการประกาศโครงสร้าง ในแบบของภาษา C++ (มั้ง) ครับ เอาไปใช้เลยไม่ได้แน่นอน

ts.gif

manutd18wm.png


#11 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 09 May 2007 - 01:25:43 AM

มาต่อกัน
(เพิ่งรู้ เราไปแจมกระทู้เคัา ของตัวเองมีไม่ตอบ)
พอดีไปอ่านหนังสือเล่มนึง หนุกหนานจนวางไม่ลง Game Theory at Work
น่าจะเขียนเกมจำลองเหตุการณ์เหมือนในหนังสือ smile.gif

สิ่งที่เราจะดูต่อไปก็คือ ข้อมูลของภาพที่เก็บในไฟล์
โดยปรกติไฟล์รูปภาพ มักจะต้องมีข้อมูลเหล่านี้
--มิติของภาพ คือ กว้าง สูง เท่าไหร่
--ความลึกของภาพ คือ จำนวนบิต ที่ใช้ ต่อหนึ่งจุดสี
--ขนาดของภาพ คือขนาดของหน่วยความจำที่ใช้เก็บภาพ
มักจะเท่ากับ กว้าง*สูง*บิต(ไม่ใช่ก็ใกล้เคียงแหละถ้ามันไม่บีิบlaugh.gif )
--ตำแหน่งเริ่มต้นของข้อมูลภาพ
--และข้อมูลอื่นๆ แล้วแต่ประเภท และความจำเป็น
แน่นอน ขึ้นอยู่กับความพอใจของคนสร้างเค้าด้วย 555
การจะหาข้อมูลเหล่านี้ ก็ต้องดูข้อมูลบางอย่างที่มันเป็นตัวแนะ เิริ่มที่ง่ายๆ ก่อน
จู่ๆ จะไป hex ลูกเดียว มันก็เทพเกินไป และผมก็ไปเจอเป้าหมายอยู่ใน
..\Trickster\data\UI_nori\intro_img

ที่น่าสนใจมีอยู่ 4 ไฟล์

intro_base1024.nri ขนาด 1,537 kb
intro_base800.nri ขนาด 939 kb
intro_Load1024.nri ขนาด 20 kb
intro_Load800.nri ขนาด 15 kb


(คนอื่นจะต่างไปจากนี้หรือเปล่าไม่รู้นะ เพราะผมไม่ได้เข้าเกมหลายเดือนละ มันคงอัพเดทเยอะละมั้ง)
เห็นไหมครับตัวแนะ... ใช่แล้วครับ ชื่อไฟล์ ตัวเลขคุ้นๆ
มิติหน้าจอของวินโดว์ที่เราคุ้นเคย 1024*768 กะ 800*600
มันมี 4 ไฟล์ แล้ว ไฟล์ไหนหล่ะ

ขนาดภาพไงครับ ตัวแนะ กว้าง*สูง*บิต
เดี๋ยวนี้ที่มักเจอ คือ 8,16,24 และ 32 บิต ลองเอาตัวเลขคูณกันดู(อย่าลืมหาร 8 เพื่อให้ได้หน่วยเป็นไบต์)
1024*768*8/8=786,432>20kb ตัดไปได้ 2 ไฟล์แล้ว คงเหลือ

intro_base1024.nri ขนาด 1,537 kb
intro_base800.nri ขนาด 939 kb


เอาหละได้ข้อมูลมาพอสมควร มาเริ่ม hex กัน
ผมเลือก intro_base800.nri ซึ่งได้ข้อมูลดังนี้(ตัดมาบางส่วน)

4E4F 5249 2F01 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0100 0000
D801 0000 24A8 0E00 4741 5749 2C01 0000
1000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0100 0000
4CA6 0E00 0000 0000 0100 0000 00A6 0E00
2003 0000 5802 0000 0000 0000 0000 0000
0000 0000 5057 5057 5057 5057 5057 5057
5057 5057 5057 5057 5057 5057 5057 5057


หาตัวเลขมิติก่อน 800*600
800=0x320
600=0x258
เจ้าสองตัวนี้มักจะอยู่ติดกัน และมักจะมีขนาด 2 ไบต์ ไม่ก็ 4 ไบต์
ถ้าสองไบต์ ก็จะเรียงในหน่วยความจำ ดังนี้
2003 5802
ถ้า 4 ไบต์ ก็เป็นดังนี้
2003 0000 5802 0000
พอจะเห็นอะไรเข้าเค้าบ้างหรือยัง(ก็ใส่สี ซะอย่างนั้น ไม่เห็นก็บ้าละ)

ทีนี้มาดูขนาดภาพ
แรกๆ ก็เดาว่ามี 1 ภาพในไฟล์นี้ (ตามเหตุผลในการเดาที่ว่ามา)
และจำนวนบิตเราก็ไม่รู้ ฉะนั้นก็เดาอีกแระ แล้วเอาเลชคูณกันดู
1.->800*600*8/8=480,000
2.->800*600*16/8=960,000
3.->800*600*24/8=1,440,000
อ้ะๆ อย่าลืมๆ กลัีบไปดูขนาดไฟล์ 939 kb
อ้า ได้ตัวเลขที่น่าสงสัยละ
ข้อ 1 ก็น้อยเกิน ถ้าเก็บสองภาพ ก็มากเิกิน
ข้อ 3 ก็ใหญ่เกิน
ใช่แล้วครับ ข้อ 2
เราก็สามารถเดาได้ว่า ภาพนี้เป็นภาพ 16 บิต มีขนาดเก้าแสนกว่า ๆ
960,000=0xEA600 ซึ่งน่าจะเรียงในหน่วยความจำดังนี้ 00A6 0E00
ที่ๆ มันอยู่ ก็มักจะใกล้ๆ กับตัวเลขที่บอกมิติของภาพ แหม แล้วเราก็เจอมันเต็มๆ

ต่อไปจำนวนบิตสี
ก็ 16 ไง หรือ 0x10
จากที่เราเดาผ่านมา เขามักเก็บเป็นขนาด 4 ไบต์ เราก็ลองเดาว่ามันมีขนาด 4 ไบต์
ลองหาตัวเลข 1000 0000 ดูซิ เจอไหม อ้อ อยู่นั่นเอง

และสุดท้าย ตำแหน่งเริ่มต้นของข้อมูลภาพ
ปรกติมักจะมีตัวเลขคล้ายๆกัน ติดกันเป็นพืด ยิ่งถ้าเป็นภาพที่เหมือนกัน เช่นเป็นสีพื่้นหลัง ก็จะมีข้อมูลเหมือนกัน
เนื่องจากเราเดาว่ามันมี 1 ภาพ ในไฟล์นี้(โดยเดาจากขนาดไฟล์)
ฉะนั้นตำแหน่งเริ่มต้นของจุดสี ก็น่าจะต่อจาก header
ผมก็ดูตัวเลข offset หรือ ตำแหน่งของข้อมูลในไฟล์
hex editor ทั่วไปมักจะแสดงไว้ด้านซ้ายมือ
(ผมไม่ขออธิบาย คำว่า offset เพิ่มเติมหละ ถ้าใครไม่เข้าใจ ก็แสดงว่า พื้นฐานยังไม่แน่นพอ
ซึ่งผมแน่ใจว่า ด้วยข้อมูลที่ผมให้นี้ คุณนำไปใช้ไม่เป็นแน่นอน ศึกษาเพิ่มเติมเองนะครับ)
ตำแหน่งของ 5057 ตัวแรกคือ 0x74 ปรากฏว่าหาไม่เจอครับ
เพราะเขาไม่บอกตรงๆ เขาใช้การบอกตำแหน่งแบบอ้างอิง
โดยเริ่มนับหลังจากสิ้นสุด header เป็นตำแหน่งเริ่มต้น
ถึงตรงนี้คงจะงงพอสมควร
วิธีให้หายงง คือเปิดหลายๆ ไฟล์เปรียบเทียบกันดู จนคุ้นตา
เทียบฟิลด์ที่เราคิดว่าเราเดาถูก เทียบที่เรายังไม่รู้ บางทีมันก็จะทำให้เราเกิดความคิดอะไรบางอย่าง
นับจำนวนไบต์ เช่น header มีขนาดเท่าไหร่ มี header อะไรบ้าง เทียบไปเทียบมาๆๆ
จนได้ข้อมูลที่พอแค่การทดลอง

การเดาของเราที่ว่าเราเดาถูก จะถูกจริง ก็ต่อเมื่อ นำมาเขียนโปรแกรมทดลองดูครับ
ถ้ามันแสดงผลโอเค ก็เป็นสิ่งยืนยันว่าเราเดาถูก
หลังจากเขียนโปรทดลองแล้ว สิ่งที่เราแน่ใจว่าใช่ อาจไม่ใช่ก็ได้ครับ
ลองผิดลองถูกไปเรื่อยๆ เดี๋ยวดีเองครับ อีกหน่อย เห็นปุ๊บ ก็เดาออกปั๊บละ
เหมือนขี่จักรยาน อะไรปานนั้นแหละ ฝึกใหม่ก็ยากหน่อย


แค่นี้ละกันนะ สำหรับคำถาม แกะยังไง ก็คือ เดา เดายังไง ก็เดาอย่างที่ว่ามาหน่ะแหละ laugh.gif laugh.gif laugh.gif
ผมว่าผมสาวออกมาจนหมดพุงละ
ได้ภาพเป็นยังไงก็มาโชว์กันมั่งนะ หุหุ อย่าให้เจอแบบผมข้างบนหล่ะ

อันนี้คือภาพที่เรากะลังแกะกัน(ภาพนี้ผมลดขนาดลงนะ ของจริง 800*600*16)





0 สมาชิกกำลังอ่านกระทู้นี้

0 สมาชิก, 0 ผู้เยี่ยมชม, 0 ผู้ใช้งานที่ซ่อนตัว