- เกมจำลองการซื้อขายที่อ้างอิงจากเกม BASIC บน IBM PC ในยุค 1980 โดยเป็นเวอร์ชันที่รันด้วย TI-BASIC บนเครื่องคิดเลข TI-82·83·83+
- ผู้เล่นจะเดินทางระหว่างหกเมืองเพื่อ ซื้อขายยาเสพติด ใช้หนี้ และมุ่งทำกำไรสูงสุดภายในหนึ่งเดือน พร้อมเหตุการณ์สุ่มและการไล่ล่าจากตำรวจ
- ชุมชนมีการพูดคุยอย่างคึกคักเกี่ยวกับวิธีติดตั้งและรัน เช่น การแชร์ไฟล์
.8xp, การโอนผ่าน TI CONNECT, การแปลงด้วย TI-Coder รวมถึงสร้างเวอร์ชันดัดแปลงหลากหลายแบบ
- จากการวิเคราะห์โค้ดพบ บั๊กจากการใช้ตัวแปรซ้ำซ้อน และข้อผิดพลาดเชิงตรรกะอย่างลูปทำกำไรไม่สิ้นสุด ทำให้ผู้ใช้หลายคนช่วยกันแก้ไขและเผยแพร่เวอร์ชันที่รองรับ TI-84 CE
- ต่อมาได้พัฒนาไปสู่ รีเมคด้วย C/SDL, พอร์ตไปยัง Pico-8 และ C#, การย้ายไปคอนโซล Z80 ฯลฯ จนชุมชนขยายตัวเป็นโครงการฟื้นฟูเกมเครื่องคิดเลขคลาสสิก
ภาพรวมเกม Drugwars สำหรับ TI-82/83/83+
- Drugwars ที่รันบนเครื่องคิดเลข TI-82, TI-83, TI-83+ เป็น เกมจำลองการซื้อขาย ที่อ้างอิงจากเกม BASIC บน IBM PC ในยุค 1980
- ผู้เล่นซื้อขายยาเสพติดเพื่อ ใช้หนี้ที่ติดกับเจ้าหนี้นอกระบบ และมีเป้าหมายทำเงินให้ได้มากที่สุดภายในหนึ่งเดือน
- เกมเขียนด้วย ภาษา TI-BASIC และโครงสร้างหลักอาศัยคำสั่ง
Lbl, Goto, Menu, Disp
- เมื่อเริ่มเกม จะมีการ กำหนดค่าเริ่มต้นของตัวแปร เช่น เงินสด หนี้ สินค้าคงคลัง และความจุของเสื้อโค้ตยาว
- ตัวอย่าง:
2000→Z (เงินสด), 5000→Y (หนี้), 100→K (พื้นที่ว่าง)
- มีข้อความ “ORIGINAL GAME FOR IBM BY JOHN E. DELL” เพื่อระบุที่มาของผลงานต้นฉบับ
-
โครงสร้างการเล่น
- ผู้เล่นจะเดินทางระหว่าง หกเมืองเพื่อทำการซื้อขาย ได้แก่ Bronx, Ghetto, Central Park, Manhattan, Coney Island, Brooklyn
- เลือกการกระทำผ่านเมนู
Menu("DRUGWAR!", "SEE PRICES", "BUY", "SELL", "JET", "SEE LOAN SHARK", "VISIT BANK")
- ราคาของยาแต่ละชนิด (โคเคน, เฮโรอีน, LSD, กัญชา, สปีด, รูดส์) จะเปลี่ยนแบบสุ่มในแต่ละวัน
-
ระบบเหตุการณ์
- ใช้ฟังก์ชัน
rand เพื่อสร้างเหตุการณ์สุ่ม
- เช่น การเทขายของดีลเลอร์คู่แข่ง การบุกจับของตำรวจ ราคาพุ่งสูง หรือถูกปล้นในรถไฟใต้ดิน
- ตัวอย่าง: หากเกิด “YOU WERE MUGGED IN THE SUBWAY!” จะเสียเงินสด 1/3
- ในบางเงื่อนไขสามารถ ซื้ออาวุธ, อัปเกรดเสื้อโค้ตยาว, ทำธุรกรรมกับธนาคาร, ชำระหนี้เจ้าหนี้นอกระบบ ได้
-
การต่อสู้และการไล่ล่าจากตำรวจ
- หากมียาเสพติดเกินจำนวนที่กำหนด ตำรวจ (
OFFICER HARDASS) จะเริ่มไล่ล่า
- ในเมนูสามารถเลือก RUN หรือ FIGHT ได้
- หากไม่มีอาวุธจะหนีได้อย่างเดียว และถ้าค่าพลังชีวิต (
J) ตั้งแต่ 50 ขึ้นไปจะถูกตัดสินว่าเสียชีวิต
- หากกำจัดตำรวจได้หมดจะได้รับรางวัลเป็นเงินสด
-
การจบเกมและการคำนวณคะแนน
- เกมจะจบเมื่อผ่านไป 31 วัน
- คะแนนคำนวณจาก
(V+Z-Y) แล้วแปลงให้อยู่ในช่วง 1~100
- แสดงผลพร้อมข้อความ “YOUR SCORE (ON A SCALE OF 1 TO 100)”
การพูดคุยในชุมชนและการแชร์เวอร์ชันปรับปรุง
- มีการพูดคุยอย่างต่อเนื่องเกี่ยวกับ วิธีติดตั้งและรันเกม Drugwars บน TI-82/83/83+
- สามารถพิมพ์โค้ดลงโดยตรงผ่าน BASIC interpreter บนเครื่องคิดเลข (PRGM → New) หรือใช้ TI-Coder แปลงเป็นไฟล์
.8xp แล้วโอนไปยังเครื่อง
- ระหว่างการแปลงต้องแก้ไขบางจุด เช่น เปลี่ยน
≥ เป็น >=, → เป็น ->, θ เป็น 0
- สามารถใช้ TI CONNECT หรืออะแดปเตอร์ USB สำหรับ TI-83 เพื่อโอนไฟล์จาก PC ไปยังเครื่องคิดเลข
-
คำแนะนำจาก gammalogic
- เสนอไว้สองวิธี คือ ซื้ออะแดปเตอร์ USB สำหรับ TI-83 เพื่อดาวน์โหลดเกมจาก PC หรือป้อนซอร์สโค้ดด้วยตนเอง
- อะแดปเตอร์บางรุ่นใช้ ไดรเวอร์สำหรับ Windows XP จึงอาจมีปัญหาความเข้ากันได้บน Windows รุ่นใหม่
- มีการกล่าวถึงความเป็นไปได้ของ ไดรเวอร์เสรี สำหรับ Linux หรือระบบตระกูล Unix
-
การแจกไฟล์ .8xp โดย ileathan
-
การแก้ไขและปรับปรุงโดย darth-crunchus
- ชี้ปัญหา สัญลักษณ์เครื่องหมายเปรียบเทียบผิดพลาด และปัญหาเรื่องตัวพิมพ์เล็ก/ใหญ่ของชื่อตัวแปรระหว่างการแปลงผ่าน TI-Coder
- ระบุว่าต้องแก้เงื่อนไขใน Lbl 3 และ Lbl 4 ภายใน BASIC editor จึงจะทำงานได้ถูกต้อง
- ปรับให้ทำงานได้สมบูรณ์บน TI-84 Plus CE พร้อมฟื้นฟู เหตุการณ์สุ่ม (เช่น สุนัขตำรวจ, บราวนี ฯลฯ), ราคาอาวุธ, การอัปเกรดเสื้อโค้ตยาว, การสุ่มพื้นที่เก็บของ
- ขนาดโค้ดสุดท้ายอยู่ที่ 6310B และในเวอร์ชันอัปเดตภายหลังขยายเป็น 11429B
- เพื่อให้ใกล้เคียงต้นฉบับ DOS มากขึ้น จึงเพิ่มฟังก์ชัน seed สำหรับ
rand( (random seeding)
- ซอร์สเวอร์ชันล่าสุดเผยแพร่ไว้ที่ https://pastebin.com/4dUuw0BR
-
การพูดคุยเกี่ยวกับการป้อนข้อมูลใน TI-BASIC
- ในประเด็นการจัดการการป้อนข้อมูลแบบ alphanumeric มีการกล่าวว่า TI-BASIC สามารถ จัดการสตริงแบบความยาวแปรผัน ได้
- เมื่อป้อนตัวอักษรลงในตัวแปร จะทำงานในลักษณะที่ค่านั้นของอักขระถูกส่งเข้าไปยังตัวแปร
-
ปัญหาความเข้ากันได้และการรัน
- สามารถ รันได้โดยไม่ต้องแก้ไขเพิ่มเติม บน TI-84 Plus CE และรุ่น CE Python
- ผู้ใช้บางรายรายงานว่ามีปัญหาระหว่างการซื้อ/ขาย โดยเกิดข้อผิดพลาดในการป้อนข้อมูลแล้วเด้งกลับไป MirageOS
-
การพอร์ตเพิ่มเติมและไอเดียอื่น ๆ
- มีการเสนอแผนจะเขียนใหม่เป็น แอปคอนโซล C#
- มีผู้ใช้รายหนึ่งระบุว่าได้เขียน เวอร์ชัน Pico-8 ด้วยตนเอง
- ยังมีการพูดถึงความสนใจในการย้ายไปยัง Android หรือ PC ด้วย
การวิเคราะห์โครงสร้างโค้ดและบั๊ก
-
การวิเคราะห์การใช้ตัวแปรซ้ำใน TI-83 BASIC โดย tibbon
- ตัวแปร N ถูกใช้ซ้ำสองหน้าที่
- จำนวนเฮโรอีนในคลัง:
0→N, (N+G)→N, (N-G)→N
- ติดตามตำแหน่ง:
2→N (Bronx), 1→N (พื้นที่อื่น)
- ส่งผลให้เกิด บั๊กเชิงตรรกะ ดังนี้
- เมื่อเดินทาง ปริมาณเฮโรอีนจะเปลี่ยนไปด้วย (เช่น ย้ายไป Bronx แล้ว N=2 จึงถูกมองว่ามีเฮโรอีน 2 ชิ้น)
- เมื่อติดต่อซื้อขายเฮโรอีน ค่าตำแหน่งจะถูกเขียนทับ ทำให้การตรวจว่าอยู่ Bronx หรือไม่ผิดพลาด
- เมื่อ N=0 การตรวจว่าเป็น Bronx/ไม่ใช่ Bronx จะล้มเหลวทั้งคู่ ทำให้ ข้อจำกัดการเข้าถึงธนาคาร/เจ้าหนี้นอกระบบถูกปลดล็อก
- เมื่อย้ายไป Bronx จะได้เฮโรอีน 2 ชิ้นโดยอัตโนมัติ จึงเกิด ลูปทำกำไรไม่สิ้นสุด ได้
- สูตรคำนวณคลังสินค้า
(T-M-N-O-P-Q-R)→K ใช้ค่าตำแหน่งปะปนเข้าไป ทำให้ คำนวณพื้นที่เก็บของผิดพลาด
-
ตัวอย่างการนำไปใช้โกงหลัก ๆ
- เข้าถึงธนาคาร/เจ้าหนี้นอกระบบได้ไม่จำกัด: อาศัย N=0 เพื่อข้ามข้อจำกัดด้านพื้นที่
- สร้างเฮโรอีนได้ไม่สิ้นสุด: ย้ายไป Bronx เพื่อรับ 2 ชิ้นอัตโนมัติแล้วขายวนซ้ำ
- สินค้าคงคลังไม่สอดคล้องกัน: การเขียนทับค่าตำแหน่งทำให้เกินความจุของเสื้อโค้ตยาวได้
ที่มาของโค้ดต้นฉบับและบริบททางประวัติศาสตร์
- gammalogic ถามว่าโค้ดนี้อิงจากโค้ด IBM BASIC ต้นฉบับหรือไม่ และ mattmanning ตอบว่า “เวอร์ชัน TI อ้างอิงจากเกม IBM แต่ไม่สามารถคอมไพล์ไปแพลตฟอร์มอื่นได้ และเหมาะสำหรับใช้อ้างอิงกติกาและตรรกะของเกม”
- เขาอธิบายว่าเจอโค้ดนี้บนอินเทอร์เน็ตและเพียงจัดรูปแบบข้อความให้เรียบร้อย
- ผู้สร้างต้นฉบับ John Dell ได้แรงบันดาลใจจากเกม Taipan บน TRS-80 เพื่อสร้าง Drugwars
การขยายตัวของชุมชนและกิจกรรมต่อเนื่อง
- ผู้ใช้บางส่วนรายงานปัญหาการรันบน TI-84+ แต่ผู้ใช้อีกส่วนยืนยันว่า ทำงานได้ปกติบนอีมูเลเตอร์ TI-83+ และ TI-84+
- มีการแชร์เคล็ดลับว่าต้องเพิ่ม
:: ที่บรรทัดแรกของโค้ดเพื่อให้ MirageOS มองเห็น
- นอกจากนี้ยังสามารถป้อนโค้ดบนเครื่องคิดเลขโดยตรงผ่าน
prgm -> new แล้วรันได้
- ผู้ใช้ DaSovietPotato เผยแพร่เวอร์ชันที่แก้บั๊กความเข้ากันได้กับ TI-84 ไว้ในคลังแยกต่างหาก
- gammalogic แชร์แผนรีเมคด้วย C/SDL แล้วพอร์ตไปยังคอนโซลที่ใช้ Z80 (เช่น Master System, NES)
- เดโม C/SDL ระยะแรกมีอินเทอร์เฟซตามความละเอียดของ NES และทำฟังก์ชันสลับเมือง/สลับชนิดยาได้แล้ว
- มีการกล่าวถึงแผนขยายต่อเป็นเวอร์ชัน “Drugwars 2.0” ในอนาคต
- ผู้ใช้บางรายกล่าวถึงความคิดถึงสมัยมัธยมที่เคยเล่นเกมนี้ และแชร์ความพยายามจะติดตั้งใหม่อีกครั้งด้วย สายสำหรับ TI-83
- ชุมชนแนะนำให้ลองพอร์ตเองผ่านการวิเคราะห์โค้ดและการเรียนรู้ BASIC พร้อมแนะนำให้อ้างอิงคู่มือ TI-83
- มีการเพิ่มคอมเมนต์อย่างต่อเนื่องจนถึงช่วงปี 2024~2026 และเกิดความพยายามขยายไปยังหลายแพลตฟอร์ม เช่น TI-84 CE, Pico-8, C#
- ผู้ใช้บางรายขอและแชร์ไฟล์
.8xp กันผ่านอีเมล
- ภายในชุมชน เรื่องนี้กำลังพัฒนาไปเป็น โครงการฟื้นฟูและปรับปรุงเกมเครื่องคิดเลขคลาสสิก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
TI-83 Basic เป็นภาษาโปรแกรมแรกที่ผมรู้สึกว่า เข้าใจอย่างถ่องแท้จริงๆ
ตอนปีหนึ่งมหาวิทยาลัย ผมมักเขียนโค้ดด้วย TI-Basic แล้วค่อยแปลเป็น C++ เกม Drugwars กับ Bowling ตอนนั้นน่าประทับใจมาก
หลังจากนั้นพอได้ค้นพบ แอสเซมบลี z80 มันก็เหมือนเวทมนตร์ ผมยังจำได้ว่าตอนไปห้องแล็บมหาวิทยาลัยของพ่อ (ที่มีอินเทอร์เน็ต T1 อยู่ 2 เส้น) แล้วดาวน์โหลดเกมแอสเซมบลีที่เพิ่งออกใหม่ Bill Nagel's Turbo Breakout, Snake, AShell, Penguins และ Mario แบบเกรย์สเกลนั้นสุดยอดมาก แต่เกมที่ดูสมบูรณ์และเล่นซ้ำได้ดีที่สุดสำหรับผมคือ Sqrxz กับ ZTetris บน TI-86
มีอยู่ครั้งหนึ่งผมถึงกับพิมพ์ซอร์สแอสเซมบลี z80 ของเกมออกมา พกหนาเป็นคืบเพื่อพยายามทำความเข้าใจมัน
อีกอย่างที่แปลกดีคือผมสนุกกับการพิมพ์ โค้ดเลขฐานสิบหก แบบสุ่มแล้วลองรัน บางทีก็ทำเครื่องคิดเลขพัง แต่พอถอดแบตแล้วใส่ใหม่มันก็กลับมาใช้ได้
มีใครจำสงครามเว็บ TI ได้ไหม? TI Files (ต่อมาคือ TI Philes) เคยบอกว่า “เจ๋งกว่า ticalc.org มาก” แต่สุดท้ายสิ่งที่ยังอยู่มาจนถึงตอนนี้กลับเป็น ticalc.org
เกมนี้มีความหมายกับผมมากจริงๆ ตอนมัธยมปลายผม ติด มันหนักมาก และประสบการณ์นั้นก็ยังอยู่กับชีวิตผมมาจนถึงตอนนี้
Drugwars เป็นแรงบันดาลใจโดยตรงให้กับโปรเจกต์ที่ผมรักอย่าง Farmhand
ดีใจมากที่ได้เห็นมันอีกครั้งแบบนี้
ตอนนี้พอเข้าสู่ยุค AI แล้วทุกคนดูเหมือนจะทำอะไรไม่ได้ถ้าไม่มีคอมพิวเตอร์เครื่องเล็กๆ ก็ตลกดีที่รู้สึกเหมือนได้รับ การพิสูจน์ความถูกต้อง ไปในตัว
“เกร็ดน่าสนใจ” ของผมคือ ผมเริ่มเขียนโปรแกรมจากการ อ่านคู่มือ TI-83+
ตลอดชั้น ม.3 ผมใช้ TI-BASIC กับฟังก์ชันกราฟสร้าง Street Fighter เวอร์ชันตัวละครไม้ขีด
หน้าจอมันแสดงได้แค่ 8 บรรทัด สุดท้ายผมเลยต้องเขียนโค้ดลงกระดาษด้วย
พอมาย้อนคิดตอนนี้ก็ยังทึ่งว่าผมทำให้คนสองคนเล่นบนเครื่องคิดเลขเครื่องเดียวกันได้ด้วย GOTO และ LABEL
การปรับแต่งที่ผมชอบที่สุดคือเปลี่ยนหัวจากวงกลมเป็น หกเหลี่ยม — เพราะวาดแค่ 6 เส้นก็เลยเร็วขึ้นมาก
พออยู่ ม.3 ผมเขียนโปรแกรมที่ช่วยแก้โจทย์พีชคณิตแบบทีละขั้น แล้วดันเจอ บั๊กระดับ P1 ระหว่างสอบ
ตอนทำการบ้านมันทำงานสมบูรณ์แบบ แต่พอเป็นโจทย์ในข้อสอบกลับพัง สุดท้ายผมเลยใช้เวลากับการดีบักมากกว่าทำข้อสอบ
มองย้อนกลับไป มันเหมือนเป็นคาบเรียนเรื่อง เคสขอบ มากกว่าคณิตศาสตร์
ตอนนี้ผมทำงานพัฒนาแอปมือถือ และชอบเสมอที่สามารถพกสิ่งที่ตัวเองสร้างไว้ในกระเป๋าได้
วิดีโอที่เกี่ยวข้อง
ผมใช้หมดทั้ง 2.4KB และทุกช่องตัวแปรที่มี
ต้นกำเนิดของเกมนี้เริ่มตั้งแต่ DOS ในปี 1984
Drug Wars (video game) - Wikipedia
คลังข้อมูลที่เกี่ยวข้อง
ตอนอยู่ ม.3 ช่วงปลายคริสต์ศตวรรษที่ 20 ผมมีเพื่อนคนหนึ่งที่เป็นศิลปินมีพรสวรรค์มาก ถึงขั้นทำ ภาพพิกเซลโป๊ บน TI-82 ได้
เขาทำให้แต่ละฉากวนแค่สองเฟรม แต่สร้างการเคลื่อนไหวที่สมจริงอย่างน่าทึ่ง
เกมนี้รันได้บน HP 48 series ด้วย
Drugwars สำหรับ HP 48
RPN จงเจริญ
ประสบการณ์เขียนโปรแกรมครั้งแรกของผมคือบน TI-83
ผมยังจำได้ชัดเลยว่าตอนเรียนผมให้เพื่อนๆ เล่น เกมผจญภัยแบบเลือกเส้นทาง
ผมเล่นเกมนี้บน TI-83+ บ่อยมากจริงๆ
เครื่องคิดเลขนั้นทำให้ผมเรียนรู้การเขียนโปรแกรม และผมก็เขียนโปรแกรมคำนวณสำหรับคณิต/วิทย์กับเกมง่ายๆ ด้วย TI-BASIC
ตอนนี้จำไวยากรณ์แทบไม่ได้แล้ว แต่ตอนนั้นผมคล่องพอตัวเลย
ตอนเห็นในโค้ดมีอะไรแบบ “If Zù500” ผมก็สงสัยว่าทำไมถึงใช้ อักขระ ù
ตามที่ ChatGPT บอก ใน TI-BASIC ค่าไบต์ของ ≤ ตรงกับ ù(0xF9) ใน ANSI/Windows-1252 ดังนั้นมันเป็นปัญหาเรื่อง encoding
โอ้โห ความทรงจำถาโถม มาก
ตอน ม.3 ผมยังจำได้ว่าครูวิทยาศาสตร์ถามว่าผมกำลังทำอะไรกับเครื่องคิดเลข และผมรีบลบเกมทิ้งทันทีเพราะกลัวจะโดนพักการเรียน
แต่ผมรอดมาได้ด้วยการโชว์ว่ากำลังทำเกมแนว Wing Commander Privateer อยู่แทน