1 คะแนน โดย GN⁺ 2024-02-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Magicore Anomala ใช้ความสามารถด้านกราฟิกและเสียงของ Amiga ที่เปิดตัวในปี 1985 เพื่อทำ CG เต็มหน้าจอและทรานซิชันแบบแอนิเมชัน แต่ภายในเอนจินเกมต้องแก้ทั้งเรื่องการจัดวาง RAM การแบ่งหน้าจอ และข้อจำกัดของสไปรต์ไปพร้อมกัน
  • ในการตั้งค่าทั่วไปของ Amiga 500 มี Chip RAM สำหรับกราฟิกและเสียงเพียง 512KB เท่านั้น ทำให้ขนาดแบบไม่บีบอัด 48KB ของ CG 320x240·32 สีเป็นภาระใหญ่
  • CG ถูกย่อด้วย ZX0 compression เหลือราว 8KB แล้วเก็บไว้ใน expanded RAM ก่อนจะคลายบีบอัดกลับเข้า Chip RAM ทันทีเมื่อใกล้จะแสดงผล โดยนำหน่วยความจำหน้าจอเดิม 48,000 ไบต์กลับมาใช้ซ้ำ
  • เอฟเฟกต์ทรานซิชันสร้างด้วย copper ที่เปลี่ยนฮาร์ดแวร์รีจิสเตอร์ใน scanline ที่กำหนด และปิดเปิด bitplane DMA โดย CPU จะปรับค่าของ copperlist ตามความกว้างของ split ในแต่ละเฟรม
  • motion lines ของฉากหลังต้องหลบข้อจำกัดด้านสี การใช้ซ้ำ และการพึ่งพา bitplane ของสไปรต์บน Amiga โดยกลไกสำคัญคือ attached sprites, บิตควบคุมแบบหลอก, การคง bitplane ไว้ 1 ชุด และการปรับ BPLMOD1

ปัญหา RAM ของการใส่ CG เต็มหน้าจอบน Amiga 500

  • แพลตฟอร์มเป้าหมายของ Magicore Anomala คือ Amiga 500 มาตรฐาน โดยมี 512KB Chip RAM และ 512KB expanded RAM
    • หน่วยความจำที่ชิปเซ็ต Amiga ใช้สำหรับแสดงกราฟิกและเสียงได้มีเพียง Chip RAM เท่านั้น
    • expanded RAM นั้น CPU เข้าถึงได้อย่างเดียว จึงนำไปใช้กับกราฟิกและเสียงโดยตรงได้ยาก
  • กราฟิกตัวละครแบบเต็มหน้าจอ (CG) เป็นภาพ bitmap 320x240 แบบ 32 สี และกินพื้นที่ 48KB ในสภาพไม่บีบอัด
    • เมื่อรวมแอสเซ็ตร่วม ข้อมูลด่าน และการจัดสรรหน่วยความจำหน้าจอแล้ว 48KB ถือเป็นโอเวอร์เฮดที่ใหญ่
  • การรองรับการบีบอัดแอสเซ็ตที่เพิ่งเพิ่มเข้ามาไม่นานใช้ ZX0 compression format
    • CG ที่บีบอัดแล้วเหลือประมาณ 8KB
    • ตอนโหลดแอสเซ็ตของด่าน จะนำ CG ที่บีบอัดแล้วไปเก็บใน expanded RAM
    • ก่อนแสดงผลจึงค่อยคลายบีบอัดกลับเข้า Chip RAM

วิธีที่ไม่ต้องหา Chip RAM 48KB เพิ่มใหม่

  • แทนที่จะหา Chip RAM ว่าง 48KB แยกต่างหากสำหรับ CG ก็ใช้บางส่วนของหน่วยความจำหน้าจอเดิมซ้ำ
    • ภาพพื้นหลังของห้อง
    • เลเยอร์หน้าจอสำหรับเรนเดอร์วัตถุอันตราย
    • พื้นที่หน้าจอของกล่องข้อความ
  • หน่วยความจำทั้งสามส่วนนี้เรียงต่อเนื่องกันใน RAM และมีขนาดรวม 48,000 ไบต์ ซึ่งตรงกับขนาดของ CG พอดี
  • ภาพพื้นหลังของห้องสามารถกู้คืนได้หลังจากแสดง CG เสร็จ จึงไม่มีปัญหาหากถูกเขียนทับ
  • การคลายบีบอัด CG ใช้เวลาประมาณ 500ms แต่ถูกใส่ไว้ในจังหวะของคัตซีน จึงไม่ดูเหมือนหน้าจอโหลด
  • วิดีโอ proof-of-concept ของเกมเพลย์ Magicore Anomala รับชมได้บน YouTube

เอฟเฟกต์แบ่งหน้าจอและการใช้ copper

  • ตอนแรกเคยคิดจะใช้ทรานซิชันแบบ vertical wipe แต่ถ้าจะให้ดูดีจำเป็นต้องมีการไล่เฉดโดยปรับพาเลตสีในทุก scanline
    • มองว่าใช้ copper อย่างเดียวคงตั้งค่า 32 สีทั้งหมดภายใน horizontal blank เดียวได้ยาก
    • และไม่อยากไปยุ่งกับ “racing the beam” จึงเลือกใช้เอฟเฟกต์แบ่งหน้าจอแทน
  • เอฟเฟกต์แบ่งหน้าจอดูเท่กว่าสำหรับผู้ชมทั่วไป และ copper ของ Amiga ก็แทบเหมือนถูกออกแบบมาเพื่อเอฟเฟกต์แบบนี้โดยเฉพาะ
    • ตัวอย่างเอฟเฟกต์คล้ายกันที่มีอยู่ใน Amiga Workbench ดูได้ในวิดีโอนี้
  • การทำงานนี้อาศัยสองความสามารถของ Amiga ร่วมกัน
    • copper สามารถรันรายการคำสั่งของตัวเองแบบขนานกับ CPU และเปลี่ยนฮาร์ดแวร์รีจิสเตอร์ที่บรรทัดจอเฉพาะได้
    • สามารถตั้ง screen pointer ผ่านฮาร์ดแวร์รีจิสเตอร์เพื่อชี้หน่วยความจำหน้าจอไปยังตำแหน่งใดก็ได้ใน Chip RAM

หยุด bitplane DMA แล้วค่อยวาดต่อ

  • สมมุติว่าหน่วยความจำหน้าจอหลักเริ่มที่ 0x20000 โดยปกติ copper จะตั้งค่าแอดเดรสนี้ในรีจิสเตอร์ bitplane DMA
    • เมื่อเปิดใช้ bitplane แล้ว DMA จะอ่านพื้นที่หน่วยความจำนั้นตามลำดับเพื่อนำไปแสดงบนจอ
  • หากแต่ละบรรทัดแนวนอนใช้ 0x100 ไบต์ การตั้ง screen pointer เป็น 0x20800 จะทำให้ภาพดูเหมือนเลื่อนขึ้น 8 บรรทัด
    • เพราะจุดเริ่มต้นของหน้าจอบนหน่วยความจำถูกเลื่อนลงไป 8 บรรทัด
  • ครึ่งบนของ split จะใช้วิธีนี้เลื่อนขึ้นด้านบน
  • ที่จุด split นั้น copper จะ ปิด bitplane DMA และเปลี่ยนสีพื้นหลังเป็นสีแดง
    • ฮาร์ดแวร์รีจิสเตอร์ที่เกี่ยวกับ bitplane จะหยุดอยู่กับที่ในทางปฏิบัติ
    • เมื่อถึงด้านล่างของ split ก็จะคืนค่าสีพื้นหลังและเปิด bitplane DMA อีกครั้ง
    • ภาพจะถูกวาดต่อจากตำแหน่งที่หยุดไว้ แต่ตำแหน่งแสดงผลจริงอยู่ต่ำลงบนหน้าจอ
  • ในทุกเฟรม CPU จะปรับ vs_TCopTop และ vs_TCopBottom ตามความกว้างปัจจุบันของ split
    • รวมถึงการปรับ screen pointer สำหรับ split ด้านบนด้วย แต่ไม่ได้รวมไว้ในตัวอย่างโค้ด

การเลี่ยงข้อจำกัดของสไปรต์เพื่อทำ motion line แบบ “woosh”

  • motion lines ของฉากหลังแบบแอนิเมชันวาดด้วยสไปรต์
    • สไปรต์ถูกวาดและเคลื่อนที่ได้โดยไม่ขึ้นกับหน่วยความจำหน้าจอ จึงเหมาะกับงานนี้
    • แต่สไปรต์ของ Amiga มีข้อจำกัดมากและใช้งานค่อนข้างซับซ้อน
  • ข้อจำกัดเรื่องสี

    • สไปรต์ใช้ bitplane และพาเลตสีร่วมกัน จึงต้องใช้สีให้น้อยที่สุดเท่าที่ทำได้
    • motion lines ใช้เพียง 3 สี เพื่อเหลือ 28 สีให้ CG และอีก 1 สีให้ฉากหลัง
    • ใน Amiga แต่ละคู่ของสไปรต์จะใช้ช่วงสีในพาเลตต่างกัน
      • สไปรต์สองตัวแรกใช้สี 16-19
      • สไปรต์สองตัวถัดไปใช้สี 20-23
    • ถ้านำสไปรต์สองตัวมา attach กัน มันจะทำงานเหมือนสไปรต์ตัวเดียวที่มีพาเลต 16 สี และใช้สี 16-31 ได้
    • motion lines ใช้ attached sprites จำนวน 4 ชุด และในกราฟิกใช้เฉพาะสี 29-31
  • การใช้กราฟิกสไปรต์เดียวกันในหลายตำแหน่ง

    • 4 ไบต์แรกของกราฟิกสไปรต์คือ control bits ที่ใช้กำหนดตำแหน่งและความสูง
    • โครงสร้างนี้ทำให้เกิดปัญหาเมื่อต้องการวาดกราฟิกเดียวกันในหลายตำแหน่ง
    • เคยพยายามตั้ง control bits ของสไปรต์โดยตรงผ่านฮาร์ดแวร์รีจิสเตอร์ แต่ทำให้มันแสดงบนหน้าจอไม่ได้
    • sprite DMA ของ Amiga จะไล่ตาม pointer ของข้อมูลสไปรต์แล้ววาดขึ้นจอ คล้ายกับ bitplane DMA
    • วิธีแก้คือสร้างสไปรต์ปลอมขนาด 4 ไบต์ขึ้นมา 8 ตัว
      • สไปรต์ปลอมเหล่านี้มีแค่ control bits เท่านั้น
      • เริ่มต้นด้วยการตั้ง pointer ของสไปรต์ทั้งหมดให้ชี้ไปที่สไปรต์ปลอม
      • ประมาณบรรทัดที่ 19 sprite DMA จะอ่าน pointer และโหลด control bits
      • หลังจากนั้นจึงเปลี่ยน pointer ทั้งหมดไปยังกราฟิก “motion line” ของจริง
    • ผลลัพธ์คือ DMA ถูกโหลดให้วาดสไปรต์ในตำแหน่งต่างกัน แต่ใช้กราฟิกเดียวกัน และการสลับนี้ทำผ่าน copperlist

ปัญหาที่พอปิด bitplane แล้วสไปรต์ก็หายไปด้วย

  • ก่อนที่ CG จะขึ้นมาถึงด้านบนของจอ จะมีช่องว่างระหว่างด้านบนของหน้าจอกับจุดเริ่มของ CG
    • หากเปิด bitplane ทิ้งไว้ในช่วงนั้น จะมีข้อมูลขยะถูกวาดขึ้นจอ
  • ในบริเวณนี้จึงต้องปิด bitplane เพื่อไม่ให้ DMA ไปอ่านข้อมูลขยะ
  • ปัญหาคือเมื่อปิด bitplane แล้ว สไปรต์จะไม่ถูกวาดด้วย
    • ส่งผลให้ motion lines มองเห็นได้เฉพาะภายในขอบเขตของ CG
  • วิธีแก้คือไม่ปิด bitplane ไปเลยทั้งหมด แต่เปิดไว้ 1 ชุดและตั้ง screen pointer ให้ชี้ไปยังข้อมูลว่าง
    • ระบบยังคงวาดอะไรบางอย่างอยู่ แต่ผลลัพธ์สุดท้ายคือมองไม่เห็นอะไรเลย
  • ไม่จำเป็นต้องเตรียมหน้าจอว่างทั้งผืน
    • ที่ความลึก 1 บิตต่อพิกเซล หนึ่งบรรทัด 320 พิกเซลมีขนาด 320 บิต หรือ 40 ไบต์
    • ถ้าตั้ง BPLMOD1 เป็น -40 pointer จะย้อนกลับ 40 ไบต์หลังจบแต่ละบรรทัด ทำให้วาด 40 ไบต์เดิมซ้ำไปเรื่อย ๆ
    • แค่ปล่อยให้ 40 ไบต์แรกใน safety margin ของหน้าจอเป็นศูนย์ก็เพียงพอ

ผลลัพธ์และงานจุกจิกที่ยังเหลือ

  • ตอนแรกยังไม่แน่ใจว่าจะใส่ CG แบบนี้ลงในเกมได้หรือไม่ เพราะความต้องการ RAM สูง แต่หลังจากทำระบบบีบอัดข้อมูลแล้วก็พบว่าโอเวอร์เฮดอยู่ในระดับที่สมเหตุสมผลมาก
  • ทำให้สามารถใส่ลูกเล่นภาพเพิ่มเติมให้กับ Magicore ได้
  • ยังมีงานย่อยที่ไม่ได้กล่าวถึงเหลืออยู่
    • ตัวอย่างเช่น ปัญหาที่ทำให้ motion line ขนาด 100px ไม่หายวับไปทันทีที่ส่วนบนหลุดพ้นจอ
  • เอฟเฟกต์นี้ ไม่ได้ใช้ blitter เลยแม้แต่น้อย
  • Amiga ยังคงเป็นแพลตฟอร์มที่สามารถสร้างความประทับใจให้ผู้คนได้ด้วยความสามารถด้านการแสดงกราฟิกสี เช่นเดียวกับที่มันเคยสร้างความประทับใจให้คนในช่วงปลายทศวรรษ 1980

1 ความคิดเห็น

 
GN⁺ 2024-02-26
ความเห็นจาก Hacker News
  • ตอนนี้เข้าใจชัดเลยว่าคำว่า “Racing the beam” หมายถึงอะไร สมัยก่อนผมจะเปลี่ยนสีของลำแสงที่ต้นและท้ายของรูทีนที่ซิงก์กับ vsync เพื่อคำนวณว่าต่อเฟรมใช้เวลา CPU ได้กี่สแกนไลน์
    จำได้ว่าที่อยู่ที่ใช้สำหรับเรื่องนี้คือ $dff180 มันคือพาเลตสี 0 เลยเห็นได้ตลอดแม้ที่ขอบจอนอกพื้นที่บิตแมป
    เทคนิคพวกนี้ตอนนั้นก็เรียนกันแบบปากต่อปากล้วน ๆ ไม่มีอินเทอร์เน็ต และไม่คิดเลยว่าทุกวันนี้ยังมีคนพยายามเค้นประสิทธิภาพจากชิปเซ็ตนี้ให้ได้มากขึ้นอีก

  • ผมสงสัยจริง ๆ ว่าคนแบบไหนกันที่ยังหาเวลามาสร้างเกมบน Amiga ได้ คนหนุ่มสาวก็คงไม่ค่อยสนใจคอมพิวเตอร์เก่าแบบนี้ ส่วนคนที่โตมากับมันก็น่าจะยุ่งกับครอบครัวและงาน
    ต่อให้ไม่ยุ่ง ก็ยังมีโปรเจกต์อื่นอีกมากที่สนุกพอ ๆ กันและยังดูร่วมสมัยกว่าเยอะ ถึงอย่างนั้นมันก็เท่มากจริง ๆ

    • ผมเกิดปี 1991 และที่บ้านเคยมี Amiga 1000 ก่อนจะย้ายไปใช้พีซี Windows 95 เลยมีความรู้สึกผูกพันกับ Amiga มาตลอด และยิ่งได้เข้าใจชิปที่แปลกไม่เหมือนใครและทรงพลังซึ่งทำให้มันมีสมรรถนะเช่นนี้ ก็ยิ่งรักมันมากขึ้น
      ตอนนี้ผมทำงานเป็นนักพัฒนาเกมอินดี้เต็มเวลา การได้ทำเกมบน Amiga เป็นความฝันแทบจะทั้งชีวิต และตอนนี้ผมคิดว่าตัวเองมีทักษะพอจะทำมันได้แล้ว
      ผมอยากแสดงให้เห็นว่า ด้วยเครื่องมือสมัยนี้และองค์ความรู้ที่แพร่หลาย เราสามารถเติมชีวิตใหม่ให้ฮาร์ดแวร์คลาสสิกอันเป็นที่รักได้ ด้วยประสบการณ์เกมที่ยึดหลักการออกแบบสมัยใหม่
    • สำหรับหลายคน ไม่มีอะไรสนุกไปกว่า Amiga, C64, Atari หรือ ZX Spectrum อีกแล้ว
      ถ้าคุณโยงทุกอย่างในชีวิตเข้ากับอาชีพ ชีวิตทั้งชีวิตก็จะกลายเป็นงานไปหมด
      มันก็เหมือนถามว่าในเมื่อมี Photoshop แล้วจะฝึกวาดสีน้ำมันไปทำไม หรือในเมื่อมี Tesla แล้วจะบูรณะรถวินเทจไปทำไม
    • ผมอาจจะไม่ได้เด็กพอจะอยู่ในกลุ่มนั้น แต่ก็ชอบคอมพิวเตอร์ที่เก่ากว่ายุคของตัวเองไปนิดหน่อยหลายเครื่อง ผมหา Commodore 64 มาได้ เปลี่ยนคาปาซิเตอร์ เปลี่ยน PLA แล้วก็ใส่ทั้ง dual SID กับโมดิฟาย “สลับภูมิภาค”
      โมดิฟายสลับภูมิภาคค่อนข้างซับซ้อน เพราะต้องสลับทั้ง VIC-II สองตัวและออสซิลเลเตอร์สองตัว ผมมี MSX2 ด้วย แม้จะยังไม่ได้ทำอะไรมาก แต่มันมีเสน่ห์มาก
      การหาเวลามาเขียนโค้ดให้เครื่องพวกนี้จริง ๆ เป็นเรื่องยาก แต่ผมว่ามันก็เหมือนงานอดิเรกของคนทำงานทั่วไป คือทุ่มคืนและวันหยุดสุดสัปดาห์ให้มันเมื่อมีแรงบันดาลใจ
      Retocomputing เป็นงานอดิเรกที่น่าหลงใหล ยอดเยี่ยม และให้ความรู้สึกคุ้มค่า เพียงแต่สิ่งที่ผมหงุดหงิดมากกว่าเรื่องเวลาก็คือราคาและความยากในการหาอะไหล่
      น่าเสียดายที่ดูเหมือนจะมีคนมากขึ้นเรื่อย ๆ ที่พยายามขายของอะไรก็ตามในตลาดคอมพิวเตอร์ให้แพงขึ้น เพียงเพราะแปะป้ายว่า “antique” หรือ “vintage”
      สำหรับกลุ่มอายุมากกว่านั้นผมพูดแทนตรง ๆ ไม่ได้ แต่ดูเหมือนว่าคนทำเดโม Commodore 64 อยู่ทุกวันนี้บางส่วนกำลังพยายามเชื่อมโยงกับวัยเด็กของตัวเองอีกครั้ง
      มีผลงานอย่างเดโม “Mojo” ที่ค่อนข้างใหม่ของ Bonzai และ Pretzel Logic ซึ่งแทบจะเล่าเรื่องนั้นออกมาตรง ๆ เลย การพยายามทำ storytelling แบบ “จริงจัง” ในงาน demoscene อาจจะดูเขิน ๆ หน่อย แต่ผมก็ชอบเพราะมันมีความอบอุ่น
      มันเป็นงานอดิเรกที่กินเวลามาก แต่ถ้าคุณอยากหาเวลาให้มันจริง ๆ คุณก็จะหาวิธีได้ในที่สุด
      [1]: https://csdb.dk/release/?id=232966, https://www.youtube.com/watch?v=HXi3oJ9huiI
    • ผมมีเพื่อนคนหนึ่งที่ทำอินเทอร์เฟซสำหรับต่อเกมคอนโทรลเลอร์รุ่นใหม่เข้ากับคอมพิวเตอร์เก่า ที่นี่เขาต่อ Nintendo Balance Board ให้เล่น Decathlon บน Commodore 64 ได้
      [1] https://retro.moe/2024/02/04/bluepad32-v4-0/
      [2] https://www.youtube.com/watch?v=Nj5fZlt_834
    • ผมอายุมากกว่าคนเขียนต้นฉบับ 5 ปี ช่วงต้นของการระบาดใหญ่ ผมสะสม Atari, Amiga และเอกสารบางอย่างไว้เพื่อเรียน assembly เล่น ๆ มีคอร์ส Udemy ด้วย
      https://www.udemy.com/course/programming-games-for-the-atari...
      ผมเคยคิดว่าการทำงานจากบ้านน่าจะทำให้มีเวลาว่างมากขึ้น แต่ความจริงไม่ใช่เลย ถึงอย่างนั้นสักวันหนึ่งก็ต้องกลับมาทำต่อ
  • ผมสงสัยมาตลอดว่า เกมสไตล์คอนโซลญี่ปุ่น บน Amiga จะออกมาหน้าตาเป็นอย่างไร และที่จริงแล้ว Amiga ขาดสมรรถนะหรือแค่ดีไซน์ของเกมส่วนใหญ่ไม่ใช่รสนิยมของผมกันแน่
    Bonk ถูกพอร์ตโดย Factor 5 ได้ยอดเยี่ยมมาก แต่พวกเขาแทบจะเป็นพ่อมดเลย

  • ข้อความที่ว่า “Amiga 500 ทั่วไปมี 512KB Chip RAM และ 512KB expansion RAM” นั้นคลาดเคลื่อนเล็กน้อย A500 พื้นฐานมีแค่ 512KB Chip RAM เท่านั้น
    ผู้ใช้จำนวนมากเพิ่ม A501 RAM expansion เพื่อเพิ่ม 512KB Fast RAM ที่ฮาร์ดแวร์กราฟิกเข้าถึงโดยตรงไม่ได้
    แม้จะระบุว่าเป็น Fast RAM แต่เพราะโครงสร้างของส่วนขยาย มันจึงช้ากว่า Fast RAM จริง

    • มันคือสิ่งที่เรียกว่า Slow RAM
      เจ้าของ A500 ส่วนใหญ่มีส่วนขยาย trapdoor ขนาด 512KB และซอฟต์แวร์จำนวนมาก รวมถึงเกมอย่าง Monkey Island ก็รันไม่ได้ถ้า RAM รวมไม่ถึง 1MB
      ทุกวันนี้มีส่วนขยาย trapdoor ราคาย่อมเยาจากแบบฮาร์ดแวร์เปิดเผยออกมามากมาย ซึ่งให้ทั้ง Slow RAM 1.5MB, 512KB Chip RAM เพื่อให้รวมเป็น 1MB และ RTC ด้วย
  • มีบางอย่างที่น่าดึงดูดอย่างไม่น่าเชื่อในการ เขียนโค้ดภายใต้ข้อจำกัด แบบนี้

    • “ศัตรูของศิลปะคือ การไม่มีข้อจำกัด
  • IE ดีใจที่ได้เห็นคุณยังขุดลึกกับ Amiga อยู่

  • ผมรู้สึกเหมือนมีคนจำนวนมากที่เล่น Amiga คนละแบบกับที่ผมเคยเล่น เห็นได้ชัดว่ามีเกมเท่ ๆ อยู่ แต่ Nintendo NES ก็มีเหมือนกัน และผมก็ไม่ได้หวนคิดถึงเครื่องไหนเป็นพิเศษนัก
    แต่ถึงอย่างนั้น การได้เห็นว่าทำแอนิเมชันแบบนี้ขึ้นมาอย่างไรก็เจ๋งมาก

    • ผมมีทั้งสองเครื่อง และพูดตรง ๆ ว่า Amiga ให้ความรู้สึกเหมือนเป็น เครื่องที่ล้ำไปสองยุค เลย ซึ่งดูจากความต่างของฮาร์ดแวร์แล้วก็ไม่น่าแปลกใจ
      Amiga เป็นระบบที่ยัดทุกอย่างมาให้จริง ๆ มี CPU 32 บิตระดับสูง, กราฟิกเร่งความเร็ว, เสียงยอดเยี่ยม และ RAM มากกว่า NES ถึง 256 เท่าตามตัวอักษร
      แม้แต่ SNES ก็ยังเทียบไม่ติด และผมเพิ่งจะได้เห็นเครื่องที่เหนือกว่า Amiga จริง ๆ ก็ในยุค Sega Saturn
    • ขอเช็กให้แน่ใจหน่อย คุณรู้ใช่ไหมว่านี่คือ เกมใหม่ ที่กำลังพัฒนาอยู่ตอนนี้?
      https://www.youtube.com/watch?v=4SB20aFHc08