Team Fortress 2

Team Fortress 2

Not enough ratings
การสร้าง Mission ใน MvM ด้วย Notepad++ เบื้องต้น (Thai Commentary)(POP File Part 1)
By ➶★Lyney★➷
อันนี้เป็นการสร้างด่านใน MvM ด้วย Notepad หรือ Notepad++ เพราะการสร้างด่านใน old.mvm.tf อาจจะมีบัคค่อนข้างเยอะ (โดยเฉพาะ Map Mannhattan)
และการ load save ใน old.mvm.tf จะค่อนข้างมีปัญหา แต่ถ้าเราเขียน POP File เองจะสามารถแก้ไขปัญหาตรงนี้ได้
และใน Notepad เองจะสามารถ custom robot icon เองได้ด้วย
   
Award
Favorite
Favorited
Unfavorite
POP File
pop file เป็นไฟล์ที่ใช้สร้างด่านใน gamemode MvM
เริ่มต้น
เราจะเขียน
#base robot_giant.pop
#base robot_standard.pop
เพื่อเรียกตัว Templates ของ bot



// เป็นการ Comment เฉยๆ จะไม่มีผลกับระบบ ซึ่งสามารถใช้อธิบายว่าเราทำอะไรหรือใช้ Cancel Code เมื่อเรายังไม่ต้องการลบ

เราสามารถไปดูไฟล์ 3 ไฟล์นี้ได้เพื่อเลือก bot ที่เราต้องการ
  • robot_standard.pop
  • robot_giant.pop
  • robot_gatebot.pop
https://github.com/sigsegv-mvm/population
WaveSchedule
ส่วนนี้ในเบี้องต้นจะมี
  • StartingCurrency - จำนวนเงินเริ่มต้น ($)
  • RespawnWaveTime - เวลาเกิดของเราหลังจากตาย (วินาที)
  • CanBotsAttackWhileInSpawnRoom - ให้ bot โจมตีเราได้ในจุดเกิดของมัน (No/Yes)
  • Advanced 1 - จะนับว่าด่านนี้เป็นระดับ Advanced ซึ่งจะมีผลกับการทำ Achievement
  • EventPopfile Halloween - reskin หุ่นยนต์เฉยๆ
  • AddSentryBusterWhenDamageDealtExceeds - เมื่อ Sentry Gun ทำ Damage ตามกำหนดแล้วจะทำให้ Sentry Buster เกิด (Default: 3000)
  • AddSentryBusterWhenKillCountExceeds - เมื่อ Sentry Gun ฆ่าครบตามจำนวนที่ตั้งไว้จะทำให้ Sentry Buster เกิด (Default: 15)
  • Mission - ใช้กับ Support จำพวก Sniper/Spy/Enginner/Sentry Buster
  • Templates - เราสามารถออกแบบ bot เองได้ในนี้
  • Wave - ตัวหลักในด่านรวมถึง Tank และ Support อื่นๆ

*****หมายเหตุ*****
RespawnWaveTime ไม่ใช่ว่าตั้ง 5 แล้วเวลาจะเกิด 5 วินาที
เวลาจะนับตามสูตร ( X * R ) + 5
X คือ ค่าเวลาเกิด
วิธีนับจะนับบวกขึ้นไปเรื่อยๆ โดย Wave 1 ค่า X จะเป็น 2, Wave 2 ค่า X จะเพิ่มอีก 2 ซึ่งจะเท่ากับ 4, Wave ต่อไปจะบวกไปเรื่อยๆ จนถึงค่าที่เราตั้งไว้ใน RespawnWaveTime
R คือ ค่าตัวเลขที่สุ่มระหว่างเลข 1 ถึง 2 (หมายความว่าเวลาเกิดจะสุ่ม)
ส่วนเลข 5 เป็นเวลาระหว่าง deathcam หลังจากเราโดนฆ่า

ตัวอย่าง RespawnWaveTime ตั้งไว้ 4
Wave
เวลาเกิดต่ำสุด
เวลาเกิดสูงสุด
เวลาเกิด (ไม่รวม deathcam)
เวลาเกิด (นับรวม deathcam 5 วินาที)
1
2(1) + 5 = 7
2(2) + 5 = 9
2-4 วินาที
7-9 วินาที
2 ขึ้นไป
4(1) + 5 = 9
4(2) + 5 = 13
4-8 วินาที
9-13 วินาที

ตัวอย่าง RespawnWaveTime ตั้งไว้ 7
Wave
เวลาเกิดต่ำสุด
เวลาเกิดสูงสุด
เวลาเกิด (ไม่รวม deathcam)
เวลาเกิด (นับรวม deathcam 5 วินาที)
1
2(1) + 5 = 7
2(2) + 5 = 9
2-4 วินาที
7-9 วินาที
2
4(1) + 5 = 9
4(2) + 5 = 13
4-8 วินาที
9-13 วินาที
3
6(1) + 5 = 11
6(2) + 5 = 17
6-12 วินาที
11-17 วินาที
4 ขึ้นไป
7(1) + 5 = 12
7(2) + 5 = 19
7-14 วินาที
12-19 วินาที



จากในรูปจะหมายความว่าเงินเริ่มต้นมี 1100
RespawnWaveTime ตั้งไว้ 4 (เวลาเกิดสูงสุด 11 วินาที)
ถ้า bot ยังอยู่ในจุดเกิดของมันเอง bot จะไม่โจมตีได้จนกว่าจะออกจากจุดเกิดของมันเอง
ส่วนกรณี Sentry Buster ถ้าไม่ได้ตั้งไว้จะนับจากค่า Default ซึ่งจะเกิดก็ต่อเมื่อ Sentry Gun ฆ่าครบ 15 ตัวหรือทำ Damage ครบ 3000
Mission
ส่วนนี้จะเป็นส่วนที่ใช้สร้าง Support จำพวก Sniper Spy และ Sentry Buster ซึ่งจะไม่มีผลกับ Subwave ในส่วนของ Wave

ในวงเล็บจะมี Function ดังนี้
  • Objective - เป็นการบอกว่าให้ bot ทำหน้าที่อะไร (DestroySentries, Spy, Sniper, Engineer)
  • InitialCooldown - เวลาเริ่มต้นที่ bot ชุดแรกเกิด (วินาที)
  • Where - จุดเกิดของ bot
  • BeginAtWave - wave ที่เริ่มมี
  • RunForThisManyWaves - จะใช้กี่ wave
  • CooldownTime - เวลาเกิดในครั้งถัดไปของ bot หลังจาก bot ชุดแรกตายแล้ว (วินาที)
  • DesiredCount - จำนวน bot

ตัวอย่างการใช้ BeginAtWave กับ RunForThisManyWaves
  • BeginAtWave 3 RunForThisManyWaves 2 จะหมายความว่า bot ชุดนี้จะมี wave 3 กับ 4
  • BeginAtWave 2 RunForThisManyWaves 4 จะหมายความว่า bot ชุดนี้จะมี wave 2 ถึง 5 (2, 3, 4, 5)



ในรูปนี้หมายถึง
ตัว bot เป็น spy ทำหน้าที่เป็น spy bot ความเก่งระดับของ bot เป็น easy เริ่มในวินาทีที่ 10 และชุดถัดไปจะเกิดหลังจากชุดแรกตาย 60 วินาที จุดเกิด spawnbot_mission_spy อยู่ในเฉพาะ wave 1
Wave
ในส่วนของ Wave จะมี StartWaveOutput, DoneOutput กับ WaveSpawns



  • StartWaveOutput - เป็นการใช้เพื่อ Trigger relay ตอนเริ่ม wave หลังจาก F4
  • DoneOutput - เป็นการใช้เพื่อ Trigger relay ตอนจบ wave
  • InitWaveOutput - เป็นการใช้เพื่อ Trigger relay ตอนที่ wave โหลดมาแล้ว
ซึ่งไม่ว่าจะเป็นอันไหน เราจะต้องไปดูว่าแต่ละ map มีชื่อ relay ว่าอะไร
InitWaveOutput ใช้กับ map Mannhattan (map ของ Ofiicial)
DoneOutput ใช้กับ 5 map ที่เหลือ (Decoy, Coaltown, Mannworks, Bigrock, Rottenburg)(map ของ Ofiicial)

Wavespawns
Wavespawns เป็นส่วนย่อยต่อจาก Wave ซึ่งไว้ spawn bot
  • Name - คือชื่อ จะมีผลในการใช้ทำ Subwave
  • WaitForAllDead - คือ bot ชุดเก่าตายหมดแล้ว bot ชุดใหม่จะเริ่มเกิด
  • WaitForAllSpawned - คือ bot ชุดเก่าเกิดครบแล้ว bot ชุดใหม่จะเริ่มเกิด (อันนี้ pacing จะมีความไวกว่า
    WaitForAllDead)
  • Where - คือจุดเกิดของ bot ซึ่งตาม map ต่างๆ จะมีชื่อจุดเกิดไม่เหมือนกัน จะต้องไปดูว่าชื่อจุดเกิดของ map นั้นๆ มีชื่อว่าอะไร
  • Totalcount - คือจำนวน bot ทั้งหมด
  • Maxactive - คือจำนวน bot ที่สามารถมีได้มากสุด ณ ขณะนั้น (bot สามารถมีอยู่ในห้องได้มากสุด 22 ตัวโดยไม่นับรวม Tank และ Sentrybuster นับเป็น bot ด้วย (ถ้าไม่รวม Sentrybuster จะมีได้มากสุด 21 ตัว))
  • Spawncount - คือจำนวนที่ bot เกิดในแต่ละครั้ง
  • WaitBeforeStarting - เวลาก่อนที่ bot เกิดในรอบแรก (วินาที)
  • WaitBetweenSpawns - เวลาที่ bot เกิดในชุดถัดไป (วินาที)
  • Totalcurrency - จำนวนเงินที่ได้ ($)
***WaitForAllDead กับ WaitForAllSpawned ไม่สามารถใส่พร้อมกันได้ และสามารถใส่ได้แค่อันเดียว***
***Where สามารใช้หลายๆที่ได้ ซึ่ง Map Mannhattan จำเป็นต้องใช้หลายๆที่เพราะมี Gatebot ไป Cap ประตู จึงทำให้ bot เปลี่ยนจุดเกิด***
เช่น
Where spawnbot
Where spawnbot_invasion

ตัวอย่าง Wave 1 ใน Map Decoy



รูปภาพแรกไม่อยู่ใน Wave แต่อยู่ใน Mission



Subwave 1a
จุดเกิด spawnbot
มี Scout bot ทั้งหมด 20 ตัว
มีได้สูงสุด 8 ตัว
เกิดชุดละ 4 ตัว
bot ชุดแรกเกิดทันที
bot ชุดต่อไปเกิด 6 วินาทีต่อ 1 ชุด
จำนวนเงินทั้งหมด 80$ (เงินดรอปตัวละ 4$)



Subwave 1a
จุดเกิด spawnbot
มี Soldier bot ทั้งหมด 12 ตัว
มีได้สูงสุด 8 ตัว
เกิดชุดละ 4 ตัว
bot ชุดแรกเกิดทันที
bot ชุดต่อไปเกิด 12 วินาทีต่อ 1 ชุด
จำนวนเงินทั้งหมด 120$ (เงินดรอปตัวละ 10$)



Subwave 1b
เกิดหลังจาก bot ใน Subwave 1a ตายหมด
จุดเกิด spawnbot
มี Demoman bot ทั้งหมด 6 ตัว
มีได้สูงสุด 4 ตัว
เกิดชุดละ 2 ตัว
bot ชุดแรกเกิดทันที
bot ชุดต่อไปเกิด 5 วินาทีต่อ 1 ชุด
จำนวนเงินทั้งหมด 300$ (เงินดรอปตัวละ 50$)



Subwave 1b-Scout
เกิดหลังจาก bot ใน Subwave 1a ตายหมด
จุดเกิด spawnbot_invasion (ชั้นบนของ map decoy)
มี Scout bot ทั้งหมด 12 ตัว
มีได้สูงสุด 8 ตัว
เกิดชุดละ 4 ตัว
bot ชุดแรกเกิดทันที
bot ชุดต่อไปเกิด 4 วินาทีต่อ 1 ชุด
จำนวนเงินทั้งหมด 100$ (มี 8 ตัวที่เงินดรอปตัวละ 8$ และมีอีก 4 ตัวที่เงินดรอปตัวละ 9$)



Subwave 1b-last-giant
เกิดหลังจาก bot ใน Subwave 1b เกิดครบ
มี Soldier ยักษ์ ทั้งหมด 1 ตัว
มีได้สูงสุด 1 ตัว
เกิดชุดละ 1 ตัว
bot ชุดแรกเกิดทันที
bot ชุดต่อไปเกิด 5 วินาทีต่อ 1 ชุด (อันนี้ไม่มีผลอะไร เพราะมีแค่ชุดเดียว)
จำนวนเงินทั้งหมด 200$ (เงินดรอปตัวละ 200$)

ทั้ง 5 รูปนี้เป็นการแสดง Subwave ทั้งหมด
โดย Subwave แรกจะต้องไม่มี WaitForAllDead หรือ WaitForAllSpawned
ตามตัวอย่าง
Subwave 1a จะเกิดเป็นอันดับแรก โดยจะมี Scout 20 ตัวกับ Soldier 12 ตัว
Subwave 1b และ 1b-Scout จะเกิดก็ต่อเมื่อ bot ใน Subwave 1a ตายหมด
Subwave 1b-last-giant จะเกิดก็ต่อเมื่อ bot ใน Subwave 1b เท่านั้นที่เกิดครบ (จะไม่มี Subwave 1b-Scout มาเกี่ยวข้อง)
หน้าตา Wave Progress เป็นประมาณนี้



หน้าตา Wave จะได้เป็นแบบนี้



Quiz #1: ถ้าผมเพิ่ม Subwave 1c โดยที่เป็นแบบนี้ (ชื่อ bot คือ Giant Detonator Pyro) bot ตัวนี้มันจะเริ่มเกิดตอนไหน และเกิดหลังจากนั้นกี่วินาที (WaitForAllSpawned "1b")
WaveSpawn { Name "1c" WaitForAllSpawned "1b" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 20 WaitBetweenSpawns 0 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Pyro_Flare_Spammer Name "Giant Detonator Pyro" } }
TFBot
TFBot
เป็นตัวที่ใช้เรียกชนิด bot
  • Template - ใช้เรียก template bot สามารถดูได้จากไฟล์ robot_giant.pop, robot_standard.pop และ robot_gatebot.pop
  • Class - บอกชนิดตัวละคร
    • Scout
    • Soldier
    • Pyro
    • Demoman
    • Heavyweapons
    • Engineer
    • Medic
    • Sniper
    • Spy
    ตัวอย่าง Class Soldier
  • Skill - ความเก่งของ bot
    • Easy
    • Normal
    • Hard
    • Expert
    ตัวอย่าง Skill Easy
    Guide อธิบาย Skill bot ต่างๆ
    https://steamcommunity.com/sharedfiles/filedetails/?id=572409016
  • Name - ชื่อ bot
    ตัวอย่าง Name "Ignited Scout"
  • ClassIcon - ใช้แสดง Icon ของ bot
  • Health - เลือดของ bot
    ตัวอย่าง Health 3800
    ถ้ากำหนด 3800 จะเท่ากับว่าเลือด bot ตัวนั้นมี 3800)
  • Scale - ขนาดตัว bot (default คือ 1.0)
  • WeaponRestrictions - อาวุธที่ bot ใช้
    • PrimaryOnly
    • SecondaryOnly
    • MeleeOnly
    ตัวอย่าง WeaponRestrictions MeleeOnly
    หมายความว่า bot จะใช้อาวุธระยะประชิดโจมตีเท่านั้น
  • Attributes -
    • RemoveOnDeath
    • Aggressive
    • SuppressFire
    • DisableDodge
    • BecomeSpectatorOnDeath
    • RetainBuildings
    • SpawnWithFullCharge
    • AlwaysCrit
    • IgnoreEnemies
    • HoldFireUntilFullReload
    • AlwaysFireWeapon
    • TeleportToHint
    • MiniBoss
    • UseBossHealthBar
    • IgnoreFlag
    • AutoJump
    • AirChargeOnly
    • VaccinatorBullets
    • VaccinatorBlast
    • VaccinatorFire
    • BulletImmune
    • BlastImmune
    • FireImmune
    • Parachute
    • ProjectileShield
  • Tag - ไว้ Tag bot เวลาจะให้ bot เดินไปอีกทางหรือ Tag ว่าเป็น giant
    ตัวอย่าง
    • Tag nav_prefer_flank_right คือจะทำให้ bot เดินไปด้านขวา
    • Tag bot_giant คือทำให้ bot ไม่โดน stun หลังจาก cap ประตูใน map mannhattan ได้
  • Item - ให้ bot สวมใส่ Item นั้น สามารถดูได้จาก items_game.txt (อยู่ใน D:\Steam\steamapps\common\Team Fortress 2\tf\scripts\items)
    ตัวอย่าง Item "The Huntsman"
    ***หมายเหตุ***
    D: คือ Drive ที่เราติดตั้งเกมนี้ ถ้าเราติดตั้งไว้ใน Drive C ก็ต้องไปดูว่าเราติดตั้งไว้ไหน
  • ItemAttributes และ CharacterAttributes - สามารถดูได้จาก 2 แหล่งนี้
    https://wiki.teamfortress.com/wiki/List_of_item_attributes
    https://tf2b.com/attriblist.php?gid=440
    value จะมี additive, percentage, inverted_percentage
    • additive - เป็นชนิดที่ถ้าเราใส่ค่า 1 หมายความว่าเป็น 1 หรือจะมี attribute แบบ 1 กับ 0 ซึ่ง 1 คือ True, 0 คือ False
      ตัวอย่าง
      • "clip size upgrade atomic" 9 หมายความว่า +9 clip size
      • "heal on kill" 8000 หมายความว่า ถ้า bot ฆ่าเราได้ bot จะฟื้นเลือด 8000
      • "no self blast dmg" 1 หมายความว่า bot จะไม่โดน damage จากที่ตัวเองทำ เช่น Rocket, Grenade หรืออื่นๆที่สามารถทำ damage จากตัวเองได้
    • percentage - เป็นชนิดที่ถ้าเราใส่ค่า 0.01 จะเท่ากับ 1% , 1 จะเท่ากับ 100%
      ตัวอย่าง
      • "damage bonus" 1.6 หมายความว่า damage ของ bot +60%
      • "damage bonus" 0.2 หมายความว่า damage ของ bot -80% (เท่ากับว่าทำ damage แค่ 20%)
    • inverted_percentage - เป็นชนิดที่ถ้าเราใส่ค่า 1 จะเท่ากับ 100% แต่ถ้า ใส่ 0.01 จะเท่ากับ 99%,
      • "fire rate bonus" 0.3 หมายความว่า ความเร็วในการยิง +70% (ยิงเร็วขึ้น)
      • "faster reload rate" 1.4 หมายความว่า ความเร็วในการ Reload -40% (Reload ช้าลง)
Squad
เราจะใช้ Squad เพื่อให้ bot เดินเกาะกันเป็นกลุ่มหรือใช้เพื่อให้ Medic Heal bot โดยตัวหัวหน้า Squad จะอยู่เป็นตัวบนสุด ถ้า bot ตัวหัวหน้า Squad ตาย bot ที่เหลือจะแตกกันจากกลุ่ม (อารมณ์เหมือนวงแตก)
ตัวอย่างการใช้



ซึ่งจากในรูปนี้มี Giant Pyro 1 ตัวกับ Uber Medic 3 ตัว รวมทั้งหมดเป็น 4 ตัว
เวลาใช้ TotalCount, Maxactive, SpawnCount จะต้องหารให้ลงตัวที่เท่ากับจำนวนที่มี
สังเกตได้จากว่าผมใช้ TotalCount 8, Maxactive 4, SpawnCount 4 ซึ่งหมายความว่าเลข 4 จะเท่ากับ 1 ชุด, เลข 8 จะเท่ากับ 2 ชุด

ShouldPreservedSquad 1
ตัวอย่างการใช้



ShouldPreservedSquad จะแตกต่างจากแบบธรรมดาตรงที่ถ้าตัวหัวหน้า Squad ตาย bot จะไม่แตกกันจากกลุ่ม
RandomChoice
เป็นการสุ่ม bot ซึ่งเขียนคล้าย Squad
เหมาะกับการใช้สุ่ม bot สำหรับกรณีที่ความเก่งไม่ต่างกันมาก



จากตัวอย่างนี้มีการสุ่ม
  • Demoman Skill Normal โอกาส 2/5 (40%)
  • Soldier Skill Normal โอกาส 2/5 (40%)
  • Soldier Skill Hard โอกาส 1/5 (20%)

โดยเฉลี่ยจะได้ Demoman 12 ตัว, Soldier Normal AI 12 ตัว กับ Soldier Hard AI 6 ตัว
เนื่องจากเป็นการสุ่ม เวลากลับมาเล่นอีกรอบอาจจะได้ไม่เหมือนเดิม
เช่น
  • เล่นรอบแรกอาจจะได้ Demoman 10 ตัว, Soldier Normal AI 15 ตัว กับ Soldier Hard AI 5 ตัว
  • เล่นรอบสองอาจจะได้ Demoman 13 ตัว, Soldier Normal AI 9 ตัว กับ Soldier Hard AI 8 ตัว
  • เล่นรอบสามอาจจะได้ Demoman 17 ตัว, Soldier Normal AI 13 ตัว โดยที่ไม่มี Soldier Hard AI ปรากฏซักตัวเลยก็ได้
Tank
คือรถถัง จะไม่ถูกนับว่าเป็น bot
  • Health - เลือดรถถัง
  • Speed - ความเร็วในการวิ่งของรถถัง (Default: 75)
  • Name - ชื่อ
  • StartingPathTrackNode - คือจุดเริ่มของรถถัง ซึ่งตาม map ต่างๆ จะมีชื่อจุดเริ่มไม่เหมือนกัน จะต้องไปดูว่าชื่อจุดเริ่มของ map นั้นๆ มีชื่อว่าอะไร
  • Skin - Skin รถถังสำหรับคันสุดท้ายในด่านสุดท้าย (0/1)(1 ตือใช้ ถ้าไม่ใช้ก็ไม่ต้องใส่ก็ได้)
  • OnKilledOutput - คือ relay ที่ทำหลังจากรถถังตาย
  • OnBombDroppedOutput - คือ relay ที่ทำหลังจากรถถังทิ้งระเบิดลงฐาน



ตัวอย่างในรูปคือ
รถถัง spawn 1 คัน ดรอปเงิน 400$ มีเลือด 15k ความเร็วปกติ เริ่ม path ชื่อ boss_path_a1
ชื่อ spawnbot ตาม map ต่างๆ
Map Decoy
  • spawnbot
  • spawnbot_invasion
  • spawnbot_left
  • spawnbot_right
  • spawnbot_mission_sniper
  • spawnbot_mission_spy
  • spawnbot_single_flag

Map Coaltown
  • spawnbot
  • spawnbot_giant
  • spawnbot_invasion
  • spawnbot_mission_sniper
  • spawnbot_mission_spy

Map Mannworks
  • spawnbot
  • spawnbot_left
  • spawnbot_right
  • spawnbot_lower
  • spawnbot_mission_sniper
  • spawnbot_mission_spy

Map Bigrock
  • spawnbot
  • spawnbot_giant
  • spawnbot_mission_sniper
  • spawnbot_mission_spy

Map Mannhattan
  • spawnbot
  • spawnbot_main0
  • spawnbot_main1
  • spawnbot_main2
  • spawnbot_main0_squad
  • spawnbot_main1_slow
  • spawnbot_main2_giants
  • spawnbot_upper0
  • spawnbot_upper1
  • spawnbot_upper2
  • spawnbot_mission_sniper0
  • spawnbot_mission_sniper1
  • spawnbot_mission_sniper2
  • spawnbot_mission_sniper3
  • spawnbot_mission_spy

Map Rottenburg
  • spawnbot
  • flankers
  • spawnbot_chief
  • spawnbot_mission_sentry_buster
  • spawnbot_mission_sniper
  • spawnbot_mission_spy
ชื่อ nav tag ตาม map ต่างๆ
Map Decoy
  • nav_prefer_flank_left
  • nav_prefer_flank_right

Map Coaltown
  • nav_prefer_flank_left
  • nav_prefer_flank_right

Map Mannworks
  • flank_left
  • flank_right

Map Bigrock
  • nav_prefer_flank_left
  • nav_prefer_flank_right

Map Mannhattan
  • nav_prefer_gate1_flank

Map Rottenburg
  • bombpath_left_prefer_flankers
  • bombpath_right_prefer_flankers
  • flankers
  • sniper
ชื่อ tank path ตาม map ต่างๆ
Map Decoy
  • boss_path_1

Map Coaltown
  • boss_path_1

Map Mannworks
  • boss_path_1
  • boss_path2_1

Map Bigrock
  • boss_path_1

Map Mannhattan
mannhattan ไม่มีรถถัง

Map Rottenburg
  • tank_path_a_10
  • tank_path_b_10
Templates
ส่วน Templates เป็นการใช้เพื่อสร้าง template bot (ตรง template จะมี s อยู่ข้างหลัง)

วิธีสร้างคือจะเหมือนการสร้างใน TFBot
แต่เราจะเปลี่ยน TFBot เป็นชื่อ template ของเราเอง



จากในรูปคือเรียก template จาก scout bot ที่ใช้ sandman แต่ติดคริและมีการตั้งชื่อใหม่
template นี้ชื่อ T_TFBot_Scout_Sandman_AlwaysCrit

เวลาจะเรียก template เราสามารถใช้ลงใน Wavespawn ได้เลย



อันนี้เป็นตัวอย่าง templates จาก mannwork ระดับ expert



เป็น Deflector Heavy
ตัวอย่าง 2 Wave ที่ผมสร้างใน Map Decoy
อันนี้ผมสร้างเอง สามารถลอง copy ไปใช้เพื่อศึกษาดูได้
อันนี้สำหรับ map decoy
// Mission designer: Lyney #base robot_giant.pop #base robot_standard.pop WaveSchedule { StartingCurrency 1100 RespawnWaveTime 4 CanBotsAttackWhileInSpawnRoom No // Advanced 1 // EventPopfile Halloween Mission { Objective DestroySentries InitialCooldown 10 Where spawnbot BeginAtWave 1 RunForThisManyWaves 8 CooldownTime 40 DesiredCount 1 TFBot { Template T_TFBot_SentryBuster Attributes DisableDodge } } Mission { Objective Spy InitialCooldown 10 Where spawnbot_mission_spy BeginAtWave 1 RunForThisManyWaves 1 CooldownTime 60 DesiredCount 1 TFBot { Class Spy Skill Easy } } Mission { Objective Sniper InitialCooldown 30 Where spawnbot_mission_sniper BeginAtWave 2 RunForThisManyWaves 1 CooldownTime 40 DesiredCount 2 TFBot { Template T_TFBot_Sniper Tag flanker } } Templates { T_TFBot_Scout_Sandman_AlwaysCrit { Template T_TFBot_Scout_Sandman Attributes AlwaysCrit Name "Crit Sandman Scout" } } Templates { T_TFBot_Heavyweapons_Deflector { Class Heavyweapons Name "Deflector Heavy" ClassIcon heavy_deflector Skill Hard Item "The U-clank-a" Item "Deflector" WeaponRestrictions PrimaryOnly MaxVisionRange 1200 ItemAttributes { ItemName "Deflector" "attack projectiles" 1 } } } //WAVE 1 (800$) Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "1a" Where spawnbot TotalCount 20 MaxActive 8 SpawnCount 4 WaitBeforeStarting 0 WaitBetweenSpawns 6 TotalCurrency 80 TFBot { Class Scout Skill Easy } } WaveSpawn { Name "1a" Where spawnbot TotalCount 12 MaxActive 8 SpawnCount 4 WaitBeforeStarting 0 WaitBetweenSpawns 12 TotalCurrency 120 TFBot { Class Soldier Skill Normal } } WaveSpawn { Name "1b" WaitForAllDead "1a" Where spawnbot TotalCount 6 MaxActive 4 SpawnCount 2 WaitBeforeStarting 0 WaitBetweenSpawns 5 TotalCurrency 300 TFBot { Class Demoman Skill Normal } } WaveSpawn { Name "1b-Scout" WaitForAllDead "1a" Where spawnbot_invasion TotalCount 12 MaxActive 8 SpawnCount 4 WaitBeforeStarting 0 WaitBetweenSpawns 4 TotalCurrency 100 TFBot { Class Scout Skill Easy } } WaveSpawn { Name "1b-last-giant" WaitForAllSpawned "1b" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 0 WaitBetweenSpawns 5 TotalCurrency 200 TFBot { Template T_TFBot_Giant_Soldier } } } //WAVE 2 (1000$) Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "2a" Where spawnbot TotalCount 18 MaxActive 10 SpawnCount 6 WaitBeforeStarting 0 WaitBetweenSpawns 10 TotalCurrency 200 TFBot { Template T_TFBot_Scout_Sandman_AlwaysCrit } } WaveSpawn { Name "2a-Tank" TotalCount 1 WaitBeforeStarting 0 WaitBetweenSpawns 0 TotalCurrency 400 Tank { Health 15000 Speed 75 Name "tankboss" StartingPathTrackNode "boss_path_1" OnKilledOutput { Target boss_dead_relay Action Trigger } OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } WaveSpawn { Name "2b-support" WaitForAllDead "2a" Where spawnbot Where spawnbot_invasion TotalCount 48 MaxActive 6 SpawnCount 3 WaitBeforeStarting 0 WaitBetweenSpawns 6 TotalCurrency 200 Support 1 TFBot { Template T_TFBot_Heavyweapons_Heavyweight_Champ } } WaveSpawn { Name "2b" WaitForAllDead "2a" Where spawnbot TotalCount 8 MaxActive 4 SpawnCount 4 WaitBeforeStarting 0 WaitBetweenSpawns 6 TotalCurrency 200 Squad { TFBot { Template T_TFBot_Giant_Pyro CharacterAttributes { "airblast disabled" 1 } } TFBot { Template T_TFBot_Medic_QuickUber } TFBot { Template T_TFBot_Medic_QuickUber } TFBot { Template T_TFBot_Medic_QuickUber } } } } }
การ Save File
เวลา Save File แนะนำให้ใช้ตัวอักษรตัวเล็กกับ _ เท่านั้น ( _ คือ Underscore ซึ่งไว้ใช้เว้นวรรค)
ข้อแนะนำในการตั้งชื่อไฟล์
  • ห้ามใช้ภาษาไทย
  • ห้ามเว้นวรรค (ถ้าต้องการเว้นวรรคให้ใช้ _ )
  • ห้ามใช้อักขระแปลกๆ



ชื่อไฟล์ที่ผม save คือ mvm_decoy_example01
จากในรูปให้เติม .pop เข้าไป จะได้ชื่อไฟล์ว่า mvm_decoy_example01.pop
และ Save เป็น Normal Text File

ตำแหน่งที่ save จะ save ใน D:\Steam\steamapps\common\Team Fortress 2\tf\scripts\population
***หมายเหตุ***
D: คือ Drive ที่เราติดตั้งเกมนี้ ถ้าเราติดตั้งไว้ใน Drive C ก็ต้องไปดูว่าเราติดตั้งไว้ไหน
ถ้าเข้าไปใน Folder tf แล้ว ไม่เจอ scripts หรือเข้าไปใน scripts แล้วไม่เจอ population ก็ให้สร้าง Folder ขึ้นมาเองเลย
การ Upload File
หน้าเว็บ Upload (ต้อง Login Steam ก่อน)
https://testing.potato.tf/upload.html

สามารถดู POP File ของตัวเองได้โดยการใส่ชื่อไฟล์ตัวเองลงไปตรง xxx
https://testing.potato.tf/tf/scripts/population/xxx
ตัวอย่าง
https://testing.potato.tf/tf/scripts/population/mvm_decoy_example01.pop

การ Test Balanced
Solo Test
Solo Test เป็นการ test ว่า mission เรามี error มั้ย
คำสั่ง console command ที่ใช้สำหรับ solo test สำหรับ Private Server (พิมใน Developer Console Command)
(ไปที่ Find Game > Create Server > เลือก map mvm_xxx)
  • sv_cheats 1 เพื่อเปิดให้ใช้คำสั่ง console command
  • tf_mvm_jump_to_wave x (กระโดดข้ามไป Wave นั้นๆ)(x คือตัวเลข)
  • currency_give x (เสกเงิน)($)(x คือตัวเลข)
  • addcond 34 หรือ 56 - crit
  • addcond 5 - uber
  • addcond 72 - วิ่งเร็ว
  • addcond 91 - Haste Powerup (ใช้นอก Spawn เท่านั้น)
  • noclip - บินทะลุกำแพง

คำสั่งใน Potato.tf Testing Server (พิมใน Chat)
ใช้ได้เฉพาะคนที่อัพโหลด POP File หรือผู้ดูแล Server เท่านั้น
หน้าเว็บของ Potato.tf Testing Server[testing.potato.tf]
  • !wave x - กระโดดข้ามไป Wave นั้นๆ (x คือตัวเลข)
  • !addcond x - ตัวเลขใช้เหมือนตัวบน (x คือตัวเลข)
  • !addcash_all x - เสกเงินให้กับทุกคน (x คือตัวเลข)
  • !noclip - บินทะลุกำแพง
  • !wave_start - เริ่ม wave ทันที
  • !wave_restart - restart wave นั้นๆ ทันที (ถ้าใช้ใน wave 3 จะ restart เฉพาะ wave 3 ซึ่งจะไม่กลับไป wave 1)
  • !panic - ฆ่า bot กับ tank ทั้ง map ซึ่งใช้ในกรณีที่ด่านยากไป หรือ bot เหลือนิดๆ หน่อยๆ เพื่อประหยัดเวลา
  • !team x r - ย้ายผู้เล่นที่เราเลือกไป team แดง (player)(x คือชื่อผู้เล่น)
  • !team x b - ย้ายผู้เล่นที่เราเลือกไป team ฟ้า (robot)(x คือชื่อผู้เล่น)
  • !team x s - ย้ายผู้เล่นที่เราเลือกไป spectator (x คือชื่อผู้เล่น)
  • !kick x - เตะผู้เล่น (x คือชื่อคน ซึ่งสามารถเขียนย่อได้)
  • !password x - ตั้ง Password เพื่อล็อก Password (x คือ Password ที่เราตั้ง)
    การปลด Password ให้พิม sm_password "" ใน Developer Console Command (ไม่ต้องมี !)
  • !toggle_ready x y - ทำให้ player กด F4 หรือยกเลิก F4
    • x คือชื่อผู้เล่น
    • ถ้า x เป็น @all คือใช้ทุกคน
    • ถ้า y เป็น 1 คือกด F4
    • ถ้า y เป็น 0 คือยกเลิก F4
  • !pos - ใช้บอกตำแหน่งที่ตัวเองอยู่ รวมถึงตำแหน่งที่เราเล็งปืน

Group Test
อันนี้เหนี่อยของจริง เพราะต้อง test หลายรอบมากๆ จึงทำให้ balanced
ในการ test จะต้องลองหลากหลายทีม เพราะทีมที่แตกต่าง ผลลัพธ์ก็แตกต่าง รวมถึงฝีมือผู้เล่น

Group Test จะมีบาง Class บางอาวุธหรือบาง Mechanic ที่ต้องพิจารณาเลี่ยงในการ test
Gas Passer ของ Pyro (ในกรณีเป็นเซิฟอื่นๆ เพราะ Potato.tf กับ Moonlight.tf เค้า disable upgrade อยู่แล้ว)
explode on ignite ของ gas passer คือโกงมาก สามารถโยนแล้วฆ่า bot ได้อย่างง่ายดาย
explode on ignite ไม่นับเป็น damage ชนิดใดๆ จึงสามารถทะลุ resistance ของ bot ได้
recharge ไวมาก ทำ damage แค่ 700 gas ก็กลับมาใช้ได้แล้ว
เพราะถ้าจะ balanced mission ด้วยการใช้ gas passer จะทำให้กลับมาเล่นอีกครั้งโดยไม่มี gas passer อาจจะทำให้จากง่ายกลายไปยากได้เลย

Airblast Pyro/Scorch Shot Pyro (ในกรณีเป็นเซิฟอื่นๆ เพราะ Potato.tf กับ Moonlight.tf เค้าทำให้ Airblast/Scorch Shot กลับไปเป็นแบบก่อน Jungle Inferno)
ที่ต้องเลี่ยงเพราะมันสามารถใช้ฆ่า Boss ที่เลือดเยอะมากๆ ได้โดยแค่การเป่าลงเครื่องบด/หลุม
ตัวอย่างคือผมแกล้งสร้างบอส Scout ยักษ์เลือด 10M ซึ่งในความเป็นจริงแทบจะไม่มีทางผ่านได้นอกจากการเป่าให้ลงหลุม

Projectile Shield Medic
อันนี้เป็นการเลี่ยง test เพื่อเช็คว่า bot spam มากไปหรือเปล่ารวมถึง crit bot เพราะโล่ Medic สามารถกัน damage ได้แทบทุกอย่างยกเว้นไฟ, อาวุธระยะประชิด และ bison soldier

Explosive Headshot Sniper
อันนี้สาเหตุที่เลี่ยงเพราะ Sniper เป็น Class ที่ยิงจากระยะไกล ซึ่งโดยรวมจะปลอดภัยมากกว่าการเล่น Class อื่น และเก่งกับ Heavy minigun bot มากเพราะมันวิ่งช้า
เราสังเกตุจาก Metro Malice Wave 3 ได้ ว่า Heavy minigun bot hard AI เป็นอะไรที่โหดมาก ซึ่งถ้ามี Sniper เก่งๆ ด่านนี้กลายเป็นง่ายไปเลยโดยเฉพาะ Explosive Headshot

Spy
อันนี้ส่วนใหญ่จะเลี่ยงเฉพาะ wave ที่มี Medic ยักษ์
spy จะเก่งกับ Medic ยักษ์ ซึ่งอัพเกรด armored penetration เต็ม (1600$) สามารถแทงหลัง Medic ยักษ์ 5 ทีตายได้เลย
ซึ่งเป็นสาเหตุที่ทำให้ Decoy Expert Wave 5 กับ Coaltown Expert Wave 6 เล่นสบายถ้ามี Spy ที่เล่นเป็น

Crit กับ Uber Canteen
อันนี้โดยปกติแล้ว Crit หรือ Uber Canteen จะใช้สำหรับสถานการณ์ฉุกเฉินเท่านั้น
ซึ่งที่เลี่ยงการใช้เพราะถ้าผ่านไม่ได้โดยไม่มี Crit หรือ Uber Canteen แปลว่าด่านยากไป

Building Canteen ของ Engi
อันนี้เลี่ยงเฉพาะระดับ intermediate เพราะในระดับ intermediate Engi จะเก่งมาก Sentry ธรรมดากินขาด
เพราะ bot จะไม่โหดและมาไม่เยอะ (บางที test ถึงขั้นต้องใช้ gunslinger test เพื่อที่จะดูว่ายากไปสำหรับ intermediate หรือไม่)

ซึ่งโดยรวมเราก็ต้องถามคนที่ร่วม test ด้วยว่าเล่นแล้วรู้สึกอย่างไร น่าเบื่อหรือโหดเกินไป เล่นแล้วสนุกมั้ย
ถ้าเกิดทำด่านมาอยากลอง group test ก็สามารถเข้ามาสอบถามคนใน Discord[discord.gg] ได้นะ (คุย Eng นะไม่ใช่ภาษาไทย)
ซึ่งจริงๆ อาจจะมี Restriction มากกว่านี้ก็ต้องลองถามดู

แนะนำถ้าเรายังไม่รู้ว่าจะ test ยังไงก็ลองถามเค้าก่อนว่าระดับ intermediate, advanced กับ expert เทสกันกี่คนและมี restriction อะไรบ้างก่อนที่จะ ping testers เพื่อเรียกคน
discord ของ potato ใช้ test ในห้อง looking_for_players
Originally posted by Testing MvM Template:
@Testers https://potato.tf/connect/139.99.124.126:27031
Server Region (SGP/EU/US/AUS)
Map
Mission

Test Restriction
Ex. No Medic/Sniper/Canteen (Crit/Uber)
5 Players

Wave 1/4
Player 1/5
วิธีการเอาลิ้งของ Server เข้าในที่ page[testing.potato.tf] นี้แล้วคลิกขวาที่ join แล้วคลิก Open link in new tab แล้วก็อปลิ้ง Server มาวางลง

ย้ำ ใน Discord คุย Eng เท่านั้นนะ ไม่คุยภาษาไทยนะ เป็นการรักษามารยาทกับกลุ่ม Discord เพราะมันเป็นกลุ่มทั่วโลก!!!

แต่ถ้า Test ใน Moonlight.tf เค้าจะมีเกณฑ์ชัดเจนเลย



ตามรูปนี้เลย
No (Intentionally) Stalling/Pitting Robots คือ เวลา Test เค้าจะไม่เป่า bot ลงหลุม ไม่ใช้ scorch shot หรือจงใจ bodyblocked/sentryblocked รวมถึงการใช้ Knockback Rage ของ Heavy ด้วย
Intentionally แปลว่า จงใจ, ตั้งใจ
Stalling แปลว่า ขัดขวาง, กั้น, ถ่วงเวลา
Intentionally Stalling ในที่นี้ถ้าเป็นเกมนี้คือจงใจ bodyblocked/sentryblocked รวมถึงการใช้ Knockback Rage ของ Heavy ด้วย
สรุปจบ
Guide นี้เป็นเพียงวิธีสร้างด่าน (Mission) แบบ Basic ซึ่งจะยังทำในด่าน mannhattan ไม่ได้
สำหรับ mannhattan จะต้องใช้ robot_gatebot.pop ด้วยและมันค่อนข้างซับซ้อน

แต่ถ้าอยากลองทำสามารถดูตัวอย่าง pop file ของทาง official ได้
https://github.com/sigsegv-mvm/population

ขอขอบคุณ Guide จากภาษาอังกฤษ
สามารถดูเพิ่มเติมได้ ซึ่งมี custom robot ด้วย

Potato.tf

Moonlight.tf