Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad2f1f8dcc | ||
|
|
342a0d6c72 | ||
|
|
9aa317ea09 | ||
|
|
aa500be7c6 |
@@ -15,7 +15,3 @@ FS507D_20161015/
|
|||||||
|
|
||||||
# player-created mechlab variants in the game deploy (local test/play data, per-machine)
|
# player-created mechlab variants in the game deploy (local test/play data, per-machine)
|
||||||
MW4/Resource/Variants/
|
MW4/Resource/Variants/
|
||||||
|
|
||||||
# GameOS run-time reports: rewritten on every launch, per-machine
|
|
||||||
MW4/gos-displays.txt
|
|
||||||
MW4/gos-fps.txt
|
|
||||||
|
|||||||
Vendored
-13
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
// Legacy source files use CP949 (Korean Windows encoding, superset of EUC-KR).
|
|
||||||
// VS Code defaults to UTF-8, which silently corrupts the Korean comment bytes
|
|
||||||
// on save. Setting encoding to cp949 here preserves them exactly.
|
|
||||||
"files.encoding": "cp949",
|
|
||||||
|
|
||||||
// Let VS Code try to detect encoding per-file, falling back to cp949 above.
|
|
||||||
"files.autoGuessEncoding": true,
|
|
||||||
|
|
||||||
// Preserve the original Windows CRLF line endings (Git's * -text in
|
|
||||||
// .gitattributes also prevents conversion, but this keeps VS Code consistent).
|
|
||||||
"files.eol": "\r\n"
|
|
||||||
}
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,111 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""Generate special_weapon_locations.csv and rear_facing_weapons.csv from stock mech subsystems."""
|
|
||||||
import csv
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
BASE = Path("Gameleap/mw4/Content")
|
|
||||||
MECH_TABLE = BASE / "Tables" / "MechTable.tbl"
|
|
||||||
OUT_DIR = Path("BTFrstrm")
|
|
||||||
|
|
||||||
def parse_ini(path):
|
|
||||||
sections, cur_sec, cur_dict = [], None, {}
|
|
||||||
with open(path, 'r', encoding='latin-1', errors='replace') as f:
|
|
||||||
for raw in f:
|
|
||||||
line = raw.strip()
|
|
||||||
if line.startswith('[') and line.endswith(']'):
|
|
||||||
if cur_sec is not None:
|
|
||||||
sections.append((cur_sec, cur_dict))
|
|
||||||
cur_sec, cur_dict = line[1:-1], {}
|
|
||||||
elif '=' in line and cur_sec is not None:
|
|
||||||
k, _, v = line.partition('=')
|
|
||||||
cur_dict[k.strip()] = v.strip()
|
|
||||||
if cur_sec is not None:
|
|
||||||
sections.append((cur_sec, cur_dict))
|
|
||||||
return sections
|
|
||||||
|
|
||||||
def find_dir_ci(parent, name):
|
|
||||||
"""Case-insensitive directory lookup for Linux."""
|
|
||||||
exact = parent / name
|
|
||||||
if exact.exists():
|
|
||||||
return exact
|
|
||||||
name_lower = name.lower()
|
|
||||||
for child in parent.iterdir():
|
|
||||||
if child.is_dir() and child.name.lower() == name_lower:
|
|
||||||
return child
|
|
||||||
return None
|
|
||||||
|
|
||||||
def weapon_model(model_path):
|
|
||||||
return Path(model_path.replace('\\', '/')).stem
|
|
||||||
|
|
||||||
# Read chassis list from MechTable.tbl
|
|
||||||
chassis_list = []
|
|
||||||
with open(MECH_TABLE, 'r', encoding='latin-1') as f:
|
|
||||||
for raw in f:
|
|
||||||
line = raw.strip()
|
|
||||||
if not line or line.startswith('//') or line.startswith('[') or '=' not in line:
|
|
||||||
continue
|
|
||||||
name, _, rel = line.partition('=')
|
|
||||||
# rel is like "Mechs\Atlas\Atlas.instance"
|
|
||||||
parts = rel.strip().replace('\\', '/').split('/')
|
|
||||||
chassis_list.append((name.strip(), parts)) # parts = ['Mechs', 'Atlas', 'Atlas.instance']
|
|
||||||
|
|
||||||
print(f"Found {len(chassis_list)} chassis in MechTable.tbl")
|
|
||||||
|
|
||||||
HDR = ['Chassis', 'InternalLocation', 'Model', 'Site', 'AmmoCount', 'GroupIndex', 'WeaponFacing']
|
|
||||||
special_rows, rear_rows, missing = [], [], []
|
|
||||||
|
|
||||||
mechs_dir = BASE / "Mechs"
|
|
||||||
|
|
||||||
for chassis_name, path_parts in chassis_list:
|
|
||||||
# path_parts[1] is the mech directory name (e.g. 'Atlas', 'MadCat_MkII', 'Urbanmech')
|
|
||||||
if len(path_parts) < 2:
|
|
||||||
missing.append(chassis_name)
|
|
||||||
continue
|
|
||||||
|
|
||||||
mech_dir = find_dir_ci(mechs_dir, path_parts[1])
|
|
||||||
if not mech_dir:
|
|
||||||
missing.append(f"{chassis_name} (dir not found: {path_parts[1]})")
|
|
||||||
continue
|
|
||||||
|
|
||||||
subs = [f for f in mech_dir.glob('*.subsystems') if f.suffix == '.subsystems']
|
|
||||||
if not subs:
|
|
||||||
missing.append(f"{chassis_name} (no .subsystems in {mech_dir.name})")
|
|
||||||
continue
|
|
||||||
|
|
||||||
subsys_file = subs[0]
|
|
||||||
sections = parse_ini(subsys_file)
|
|
||||||
|
|
||||||
for sec_name, fields in sections:
|
|
||||||
if 'WeaponSubsystem' not in fields.get('Model', ''):
|
|
||||||
continue
|
|
||||||
|
|
||||||
loc = fields.get('InternalLocation', '')
|
|
||||||
model = weapon_model(fields.get('Model', ''))
|
|
||||||
site = fields.get('Site', '')
|
|
||||||
ammo = fields.get('AmmoCount', '')
|
|
||||||
group = fields.get('GroupIndex', '')
|
|
||||||
facing = fields.get('WeaponFacing', '')
|
|
||||||
|
|
||||||
if loc in ('Special1', 'Special2'):
|
|
||||||
special_rows.append([chassis_name, loc, model, site, ammo, group, facing])
|
|
||||||
|
|
||||||
if facing and facing != '0':
|
|
||||||
rear_rows.append([chassis_name, loc, model, site, ammo, group, facing])
|
|
||||||
|
|
||||||
# Write CSVs
|
|
||||||
out1 = OUT_DIR / 'special_weapon_locations.csv'
|
|
||||||
with open(out1, 'w', newline='') as f:
|
|
||||||
w = csv.writer(f)
|
|
||||||
w.writerow(HDR)
|
|
||||||
w.writerows(special_rows)
|
|
||||||
|
|
||||||
out2 = OUT_DIR / 'rear_facing_weapons.csv'
|
|
||||||
with open(out2, 'w', newline='') as f:
|
|
||||||
w = csv.writer(f)
|
|
||||||
w.writerow(HDR)
|
|
||||||
w.writerows(rear_rows)
|
|
||||||
|
|
||||||
print(f"Spreadsheet 1 ? Special1/2 weapon locations: {len(special_rows)} rows -> {out1}")
|
|
||||||
print(f"Spreadsheet 2 ? Non-forward WeaponFacing: {len(rear_rows)} rows -> {out2}")
|
|
||||||
if missing:
|
|
||||||
print(f"\nSkipped: {missing}")
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
Mech,In_game_playable,Tech,Chassis_Tonnage,Max_Loadout_Tonnage,Armor_Type,Internal_Type,Heatsinks,Heatsink_Type,JumpJets_Installed,CanLoad_JJ,CanLoad_ECM,CanLoad_BAP,CanLoad_AMS,OmniSlots,Equipment,Armor_LeftArm,Armor_RightArm,Armor_LeftLeg,Armor_RightLeg,Armor_LeftFrontTorso,Armor_RightFrontTorso,Armor_CenterFrontTorso,Armor_CenterRearTorso,Armor_Head,Total_Armor_Multiplier,Weapon_Count,Weapons_Summary,Weapons_With_Locations,Default_Installed_Locations,Available_Slot_Capacity_By_Zone,Available_Hardpoints,notes
|
|
||||||
Annihilator,Yes,IS,23.000000,100.000000,Reflective,EndoSteel,17,Single,0,No,Yes,Yes,Yes,43,,1.8,1.8,1.8,1.8,1.85,1.85,2.0,0.8,0.3,14,10,"4x ClanERSmallLaser, 2x ClanMachineGun, 4x ClanUltraAC5",ClanERSmallLaser@LeftTorso(Front) G1 | ClanERSmallLaser@CenterTorso(Front) G1 | ClanERSmallLaser@CenterTorso(Front) G1 | ClanERSmallLaser@RightTorso(Front) G1 | ClanMachineGun@LeftTorso(Front) G1 | ClanMachineGun@RightTorso(Front) G1 | ClanUltraAC5@LeftArm(Front) G1 | ClanUltraAC5@LeftArm(Front) G1 | ClanUltraAC5@RightArm(Front) G1 | ClanUltraAC5@RightArm(Front) G1,LeftTorsox2 | CenterTorsox2 | RightTorsox2 | LeftArmx2 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
Archer,Yes,IS,17.000000,70.000000,Standard,Standard,20,Single,1,Yes,Yes,Yes,Yes,43,,1.1,1.1,1.2,1.2,1.4,1.4,1.5,0.5,0.3,9.7,9,"4x MediumPulseLaser, 2x SSRM2, 2x LRM15, NarcBeacon",MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@CenterTorso(Front) G1 | MediumPulseLaser@CenterTorso(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | SSRM2@LeftArm(Front) G2 | SSRM2@RightArm(Front) G2 | LRM15@LeftTorso(Side) G2 | LRM15@RightTorso(Side) G2 | NarcBeacon@LeftTorso(Front) G3,LeftArmx2 | CenterTorsox2 | RightArmx2 | LeftTorsox2 | RightTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front+Side) | RightTorso(Side) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
ArcticWolf,Yes,Clan,9.500000,40.000000,FerroFiberus,EndoSteel,8,Single,1,Yes,Yes,Yes,Yes,43,,0.7,0.7,0.95,0.95,0.85,0.85,1.0,0.2,0.3,6.5,6,"2x ClanSmallPulseLaser, 4x ClanSSRM4",ClanSmallPulseLaser@RightTorso(Front) G1 | ClanSmallPulseLaser@RightTorso(Front) G1 | ClanSSRM4@leftarm(Front) G2 | ClanSSRM4@special1(Front) G2 | ClanSSRM4@special2(Front) G2 | ClanSSRM4@rightarm(Front) G2,RightTorsox2 | leftarmx1 | special1x1 | special2x1 | rightarmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O8) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4) | Special2(M0/P0/B0/O4),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Unknown) | Special2(Unknown),
|
|
||||||
Ares,Yes,Clan,15.500000,60.000000,FerroFiberus,Standard,15,Single,0,Yes,Yes,Yes,Yes,46,,0.9,0.9,1.15,1.15,1.1,1.1,1.45,0.9,0.25,8.9,9,"2x ClanERSmallLaser, 3x ClanERMediumLaser, ClanERLargeLaser, 3x ClanLRM10",ClanERSmallLaser@Special1(Front) G1 | ClanERSmallLaser@Special1(Front) G1 | ClanERMediumLaser@LeftArm(Front) G1 | ClanERMediumLaser@RightArm(Front) G1 | ClanERMediumLaser@RightArm(Front) G1 | ClanERLargeLaser@LeftArm(Front) G1 | ClanLRM10@Special2(Side) G2 | ClanLRM10@Special2(Side) G2 | ClanLRM10@Special2(Side) G2,Special1x2 | LeftArmx2 | RightArmx2 | Special2x3,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2) | Special2(M0/P0/B0/O3),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | Head(Unknown) | Special1(Front) | Special2(Side),
|
|
||||||
Argus,Yes,IS,14.500000,60.000000,Standard,Standard,13,Single,0,No,Yes,Yes,Yes,43,,0.7,0.7,1.15,1.15,0.85,0.85,1.45,0.9,0.3,8.05,9,"3x MediumLaser, PPC, 4x MachineGun, LRM10",MediumLaser@Lefttorso(Front) G1 | MediumLaser@Righttorso(Front) G1 | MediumLaser@RightArm(Front) G1 | PPC@RightArm(Front) G1 | MachineGun@LeftTorso(Front) G1 | MachineGun@CenterTorso(Front) G1 | MachineGun@CenterTorso(Front) G1 | MachineGun@RightTorso(Front) G1 | LRM10@LeftArm(Front) G2,Lefttorsox1 | Righttorsox1 | RightArmx2 | LeftTorsox1 | CenterTorsox2 | RightTorsox1 | LeftArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
Assassin2,Yes,IS,12.000000,45.000000,FerroFiberus,EndoSteel,6,Single,0,Yes,Yes,Yes,Yes,40,,0.85,0.85,0.85,0.85,0.9,0.9,1.05,0.45,0.25,6.95,7,"2x SmallLaser, 2x MediumLaser, 2x SRM4, LRM5",SmallLaser@LeftArm(Front) G1 | SmallLaser@RightArm(Front) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@RightArm(Front) G1 | SRM4@LeftTorso(Front) G2 | SRM4@RightTorso(Front) G2 | LRM5@Special1(Side) G2,LeftArmx2 | RightArmx2 | LeftTorsox1 | RightTorsox1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O10) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | Special1(Side),
|
|
||||||
Atlas,Yes,IS,28.000000,100.000000,Standard,Standard,17,Single,0,No,Yes,Yes,Yes,43,,1.95,1.95,2.15,2.15,2.45,2.45,2.2,1.1,0.3,16.7,9,"4x MediumLaser, AC20, 2x SSRM2, SRM6, LRM20",MediumLaser@LeftArm(Front) G1 | MediumLaser@Head(Front) G1 | MediumLaser@CenterTorso(Front) G1 | MediumLaser@RightArm(Front) G1 | AC20@Special1(Front) G1 | SSRM2@LeftTorso(Front) G2 | SSRM2@RightTorso(Front) G2 | SRM6@Special2(Front) G2 | LRM20@LeftTorso(Side) G2,LeftArmx1 | Headx1 | CenterTorsox1 | RightArmx1 | Special1x1 | LeftTorsox2 | RightTorsox1 | Special2x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O10) | RightTorso(M0/P0/B0/O8) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4) | Special2(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front+Side) | RightTorso(Front) | CenterTorso(Front) | Head(Front) | Special1(Front) | Special2(Front),
|
|
||||||
Avatar,Yes,IS,17.000000,70.000000,Reactive,EndoSteel,12,Single,0,Yes,Yes,Yes,Yes,43,,1.3,1.3,1.5,1.5,1.6,1.6,1.75,0.5,0.3,11.35,10,"4x MachineGun, 2x LargeLaser, 2x LRM5, 2x LRM10",MachineGun@LeftArm(Front) G1 | MachineGun@Special1(Front) G1 | MachineGun@Special1(Front) G1 | MachineGun@RightArm(Front) G1 | LargeLaser@LeftArm(Front) G1 | LargeLaser@RightArm(Front) G1 | LRM5@LeftTorso(Side) G2 | LRM5@RightTorso(Side) G2 | LRM10@LeftTorso(Side) G2 | LRM10@RightTorso(Side) G2,LeftArmx2 | Special1x2 | RightArmx2 | LeftTorsox2 | RightTorsox2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Side) | Head(Unknown) | Special1(Front),
|
|
||||||
Awesome,Yes,IS,23.000000,80.000000,Standard,Standard,28,Single,0,No,Yes,Yes,Yes,43,,1.45,1.45,1.55,1.55,1.65,1.65,1.75,1.25,0.3,12.6,6,"SmallPulseLaser, 3x ERPPC, UltraAC5, LRM5",SmallPulseLaser@Head(Front) G1 | ERPPC@Lefttorso(Front) G1 | ERPPC@righttorso(Front) G1 | ERPPC@RightArm(Front) G1 | UltraAC5@LeftArm(Front) G1 | LRM5@CenterTorso(Side) G2,Headx1 | Lefttorsox1 | righttorsox1 | RightArmx1 | LeftArmx1 | CenterTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Side) | Head(Front),
|
|
||||||
Battlemaster,Yes,IS,20.500000,85.000000,Standard,EndoSteel,25,Single,0,No,Yes,Yes,Yes,43,,1.45,1.45,1.6,1.6,1.8,1.8,2.05,0.95,0.3,13,10,"PPC, 6x MediumLaser, 2x MachineGun, SRM6",PPC@Special2(Front) G1 | MediumLaser@RightTorso(Front) G1 | MediumLaser@RightTorso(Front) G1 | MediumLaser@RightTorso(Rear) G1 | MediumLaser@LeftTorso(Front) G1 | MediumLaser@LeftTorso(Front) G1 | MediumLaser@LeftTorso(Rear) G1 | MachineGun@LeftArm(Front) G1 | MachineGun@LeftArm(Front) G1 | SRM6@Special1(Front) G2,Special2x1 | RightTorsox3 | LeftTorsox3 | LeftArmx2 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O4) | LeftTorso(M0/P0/B0/O9) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O3) | Special2(M0/P0/B0/O4),LeftArm(Front) | RightArm(Unknown) | LeftTorso(Front+Rear) | RightTorso(Front+Rear) | CenterTorso(Unknown) | Head(Unknown) | Special1(Front) | Special2(Front),
|
|
||||||
Battlemaster2c,Yes,Clan,15.500000,85.000000,Standard,EndoSteel,25,Single,0,No,Yes,Yes,Yes,39,,1.45,1.45,1.6,1.6,1.8,1.8,2.05,0.95,0.3,13,10,"ClanERPPC, 6x ClanERMediumLaser, 2x ClanGaussRifle, ClanSSRM6",ClanERPPC@RightArm(Front) G1 | ClanERMediumLaser@RightTorso(Front) G1 | ClanERMediumLaser@RightTorso(Front) G1 | ClanERMediumLaser@RightTorso(Rear) G1 | ClanERMediumLaser@LeftTorso(Front) G1 | ClanERMediumLaser@LeftTorso(Front) G1 | ClanERMediumLaser@LeftTorso(Rear) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanSSRM6@Special1(Front) G2,RightArmx1 | RightTorsox3 | LeftTorsox3 | LeftArmx2 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O4) | LeftTorso(M0/P0/B0/O9) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O3),LeftArm(Front) | RightArm(Front) | LeftTorso(Front+Rear) | RightTorso(Front+Rear) | CenterTorso(Unknown) | Head(Unknown) | Special1(Front),
|
|
||||||
Behemoth,Yes,Clan,22.000000,100.000000,Standard,Standard,21,Single,1,Yes,Yes,Yes,Yes,43,,1.95,1.95,2.15,2.15,2.45,2.45,2.2,1.1,0.3,16.7,7,"4x ClanLargePulseLaser, 2x ClanGaussRifle, LargeLaser",ClanLargePulseLaser@LeftTorso(Front) G1 | ClanLargePulseLaser@LeftTorso(Front) G1 | ClanLargePulseLaser@RightTorso(Front) G1 | ClanLargePulseLaser@RightTorso(Front) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanGaussRifle@RightArm(Front) G1 | LargeLaser@Special1(Front) G1,LeftTorsox2 | RightTorsox2 | LeftArmx1 | RightArmx1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | Head(Unknown) | Special1(Front),
|
|
||||||
Behemoth2,Yes,Clan,22.000000,100.000000,Standard,Standard,21,Single,1,Yes,Yes,Yes,Yes,43,,1.95,1.95,2.15,2.15,2.45,2.45,2.2,1.1,0.3,16.7,7,"4x ClanLargePulseLaser, 2x ClanGaussRifle, LargeLaser",ClanLargePulseLaser@LeftTorso(Front) G1 | ClanLargePulseLaser@LeftTorso(Front) G1 | ClanLargePulseLaser@RightTorso(Front) G1 | ClanLargePulseLaser@RightTorso(Front) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanGaussRifle@RightArm(Front) G1 | LargeLaser@Special1(Front) G1,LeftTorsox2 | RightTorsox2 | LeftArmx1 | RightArmx1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | Head(Unknown) | Special1(Front),
|
|
||||||
Blackhawk,Yes,Clan,10.000000,50.000000,FerroFiberus,EndoSteel,12,Single,0,Yes,Yes,Yes,Yes,43,,0.9,0.9,0.95,0.95,1.05,1.05,1.2,0.55,0.25,7.8,4,"2x ClanMediumPulseLaser, 2x ClanERPPC",ClanMediumPulseLaser@LeftTorso(Front) G1 | ClanMediumPulseLaser@RightTorso(Front) G1 | ClanERPPC@LeftArm(Front) G1 | ClanERPPC@RightArm(Front) G1,LeftTorsox1 | RightTorsox1 | LeftArmx1 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O10) | RightTorso(M0/P0/B0/O10) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2) | Special2(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Unknown) | Special2(Unknown),
|
|
||||||
Blackheart,No,Clan,14.000000,70.000000,FerroFiberus,Standard,0,,0,No,Yes,No,No,6,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P3/B0/O0) | RightArm(M0/P3/B0/O0) | LeftTorso(M0/P0/B1/O2) | RightTorso(M0/P0/B1/O2) | CenterTorso(M0/P0/B0/O2),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Blacklanner,Yes,Clan,12.500000,55.000000,FerroFiberus,EndoSteel,10,Single,0,No,Yes,Yes,Yes,40,ECM,0.9,0.9,1.0,1.0,1.05,1.05,1.15,0.75,0.25,8.05,5,"2x ClanERMediumLaser, ClanERLargeLaser, ClanSRM6, ClanLRM10",ClanERMediumLaser@LeftArm(Front) G1 | ClanERMediumLaser@LeftArm(Front) G1 | ClanERLargeLaser@RightArm(Front) G1 | ClanSRM6@Special2(Side) G2 | ClanLRM10@Special1(Side) G2,LeftArmx2 | RightArmx1 | Special2x1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | Special1(M0/P0/B0/O12) | Special2(M0/P0/B0/O12),LeftArm(Front) | RightArm(Front) | Special1(Side) | Special2(Side),
|
|
||||||
Blacknight,Yes,IS,16.000000,75.000000,Standard,Standard,22,Single,0,Yes,Yes,Yes,Yes,43,,1.2,1.2,1.4,1.4,1.55,1.55,1.8,0.8,0.3,11.2,8,"SmallLaser, 4x MediumLaser, 2x LargeLaser, PPC",SmallLaser@Head(Front) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@LeftTorso(Front) G1 | MediumLaser@RightTorso(Front) G1 | MediumLaser@RightArm(Front) G1 | LargeLaser@LeftTorso(Front) G1 | LargeLaser@RightTorso(Front) G1 | PPC@RightArm(Front) G1,Headx1 | LeftArmx1 | LeftTorsox2 | RightTorsox2 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Front),
|
|
||||||
Bowman,No,Clan,16.000000,70.000000,FerroFiberus,Standard,0,,0,No,Yes,Yes,No,5,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P2/B2/O2) | RightArm(M4/P0/B0/O0) | Special1(M4/P0/B0/O0) | Special2(M0/P0/B0/O3),LeftArm(Unknown) | RightArm(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Brigand,Yes,IS,7.000000,25.000000,FerroFiberus,Standard,10,Single,0,Yes,Yes,Yes,Yes,40,,0.45,0.45,0.45,0.45,0.55,0.55,0.55,0.4,0.25,4.1,4,"2x MediumPulseLaser, 2x MediumLaser",MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | MediumLaser@Special2(Front) G1 | MediumLaser@Special1(Front) G1,LeftArmx1 | RightArmx1 | Special2x1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | Special1(M0/P0/B0/O12) | Special2(M0/P0/B0/O12),LeftArm(Front) | RightArm(Front) | Special1(Front) | Special2(Front),
|
|
||||||
Bushwacker,Yes,IS,15.500000,55.000000,FerroFiberus,Standard,11,Single,0,No,Yes,Yes,Yes,43,,0.9,0.9,1.1,1.1,1.15,1.15,1.35,0.5,0.25,8.4,8,"2x MediumLaser, ERLargeLaser, 2x MachineGun, AC10, 2x LRM5",MediumLaser@CenterTorso(Front) G1 | MediumLaser@CenterTorso(Front) G1 | ERLargeLaser@RightArm(Front) G1 | MachineGun@LeftTorso(Front) G1 | MachineGun@RightTorso(Front) G1 | AC10@LeftArm(Front) G1 | LRM5@Special1(Side) G2 | LRM5@Special1(Side) G2,CenterTorsox2 | RightArmx1 | LeftTorsox1 | RightTorsox1 | LeftArmx1 | Special1x2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Front) | Head(Unknown) | Special1(Side),
|
|
||||||
Canis,No,Clan,15.000000,80.000000,FerroFiberus,EndoSteel,0,,0,Yes,No,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B5/O0) | RightArm(M0/P0/B5/O0) | Special1(M0/P3/B0/O0) | Special2(M0/P3/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Catapult,Yes,IS,15.000000,65.000000,Reactive,Standard,10,Single,1,Yes,Yes,Yes,Yes,43,BAP,1.45,1.45,1.35,1.35,1.45,1.45,1.5,0.65,0.3,10.95,4,"2x LargeLaser, 2x LRM20",LargeLaser@LeftTorso(Front) G1 | LargeLaser@RightTorso(Front) G1 | LRM20@LeftArm(Side) G2 | LRM20@RightArm(Side) G2,LeftTorsox1 | RightTorsox1 | LeftArmx1 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Side) | RightArm(Side) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
CauldronBorn,Yes,Clan,13.500000,65.000000,FerroFiberus,EndoSteel,13,Single,0,Yes,Yes,Yes,Yes,43,,0.85,0.85,0.95,0.95,1.15,1.15,1.55,0.85,0.25,8.55,6,"ClanERMediumLaser, ClanUltraAC5, ClanGaussRifle, ClanSSRM2, 2x ClanLRM10",ClanERMediumLaser@LeftTorso(Front) G1 | ClanUltraAC5@LeftArm(Front) G1 | ClanGaussRifle@RightArm(Front) G1 | ClanSSRM2@RightTorso(Front) G2 | ClanLRM10@Special1(Side) G2 | ClanLRM10@Special2(Side) G2,LeftTorsox1 | LeftArmx1 | RightArmx1 | RightTorsox1 | Special1x1 | Special2x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O8) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4) | Special2(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Side) | Special2(Side),
|
|
||||||
Chimera,Yes,IS,9.500000,40.000000,Standard,EndoSteel,14,Single,1,Yes,Yes,Yes,Yes,43,BAP,0.95,0.95,1.0,1.0,1.0,1.0,1.1,0.5,0.3,7.8,7,"2x MediumPulseLaser, ERLargeLaser, 4x LRM5",MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@LeftArm(Front) G1 | ERLargeLaser@RightArm(Front) G1 | LRM5@RightTorso(Side) G2 | LRM5@RightTorso(Side) G2 | LRM5@RightTorso(Side) G2 | LRM5@RightTorso(Side) G2,LeftArmx2 | RightArmx1 | RightTorsox4,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Side) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Commando,Yes,IS,7.000000,25.000000,Standard,Standard,8,Single,0,Yes,Yes,Yes,Yes,43,,0.6,0.6,0.8,0.8,0.75,0.75,0.8,0.45,0.3,5.85,3,"2x MediumLaser, SRM6",MediumLaser@LeftArm(Front) G1 | MediumLaser@RightArm(Front) G1 | SRM6@CenterTorso(Front) G2,LeftArmx1 | RightArmx1 | CenterTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
Cougar,Yes,Clan,8.500000,35.000000,FerroFiberus,EndoSteel,10,Single,1,Yes,Yes,Yes,Yes,43,BAP,0.7,0.7,0.7,0.7,0.75,0.75,0.8,0.45,0.25,5.8,5,"2x ClanMediumPulseLaser, ClanMachineGun, 2x ClanLRM10",ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanMachineGun@RightTorso(Front) G1 | ClanLRM10@LeftTorso(Side) G2 | ClanLRM10@RightTorso(Side) G2,LeftArmx1 | RightArmx1 | RightTorsox2 | LeftTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Front+Side) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Crab,No,IS,10.500000,50.000000,FerroFiberus,Standard,0,,0,No,No,Yes,No,1,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B4/O0) | RightArm(M0/P0/B4/O0) | CenterTorso(M0/P0/B2/O0) | Special1(M0/P0/B1/O1),LeftArm(Unknown) | RightArm(Unknown) | CenterTorso(Unknown) | Special1(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Cyclops,Yes,IS,19.000000,90.000000,FerroFiberus,Standard,16,Single,0,No,Yes,Yes,Yes,45,BAP,1.4,1.4,1.4,1.4,1.55,1.55,1.45,0.8,0.25,11.2,8,"3x MediumPulseLaser, 2x MediumLaser, GaussRifle, SRM4, LRM10",MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@Special1(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@RightArm(Front) G1 | GaussRifle@RightTorso(Front) G1 | SRM4@CenterTorso(Front) G2 | LRM10@LeftTorso(Side) G2,LeftArmx2 | Special1x1 | RightArmx2 | RightTorsox1 | CenterTorsox1 | LeftTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Front) | CenterTorso(Front) | Head(Unknown) | Special1(Front),
|
|
||||||
Daishi,Yes,Clan,25.000000,100.000000,Standard,Standard,21,Single,0,No,Yes,Yes,Yes,43,,1.75,1.75,1.9,1.9,2.0,2.0,2.2,1.5,0.3,15.3,6,"3x ClanLargePulseLaser, ClanGaussRifle, 2x ClanSSRM6",ClanLargePulseLaser@RightArm(Front) G1 | ClanLargePulseLaser@RightArm(Front) G1 | ClanLargePulseLaser@RightArm(Front) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanSSRM6@special1(Front) G2 | ClanSSRM6@special1(Front) G2,RightArmx3 | LeftArmx1 | special1x2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown) | Head(Unknown) | Special1(Unknown),
|
|
||||||
Deimos,Yes,Clan,18.000000,85.000000,Reactive,EndoSteel,17,Single,0,No,Yes,Yes,Yes,43,,1.55,1.55,1.65,1.65,1.75,1.75,2.05,0.7,0.3,12.95,10,"2x ClanERMediumLaser, 6x ClanUltraAC2, 2x ClanLRM15",ClanERMediumLaser@LeftTorso(Front) G1 | ClanERMediumLaser@RightTorso(Front) G1 | ClanUltraAC2@LeftArm(Front) G1 | ClanUltraAC2@LeftArm(Front) G1 | ClanUltraAC2@LeftArm(Front) G1 | ClanUltraAC2@RightArm(Front) G1 | ClanUltraAC2@RightArm(Front) G1 | ClanUltraAC2@RightArm(Front) G1 | ClanLRM15@Special1(Side) G2 | ClanLRM15@Special2(Side) G2,LeftTorsox1 | RightTorsox1 | LeftArmx3 | RightArmx3 | Special1x1 | Special2x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O9) | RightTorso(M0/P0/B0/O9) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O3) | Special2(M0/P0/B0/O3),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Side) | Special2(Side),
|
|
||||||
Dragon,Yes,Clan,17.000000,60.000000,Standard,Standard,13,Single,0,Yes,Yes,Yes,Yes,43,,1.15,1.15,1.4,1.4,1.25,1.25,1.55,0.9,0.3,10.35,5,"3x MediumLaser, ERPPC, LRM10",MediumLaser@LeftArm(Front) G1 | MediumLaser@LeftTorso(Front) G1 | MediumLaser@RightTorso(Front) G1 | ERPPC@RightArm(Front) G1 | LRM10@CenterTorso(Side) G2,LeftArmx1 | LeftTorsox1 | RightTorsox1 | RightArmx1 | CenterTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Side) | Head(Unknown),
|
|
||||||
Duangung,No,IS,7.000000,25.000000,FerroFiberus,Standard,0,,0,Yes,No,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B2/O0) | RightArm(M0/P0/B2/O0) | CenterTorso(M2/P0/B0/O0) | Special1(M0/P0/B1/O0) | Special2(M0/P0/B1/O0),LeftArm(Unknown) | RightArm(Unknown) | CenterTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Fafnir,Yes,IS,21.000000,100.000000,FerroFiberus,Standard,7,Single,0,No,Yes,No,No,43,,1.8,1.8,1.9,1.9,2.0,2.0,2.2,1.0,0.3,14.9,7,"2x ClanGaussRifle, 2x LargeLaser, 3x MediumLaser",ClanGaussRifle@RightTorso(Front) G1 | ClanGaussRifle@LeftTorso(Front) G1 | LargeLaser@RightArm(Front) G1 | LargeLaser@LeftArm(Front) G1 | MediumLaser@RightTorso(Front) G1 | MediumLaser@CenterTorso(Front) G1 | MediumLaser@LeftTorso(Front) G1,RightTorsox2 | LeftTorsox2 | RightArmx1 | LeftArmx1 | CenterTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
Flea,Yes,IS,7.000000,20.000000,Standard,Standard,2,Single,0,No,Yes,Yes,Yes,43,,0.4,0.4,0.4,0.4,0.5,0.5,0.65,0.3,0.3,3.85,6,"2x SmallLaser, 2x MediumLaser, 2x MachineGun",SmallLaser@LeftTorso(Rear) G1 | SmallLaser@RightTorso(Rear) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@RightArm(Front) G1 | MachineGun@LeftArm(Front) G1 | MachineGun@RightArm(Front) G1,LeftTorsox1 | RightTorsox1 | LeftArmx2 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Rear) | RightTorso(Rear) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Gargoyle,No,Clan,15.000000,80.000000,FerroFiberus,EndoSteel,0,,0,No,Yes,No,No,6,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M1/P0/B0/O3) | RightArm(M1/P0/B0/O3) | LeftTorso(M0/P2/B2/O0) | RightTorso(M0/P2/B2/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Gesu,No,Clan,9.750000,45.000000,FerroFiberus,EndoSteel,0,,0,No,No,Yes,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P2/B0/O0) | RightArm(M0/P2/B0/O0) | LeftTorso(M0/P0/B2/O0) | RightTorso(M0/P0/B2/O0) | Special1(M2/P0/B0/O0) | Special2(M2/P0/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
Gladiator,Yes,Clan,24.000000,95.000000,FerroFiberus,Standard,19,Single,1,Yes,Yes,Yes,Yes,43,,1.4,1.4,1.65,1.65,1.75,1.75,2.0,0.95,0.25,12.8,12,"5x ClanSmallPulseLaser, ClanERSmallLaser, 3x ClanMediumPulseLaser, ClanLargePulseLaser, 2x SRM6",ClanSmallPulseLaser@RightTorso(Front) G1 | ClanSmallPulseLaser@RightTorso(Front) G1 | ClanSmallPulseLaser@RightArm(Front) G1 | ClanSmallPulseLaser@RightArm(Front) G1 | ClanSmallPulseLaser@RightArm(Front) G1 | ClanERSmallLaser@LeftTorso(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanLargePulseLaser@LeftArm(Front) G1 | SRM6@LeftArm(Front) G2 | SRM6@LeftArm(Front) G2,RightTorsox2 | RightArmx6 | LeftTorsox1 | LeftArmx3,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Grizzly,Yes,Clan,16.000000,70.000000,FerroFiberus,Standard,11,Single,1,Yes,Yes,Yes,Yes,40,,1.2,1.2,1.1,1.1,1.4,1.4,1.5,0.5,0.25,9.65,6,"2x ClanSmallPulseLaser, ClanMediumPulseLaser, ClanLargePulseLaser, ClanGaussRifle, CLANLRM10",ClanSmallPulseLaser@LeftArm(Front) G1 | ClanSmallPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@RightTorso(Front) G1 | ClanLargePulseLaser@LeftArm(Front) G1 | ClanGaussRifle@RightArm(Front) G1 | CLANLRM10@LeftTorso(Side) G2,LeftArmx3 | RightTorsox1 | RightArmx1 | LeftTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Front),
|
|
||||||
Hauptmann,Yes,Clan,21.000000,95.000000,Standard,Standard,20,Single,0,Yes,Yes,Yes,Yes,43,ECM,1.7,1.7,1.8,1.8,1.9,1.9,2.1,1.1,0.3,14.3,8,"ClanERSmallLaser, 2x ClanMediumPulseLaser, 2x ClanLargePulseLaser, ClanUltraAC20, 2x ClanSSRM2",ClanERSmallLaser@Head(Front) G1 | ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanLargePulseLaser@LeftArm(Front) G1 | ClanLargePulseLaser@RightArm(Front) G1 | ClanUltraAC20@Special1(Front) G1 | ClanSSRM2@LeftTorso(Front) G2 | ClanSSRM2@RightTorso(Front) G2,Headx1 | LeftArmx2 | RightArmx2 | Special1x1 | LeftTorsox1 | RightTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Front) | Special1(Front),
|
|
||||||
Hellhound,Yes,Clan,10.500000,50.000000,FerroFiberus,EndoSteel,12,Single,1,Yes,Yes,Yes,Yes,43,,0.9,0.9,0.95,0.95,1.05,1.05,1.2,0.55,0.25,7.8,6,"3x ClanMediumPulseLaser, ClanUltraAC2, ClanUltraAC5, ClanLRM10",ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanUltraAC2@RightTorso(Front) G1 | ClanUltraAC5@RightTorso(Front) G1 | ClanLRM10@LeftTorso(Side) G2,LeftArmx2 | RightArmx1 | RightTorsox2 | LeftTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Hellspawn,Yes,IS,10.000000,45.000000,Standard,Standard,9,Single,1,Yes,Yes,Yes,Yes,43,ECM,0.5,0.5,0.8,0.8,0.85,0.85,1.15,0.5,0.3,6.25,6,"2x MediumPulseLaser, LargePulseLaser, 2x SSRM2, LRM10",MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@LeftArm(Front) G1 | LargePulseLaser@LeftArm(Front) G1 | SSRM2@RightArm(Front) G2 | SSRM2@Special1(Front) G2 | LRM10@LeftTorso(Front) G2,LeftArmx3 | RightArmx1 | Special1x1 | LeftTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O8) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Unknown) | CenterTorso(Unknown) | Head(Unknown) | Special1(Front),
|
|
||||||
Highlander,Yes,IS,21.500000,90.000000,Standard,Standard,17,Single,1,Yes,Yes,Yes,Yes,43,,1.75,1.45,1.7,1.7,1.8,1.8,2.0,0.85,0.3,13.35,7,"4x MediumPulseLaser, GaussRifle, 2x SRM6",MediumPulseLaser@RightTorso(Front) G1 | MediumPulseLaser@RightTorso(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | GaussRifle@LeftArm(Front) G1 | SRM6@LeftTorso(Front) G2 | SRM6@LeftTorso(Front) G2,RightTorsox2 | RightArmx2 | LeftArmx1 | LeftTorsox2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Hollander,Yes,IS,10.000000,45.000000,FerroFiberus,EndoSteel,12,Single,0,No,Yes,Yes,Yes,42,,0.85,0.85,0.85,0.85,0.9,0.9,1.05,0.45,0.25,6.95,6,"2x SmallPulseLaser, 3x MediumPulseLaser, GaussRifle",SmallPulseLaser@Special2(Front) G1 | SmallPulseLaser@Special2(Front) G1 | MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@LeftTorso(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | GaussRifle@Special1(Front) G1,Special2x2 | LeftArmx1 | LeftTorsox1 | RightArmx1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | Special1(M0/P0/B0/O12) | Special2(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | Special1(Front) | Special2(Front),
|
|
||||||
Hunchback,Yes,IS,13.500000,50.000000,Standard,Standard,10,Single,0,Yes,Yes,Yes,Yes,43,ECM,1.0,1.0,1.1,1.1,1.2,1.2,1.5,0.5,0.3,8.9,6,"SmallLaser, 4x MediumLaser, AC10",SmallLaser@Head(Front) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@RightArm(Front) G1 | MediumLaser@RightArm(Front) G1 | AC10@Special1(Front) G1,Headx1 | LeftArmx2 | RightArmx2 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O8) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown) | Head(Front) | Special1(Front),
|
|
||||||
Kodiak,Yes,IS,22.000000,100.000000,Standard,EndoSteel,20,Single,1,Yes,Yes,Yes,Yes,43,,1.5,1.5,1.9,1.9,1.5,1.5,2,1.1,0.3,13.2,7,"4x ClanERMediumLaser, ClanUltraAC20, 2x ClanSSRM6",ClanERMediumLaser@leftArm(Front) G1 | ClanERMediumLaser@leftArm(Front) G1 | ClanERMediumLaser@rightarm(Front) G1 | ClanERMediumLaser@rightarm(Front) G1 | ClanUltraAC20@RightTorso(Front) G1 | ClanSSRM6@LeftTorso(Front) G2 | ClanSSRM6@LeftTorso(Front) G2,leftArmx2 | rightarmx2 | RightTorsox1 | LeftTorsox2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Loki,Yes,Clan,17.500000,65.000000,Standard,Standard,13,Single,0,No,Yes,Yes,Yes,43,ECM,1.3,1.3,1.4,1.4,1.5,1.5,1.55,0.6,0.3,10.85,7,"2x ClanERMediumLaser, 2x ClanMachineGun, 2x ClanUltraAC5, ClanSSRM6",ClanERMediumLaser@LeftArm(Front) G1 | ClanERMediumLaser@RightArm(Front) G1 | ClanMachineGun@LeftTorso(Front) G1 | ClanMachineGun@RightTorso(Front) G1 | ClanUltraAC5@LeftArm(Front) G1 | ClanUltraAC5@RightArm(Front) G1 | ClanSSRM6@Special1(Front) G2,LeftArmx2 | RightArmx2 | LeftTorsox1 | RightTorsox1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O10) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Front),
|
|
||||||
Longbow,Yes,IS,20.500000,85.000000,Standard,Standard,11,Single,0,No,Yes,Yes,Yes,43,,1.6,1.6,1.65,1.65,1.2,1.2,1.85,1.0,0.3,12.05,6,"2x MediumLaser, 2x LRM5, 2x LRM20",MediumLaser@LeftTorso(Front) G1 | MediumLaser@RightTorso(Front) G1 | LRM5@LeftTorso(Front) G2 | LRM5@RightTorso(Front) G2 | LRM20@LeftArm(Front) G2 | LRM20@RightArm(Front) G2,LeftTorsox2 | RightTorsox2 | LeftArmx1 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
MadCat_MkII,Yes,Clan,18.500000,90.000000,Reflective,EndoSteel,17,Single,1,Yes,Yes,Yes,Yes,43,,1.8,1.8,1.8,1.8,1.85,1.85,2.0,0.8,0.3,14,12,"4x ClanERSmallLaser, 2x ClanMachineGun, 4x ClanUltraAC5, 2x ClanLRM15",ClanERSmallLaser@LeftTorso(Front) G1 | ClanERSmallLaser@CenterTorso(Front) G1 | ClanERSmallLaser@CenterTorso(Front) G1 | ClanERSmallLaser@RightTorso(Front) G1 | ClanMachineGun@LeftTorso(Front) G1 | ClanMachineGun@RightTorso(Front) G1 | ClanUltraAC5@LeftArm(Front) G1 | ClanUltraAC5@LeftArm(Front) G1 | ClanUltraAC5@RightArm(Front) G1 | ClanUltraAC5@RightArm(Front) G1 | ClanLRM15@Special2(Side) G2 | ClanLRM15@Special1(Side) G2,LeftTorsox2 | CenterTorsox2 | RightTorsox2 | LeftArmx2 | RightArmx2 | Special2x1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O8) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4) | Special2(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Front) | Head(Unknown) | Special1(Side) | Special2(Side),
|
|
||||||
Madcat,Yes,Clan,16.500000,75.000000,FerroFiberus,EndoSteel,17,Single,0,Yes,Yes,Yes,Yes,43,,1.1,1.1,1.2,1.2,1.4,1.4,1.5,0.5,0.25,9.65,8,"2x ClanMediumPulseLaser, 2x ClanERLargeLaser, 2x ClanMachineGun, 2x ClanLRM10",ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanERLargeLaser@LeftArm(Front) G1 | ClanERLargeLaser@RightArm(Front) G1 | ClanMachineGun@LeftTorso(Front) G1 | ClanMachineGun@RightTorso(Front) G1 | ClanLRM10@Special1(Side) G2 | ClanLRM10@Special2(Side) G2,LeftArmx2 | RightArmx2 | LeftTorsox1 | RightTorsox1 | Special1x1 | Special2x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O9) | RightTorso(M0/P0/B0/O9) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O3) | Special2(M0/P0/B0/O3),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Side) | Special2(Side),
|
|
||||||
Masakari,Yes,Clan,18.000000,85.000000,FerroFiberus,Standard,15,Single,0,Yes,Yes,Yes,Yes,43,,1.25,1.25,1.4,1.4,1.45,1.45,1.8,0.85,0.25,11.1,7,"2x ClanERMediumLaser, 2x ClanUltraAC2, ClanGaussRifle, 2x ClanLRM10",ClanERMediumLaser@RightTorso(Front) G1 | ClanERMediumLaser@RightTorso(Front) G1 | ClanUltraAC2@RightArm(Front) G1 | ClanUltraAC2@RightArm(Front) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanLRM10@LeftTorso(Side) G2 | ClanLRM10@LeftTorso(Side) G2,RightTorsox2 | RightArmx2 | LeftArmx1 | LeftTorsox2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Mauler,Yes,IS,26.000000,90.000000,FerroFiberus,Standard,11,Single,0,No,Yes,Yes,Yes,43,,1.4,1.4,1.4,1.4,1.55,1.55,1.45,0.8,0.25,11.2,10,"2x GaussRifle, 2x SSRM4, 6x LRM5",GaussRifle@LeftArm(Front) G1 | GaussRifle@RightArm(Front) G1 | SSRM4@LeftTorso(Front) G2 | SSRM4@RightTorso(Front) G2 | LRM5@LeftTorso(Side) G2 | LRM5@LeftTorso(Side) G2 | LRM5@LeftTorso(Side) G2 | LRM5@RightTorso(Side) G2 | LRM5@RightTorso(Side) G2 | LRM5@RightTorso(Side) G2,LeftArmx1 | RightArmx1 | LeftTorsox4 | RightTorsox4,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front+Side) | RightTorso(Front+Side) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Novacat,Yes,Clan,16.000000,70.000000,Reactive,EndoSteel,17,Single,1,Yes,Yes,Yes,Yes,43,ECM,1.55,1.55,1.45,1.45,1.5,1.5,1.7,0.75,0.3,11.75,7,"5x ClanMediumPulseLaser, 2x ClanERLargeLaser",ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@LeftTorso(Front) G1 | ClanMediumPulseLaser@RightTorso(Front) G1 | ClanERLargeLaser@RightArm(Front) G1 | ClanERLargeLaser@RightArm(Front) G1,LeftArmx3 | LeftTorsox1 | RightTorsox1 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Osiris,Yes,IS,9.500000,30.000000,FerroFiberus,EndoSteel,11,Single,1,Yes,Yes,Yes,Yes,43,,0.6,0.6,0.6,0.6,0.65,0.65,0.75,0.3,0.25,5,5,"SmallPulseLaser, 2x MediumPulseLaser, SSRM2, NarcBeacon",SmallPulseLaser@special2(Front) G1 | MediumPulseLaser@special1(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | SSRM2@LeftArm(Front) G2 | NarcBeacon@LeftArm(Front) G3,special2x1 | special1x1 | RightArmx1 | LeftArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O1) | Special2(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | Head(Unknown) | Special1(Unknown) | Special2(Unknown),
|
|
||||||
Owens,Yes,IS,9.750000,35.000000,Standard,Standard,5,Single,0,No,Yes,Yes,Yes,39,ECM,0.9,0.9,0.8,0.8,0.8,0.8,1.05,0.35,0.3,6.7,5,"2x SmallLaser, MediumLaser, 2x SRM6",SmallLaser@CenterTorso(Front) G1 | SmallLaser@CenterTorso(Front) G1 | MediumLaser@Head(Front) G1 | SRM6@LeftArm(Front) G2 | SRM6@RightArm(Front) G2,CenterTorsox2 | Headx1 | LeftArmx1 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O8) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Front) | Head(Front),
|
|
||||||
Puma,Yes,Clan,7.500000,35.000000,FerroFiberus,EndoSteel,10,Single,1,Yes,Yes,Yes,Yes,43,,0.8,0.8,0.6,0.6,0.6,0.6,0.85,0.45,0.25,5.55,4,"2x ClanSmallPulseLaser, 2x ClanLRM20",ClanSmallPulseLaser@LeftTorso(Front) G1 | ClanSmallPulseLaser@RightTorso(Front) G1 | ClanLRM20@LeftArm(Front) G2 | ClanLRM20@RightArm(Front) G2,LeftTorsox1 | RightTorsox1 | LeftArmx1 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Raven,Yes,IS,10.250000,35.000000,FerroFiberus,Standard,7,Single,0,No,Yes,Yes,Yes,43,"BAP, ECM",0.6,0.65,0.65,0.65,0.7,0.7,0.75,0.25,0.25,5.2,5,"2x MediumLaser, SRM6, LRM5, NarcBeacon",MediumLaser@RightArm(Front) G1 | MediumLaser@RightArm(Front) G1 | SRM6@RightTorso(Front) G2 | LRM5@RightTorso(Side) G2 | NarcBeacon@LeftArm(Front) G3,RightArmx2 | RightTorsox2 | LeftArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Front+Side) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Rifleman,Yes,IS,12.500000,60.000000,FerroFiberus,EndoSteel,17,Single,0,Yes,Yes,Yes,Yes,43,,0.9,0.9,1.0,1.0,1.5,1.5,1.3,0.7,0.25,9.05,6,"2x MediumLaser, 2x LargeLaser, 2x PPC",MediumLaser@Special1(Front) G1 | MediumLaser@Special1(Front) G1 | LargeLaser@LeftArm(Front) G1 | LargeLaser@RightArm(Front) G1 | PPC@LeftArm(Front) G1 | PPC@RightArm(Front) G1,Special1x2 | LeftArmx2 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | Head(Unknown) | Special1(Front),
|
|
||||||
Ryoken,Yes,IS,12.500000,55.000000,FerroFiberus,EndoSteel,10,Single,1,Yes,Yes,Yes,Yes,43,ECM,0.9,0.9,1.0,1.0,1.05,1.05,1.15,0.75,0.25,8.05,6,"4x ClanMediumPulseLaser, 2x ClanSSRM6",ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@LeftArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanSSRM6@LeftTorso(Front) G2 | ClanSSRM6@RightTorso(Front) G2,LeftArmx2 | RightArmx2 | LeftTorsox1 | RightTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Shadowcat,Yes,Clan,9.750000,45.000000,FerroFiberus,EndoSteel,10,Single,1,Yes,Yes,Yes,Yes,43,BAP,0.85,0.85,0.85,0.85,0.9,0.9,1.05,0.45,0.25,6.95,5,"2x ClanMediumPulseLaser, ClanGaussRifle, 2x ClanSSRM4",ClanMediumPulseLaser@RightTorso(Front) G1 | ClanMediumPulseLaser@RightArm(Front) G1 | ClanGaussRifle@LeftArm(Front) G1 | ClanSSRM4@LeftTorso(Front) G2 | ClanSSRM4@RightTorso(Front) G2,RightTorsox2 | RightArmx1 | LeftArmx1 | LeftTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Solitaire,Yes,Clan,7.000000,25.000000,FerroFiberus,EndoSteel,10,Single,0,Yes,Yes,Yes,Yes,46,,0.6,0.6,0.6,0.6,0.55,0.55,0.8,0.4,0.25,4.95,4,"ClanERSmallLaser, 2x ClanERMediumLaser, ClanERLargeLaser",ClanERSmallLaser@LeftTorso(Front) G1 | ClanERMediumLaser@LeftTorso(Front) G1 | ClanERMediumLaser@CenterTorso(Front) G1 | ClanERLargeLaser@Special1(Front) G1,LeftTorsox2 | CenterTorsox1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O3),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Front) | RightTorso(Unknown) | CenterTorso(Front) | Head(Unknown) | Special1(Front),
|
|
||||||
Sunder,Yes,IS,17.500000,90.000000,Standard,Standard,17,Single,0,Yes,Yes,Yes,Yes,43,,1.35,1.35,1.55,1.55,1.65,1.65,2.0,1.0,0.3,12.4,10,"6x MediumLaser, PPC, 2x MachineGun, SRM6",MediumLaser@LeftTorso(Front) G1 | MediumLaser@LeftTorso(Front) G1 | MediumLaser@LeftTorso(Rear) G1 | MediumLaser@RightTorso(Rear) G1 | MediumLaser@RightTorso(Front) G1 | MediumLaser@RightTorso(Front) G1 | PPC@LeftArm(Front) G1 | MachineGun@RightArm(Front) G1 | MachineGun@RightArm(Front) G1 | SRM6@CenterTorso(Front) G2,LeftTorsox3 | RightTorsox3 | LeftArmx1 | RightArmx2 | CenterTorsox1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front+Rear) | RightTorso(Front+Rear) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
Templar,Yes,IS,20.500000,85.000000,Standard,EndoSteel,25,Single,1,Yes,Yes,Yes,Yes,43,,1.45,1.45,1.6,1.6,1.8,1.8,2.05,0.95,0.3,13,11,"6x MediumPulseLaser, PPC, 2x MachineGun, AC20, SRM4",MediumPulseLaser@LeftArm(Front) G1 | MediumPulseLaser@LeftTorso(Front) G1 | MediumPulseLaser@RightTorso(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | MediumPulseLaser@LeftTorso(Rear) G1 | MediumPulseLaser@RightTorso(Rear) G1 | PPC@LeftArm(Front) G1 | MachineGun@LeftTorso(Front) G1 | MachineGun@RightTorso(Front) G1 | AC20@RightArm(Front) G1 | SRM4@RightTorso(Front) G2,LeftArmx2 | LeftTorsox3 | RightTorsox4 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front+Rear) | RightTorso(Front+Rear) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Thanatos,Yes,IS,18.000000,75.000000,FerroFiberus,EndoSteel,20,Single,1,Yes,Yes,Yes,Yes,43,,0.9,0.9,1.3,1.3,1.2,1.2,1.6,0.85,0.25,9.5,7,"MediumPulseLaser, 2x MediumLaser, 2x LargePulseLaser, 2x LRM10",MediumPulseLaser@LeftTorso(Front) G1 | MediumLaser@LeftArm(Front) G1 | MediumLaser@RightTorso(Front) G1 | LargePulseLaser@LeftArm(Front) G1 | LargePulseLaser@RightTorso(Front) G1 | LRM10@RightArm(Front) G2 | LRM10@RightArm(Front) G2,LeftTorsox1 | LeftArmx2 | RightTorsox2 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Thor,Yes,Clan,19.000000,70.000000,FerroFiberus,Standard,20,Single,1,Yes,Yes,Yes,Yes,43,,1.1,1.1,1.2,1.2,1.4,1.4,1.5,0.5,0.25,9.65,7,"2x ClanMediumPulseLaser, ClanERPPC, 2x ClanMachineGun, ClanUltraAC10, CLANLRM10",ClanMediumPulseLaser@LeftTorso(Front) G1 | ClanMediumPulseLaser@RightTorso(Front) G1 | ClanERPPC@RightArm(Front) G1 | ClanMachineGun@LeftTorso(Front) G1 | ClanMachineGun@RightTorso(Front) G1 | ClanUltraAC10@LeftArm(Front) G1 | CLANLRM10@Special1(Side) G2,LeftTorsox2 | RightTorsox2 | RightArmx1 | LeftArmx1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O10) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown) | Special1(Side),
|
|
||||||
Uller,Yes,Clan,8.000000,30.000000,FerroFiberus,EndoSteel,8,Single,0,Yes,Yes,Yes,Yes,43,ECM,0.45,0.45,0.5,0.5,0.6,0.6,0.65,0.45,0.25,4.45,4,"ClanERSmallLaser, ClanERMediumLaser, ClanUltraAC5, ClanSRM6",ClanERSmallLaser@LeftArm(Front) G1 | ClanERMediumLaser@RightArm(Front) G1 | ClanUltraAC5@RightArm(Front) G1 | ClanSRM6@LeftArm(Front) G2,LeftArmx2 | RightArmx2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Uziel,Yes,IS,11.500000,50.000000,Standard,EndoSteel,10,Single,1,Yes,Yes,Yes,Yes,45,,1.2,1.2,1.05,1.05,1.15,1.15,1.0,0.45,0.3,8.55,7,"2x SmallPulseLaser, PPC, 2x MachineGun, UltraAC5, LRM10",SmallPulseLaser@LeftTorso(Front) G1 | SmallPulseLaser@RightTorso(Front) G1 | PPC@LeftArm(Front) G1 | MachineGun@LeftTorso(Front) G1 | MachineGun@RightTorso(Front) G1 | UltraAC5@RightArm(Front) G1 | LRM10@Special1(Side) G2,LeftTorsox2 | RightTorsox2 | LeftArmx1 | RightArmx1 | Special1x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O4),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | Head(Unknown) | Special1(Side),
|
|
||||||
Victor,Yes,IS,17.000000,80.000000,Standard,EndoSteel,10,Single,1,Yes,Yes,Yes,Yes,43,ECM,1.3,1.3,1.3,1.3,1.25,1.25,1.65,1.1,0.3,10.75,7,"2x MediumLaser, 2x MachineGun, AC20, 2x SRM4",MediumLaser@LeftArm(Front) G1 | MediumLaser@LeftArm(Front) G1 | MachineGun@LeftTorso(Front) G1 | MachineGun@RightTorso(Front) G1 | AC20@RightArm(Front) G1 | SRM4@LeftTorso(Front) G2 | SRM4@RightTorso(Front) G2,LeftArmx2 | LeftTorsox2 | RightTorsox2 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Unknown) | Head(Unknown),
|
|
||||||
Vulture,Yes,Clan,16.000000,60.000000,Reactive,EndoSteel,12,Single,0,No,Yes,Yes,Yes,43,BAP,1.3,1.3,1.5,1.5,1.6,1.6,1.75,0.5,0.3,11.35,10,"4x ClanMachineGun, 2x ClanLargePulseLaser, 2x ClanLRM5, 2x ClanLRM10",ClanMachineGun@LeftArm(Front) G1 | ClanMachineGun@Special1(Front) G1 | ClanMachineGun@Special1(Front) G1 | ClanMachineGun@RightArm(Front) G1 | ClanLargePulseLaser@LeftArm(Front) G1 | ClanLargePulseLaser@RightArm(Front) G1 | ClanLRM5@LeftTorso(Side) G2 | ClanLRM5@RightTorso(Side) G2 | ClanLRM10@LeftTorso(Side) G2 | ClanLRM10@RightTorso(Side) G2,LeftArmx2 | Special1x2 | RightArmx2 | LeftTorsox2 | RightTorsox2,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Head(M0/P0/B0/O1) | Special1(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Side) | RightTorso(Side) | Head(Unknown) | Special1(Front),
|
|
||||||
Warhammer,Yes,IS,15.000000,70.000000,Standard,Standard,17,Single,0,Yes,Yes,Yes,Yes,43,,1.55,1.55,1.45,1.45,1.5,1.5,1.7,0.75,0.3,11.75,5,"2x MediumLaser, 2x ERPPC, SRM6",MediumLaser@RightTorso(Front) G1 | MediumLaser@LeftTorso(Front) G1 | ERPPC@RightArm(Front) G1 | ERPPC@LeftArm(Front) G1 | SRM6@special2(Front) G2,RightTorsox1 | LeftTorsox1 | RightArmx1 | LeftArmx1 | special2x1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | Special2(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | Special2(Unknown),
|
|
||||||
Wolfhound,Yes,Clan,10.250000,35.000000,FerroFiberus,EndoSteel,14,Single,0,Yes,Yes,Yes,Yes,43,ECM,0.5,0.5,0.7,0.7,0.75,0.75,0.95,0.5,0.25,5.6,5,"3x ClanMediumPulseLaser, ClanERMediumLaser, ClanERLargeLaser",ClanMediumPulseLaser@LeftTorso(Front) G1 | ClanMediumPulseLaser@CenterTorso(Front) G1 | ClanMediumPulseLaser@RightTorso(Front) G1 | ClanERMediumLaser@CenterTorso(Rear) G1 | ClanERLargeLaser@RightArm(Front) G1,LeftTorsox1 | CenterTorsox2 | RightTorsox1 | RightArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Unknown) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front) | CenterTorso(Front+Rear) | Head(Unknown),
|
|
||||||
Zeus,Yes,IS,22.000000,80.000000,FerroFiberus,Standard,22,Single,0,Yes,Yes,Yes,Yes,43,,1.1,1.1,1.25,1.25,1.45,1.45,1.55,0.8,0.25,10.2,7,"4x MediumPulseLaser, ERLargeLaser, ERPPC, LRM15",MediumPulseLaser@LeftTorso(Front) G1 | MediumPulseLaser@RightTorso(Front) G1 | MediumPulseLaser@RightArm(Front) G1 | MediumPulseLaser@RightTorso(Rear) G1 | ERLargeLaser@CenterTorso(Front) G1 | ERPPC@LeftArm(Front) G1 | LRM15@RightArm(Front) G2,LeftTorsox1 | RightTorsox2 | RightArmx2 | CenterTorsox1 | LeftArmx1,LeftArm(M0/P0/B0/O8) | RightArm(M0/P0/B0/O8) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2) | Head(M0/P0/B0/O1),LeftArm(Front) | RightArm(Front) | LeftTorso(Front) | RightTorso(Front+Rear) | CenterTorso(Front) | Head(Unknown),
|
|
||||||
jenner2c,No,Clan,10.000000,35.000000,FerroFiberus,Standard,0,,0,Yes,Yes,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M2/P0/B2/O0) | RightArm(M2/P0/B2/O0) | Special1(M3/P0/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | Special1(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
koto,No,IS,7.000000,25.000000,FerroFiberus,EndoSteel,0,,0,No,Yes,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P1/B1/O0) | RightArm(M0/P1/B1/O0) | CenterTorso(M0/P0/B2/O0) | Special1(M0/P0/B3/O0),LeftArm(Unknown) | RightArm(Unknown) | CenterTorso(Unknown) | Special1(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
locust2c,No,Clan,7.000000,25.000000,FerroFiberus,EndoSteel,0,,0,No,Yes,No,No,4,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B1/O2) | RightArm(M0/P0/B1/O2) | Special1(M0/P0/B3/O0),LeftArm(Unknown) | RightArm(Unknown) | Special1(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
marauder2,No,IS,22.000000,100.000000,FerroFiberus,EndoSteel,0,,0,Yes,No,Yes,No,6,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B4/O1) | RightArm(M0/P0/B4/O1) | LeftTorso(M0/P0/B1/O1) | RightTorso(M0/P0/B1/O1) | Special1(M0/P7/B0/O0) | Special2(M0/P0/B0/O2),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
pitbull,No,Clan,15.000000,70.000000,FerroFiberus,EndoSteel,0,,0,Yes,No,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P2/B2/O0) | RightArm(M0/P2/B2/O0) | LeftTorso(M0/P0/B2/O0) | RightTorso(M0/P0/B2/O0) | Special1(M0/P4/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | Special1(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
privateer,No,IS,12.500000,55.000000,FerroFiberus,Standard,0,,0,No,No,Yes,No,2,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P1/B0/O1) | RightArm(M0/P1/B0/O1) | LeftTorso(M0/P2/B2/O0) | RightTorso(M0/P0/B1/O0) | Special1(M4/P0/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | Special1(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
razorback,No,IS,9.000000,30.000000,FerroFiberus,EndoSteel,0,,0,No,Yes,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M2/P0/B2/O0) | RightArm(M0/P0/B3/O0) | Special1(M0/P2/B0/O0) | Special2(M0/P2/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
reaper,No,Clan,16.500000,75.000000,FerroFiberus,EndoSteel,0,,0,Yes,Yes,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B3/O0) | RightArm(M0/P0/B3/O0) | LeftTorso(M0/P0/B2/O0) | RightTorso(M0/P0/B2/O0) | CenterTorso(M0/P6/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
reaver,No,Clan,10.000000,40.000000,FerroFiberus,EndoSteel,0,,0,Yes,No,Yes,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B3/O0) | RightArm(M0/P0/B3/O0) | LeftTorso(M0/P0/B1/O0) | RightTorso(M0/P0/B1/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
shadowhawk,No,IS,12.500000,55.000000,FerroFiberus,Standard,0,,0,Yes,Yes,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P1/B2/O0) | RightArm(M0/P0/B3/O0) | LeftTorso(M0/P0/B1/O0) | RightTorso(M0/P0/B1/O0) | Special1(M0/P2/B0/O0) | Special2(M2/P0/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
strider,No,IS,11.000000,40.000000,FerroFiberus,Standard,0,,0,No,No,Yes,No,4,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M2/P0/B0/O0) | RightArm(M2/P0/B0/O0) | LeftTorso(M0/P0/B0/O2) | RightTorso(M0/P0/B0/O2) | CenterTorso(M0/P0/B2/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
urbanmech,Yes,IS,5.000000,30.000000,Standard,Standard,8,Single,0,Yes,Yes,No,No,50,,0.45,0.45,0.5,0.5,0.6,0.6,0.65,0.45,0.25,4.45,2,"SmallLaser, AC20",SmallLaser@LeftArm(Front) G1 | AC20@RightArm(Front) G1,LeftArmx1 | RightArmx1,LeftArm(M0/P0/B0/O12) | RightArm(M0/P0/B0/O12) | LeftTorso(M0/P0/B0/O12) | RightTorso(M0/P0/B0/O12) | CenterTorso(M0/P0/B0/O2),LeftArm(Front) | RightArm(Front) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown),
|
|
||||||
urbanmech_iic,No,Clan,5.000000,30.000000,FerroFiberus,Standard,0,,0,Yes,Yes,No,No,,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P2/B2/O0) | RightArm(M0/P0/B4/O0) | LeftTorso(M0/P1/B0/O0) | RightTorso(M0/P1/B0/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
ursus,No,Clan,10.500000,50.000000,FerroFiberus,Standard,0,,0,No,Yes,No,No,3,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P0/B0/O3) | RightArm(M0/P0/B4/O0) | CenterTorso(M2/P0/B0/O0) | Special1(M0/P0/B1/O0) | Special2(M0/P0/B1/O0),LeftArm(Unknown) | RightArm(Unknown) | CenterTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
vulture2,No,Clan,16.500000,75.000000,FerroFiberus,EndoSteel,0,,0,No,Yes,No,No,5,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P3/B0/O0) | RightArm(M0/P0/B0/O3) | LeftTorso(M2/P0/B2/O0) | RightTorso(M2/P0/B2/O0) | Special1(M0/P0/B0/O2) | Special2(M0/P0/B2/O0),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
vulturec,No,Clan,14.000000,60.000000,FerroFiberus,Standard,0,,0,No,Yes,No,No,3,,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.9,0,,,,LeftArm(M0/P3/B0/O0) | RightArm(M0/P3/B0/O0) | LeftTorso(M2/P0/B0/O0) | RightTorso(M2/P0/B0/O0) | CenterTorso(M0/P0/B0/O1) | Special1(M0/P0/B0/O1) | Special2(M0/P0/B0/O1),LeftArm(Unknown) | RightArm(Unknown) | LeftTorso(Unknown) | RightTorso(Unknown) | CenterTorso(Unknown) | Special1(Unknown) | Special2(Unknown),"not registered in active mech tables; missing M_* mech ID defines; core mech files exist; not fully packaged (core.build, props.build, textures.build); missing display/name string IDs (IDS/DNL); no loose hsh bmp in Mechs/MFD/hud"
|
|
||||||
|
@@ -1,654 +0,0 @@
|
|||||||
# mech_loadouts.csv Catch-Up Notes
|
|
||||||
|
|
||||||
This document is for future AI agents or maintainers who need to understand how [mech_loadouts.csv](mech_loadouts.csv) was built, where each column comes from, and what files must be updated together when mech data changes.
|
|
||||||
|
|
||||||
## Purpose
|
|
||||||
|
|
||||||
`mech_loadouts.csv` is a flattened mech audit sheet built from the FireStorm content tree. It combines:
|
|
||||||
- mech identity and stat data
|
|
||||||
- current in-game playability status
|
|
||||||
- installed/default weapon loadouts
|
|
||||||
- weapon facing and grouping metadata
|
|
||||||
- zone hardpoint capacity
|
|
||||||
- notes about missing registration, packaging, or asset support
|
|
||||||
|
|
||||||
The CSV is not a primary source of truth. It is a synthesized report built from the mech content files and several registration tables.
|
|
||||||
|
|
||||||
## Current CSV Column Layout
|
|
||||||
|
|
||||||
The important derived columns are:
|
|
||||||
- `In_game_playable`
|
|
||||||
- `Weapons_With_Locations`
|
|
||||||
- `Default_Installed_Locations`
|
|
||||||
- `Available_Slot_Capacity_By_Zone`
|
|
||||||
- `Available_Hardpoints`
|
|
||||||
- `notes`
|
|
||||||
|
|
||||||
The existing stat columns before those are mostly direct mech data fields and were not re-derived during the audit.
|
|
||||||
|
|
||||||
## What Each Derived Column Means
|
|
||||||
|
|
||||||
### `In_game_playable`
|
|
||||||
|
|
||||||
`Yes` if the mech is currently in the active playable roster, `No` otherwise.
|
|
||||||
|
|
||||||
This was determined by comparing the mech folder set against the active registration chain:
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MechLabHeaders.h`
|
|
||||||
- `Gameleap/mw4/Content/ShellScripts/MechLabHeaders.h`
|
|
||||||
- `Gameleap/mw4/Content/Tables/MechChassisTable.tbl`
|
|
||||||
- `Gameleap/mw4/Content/Tables/MechTable.tbl`
|
|
||||||
- `Gameleap/mw4/Content/core.build`
|
|
||||||
- plus supporting string and packaging manifests
|
|
||||||
|
|
||||||
Practical rule:
|
|
||||||
- folder presence alone does not make a mech playable
|
|
||||||
- playable mechs must have the ID/table/build registrations aligned
|
|
||||||
|
|
||||||
### `Weapons_With_Locations`
|
|
||||||
|
|
||||||
This column lists each installed weapon in the mech¡¯s default subsystem file, with:
|
|
||||||
- the weapon name
|
|
||||||
- the `InternalLocation`
|
|
||||||
- the `WeaponFacing`
|
|
||||||
- the weapon group
|
|
||||||
|
|
||||||
Current format:
|
|
||||||
- `WeaponName@Location(Facing) G#`
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
- `MediumPulseLaser@LeftTorso(Rear) G1`
|
|
||||||
- `SRM4@RightTorso(Front) G2`
|
|
||||||
- `ClanLRM10@LeftTorso(Side) G2`
|
|
||||||
|
|
||||||
Derived from the mech¡¯s `.subsystems` file by reading weapon subsystem blocks.
|
|
||||||
|
|
||||||
Important notes:
|
|
||||||
- `WeaponFacing=0` => `Front`
|
|
||||||
- `WeaponFacing=1` => `Rear`
|
|
||||||
- `WeaponFacing=2` => `Side`
|
|
||||||
- if `WeaponFacing` is absent, it defaults to `Front`
|
|
||||||
|
|
||||||
### `Default_Installed_Locations`
|
|
||||||
|
|
||||||
A compact count summary of where the mech¡¯s default weapons are installed, based on `InternalLocation` in the `.subsystems` file.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
- `LeftArmx2 | LeftTorsox3 | RightTorsox4 | RightArmx2`
|
|
||||||
|
|
||||||
This is about installed weapons, not slot capacity.
|
|
||||||
|
|
||||||
### `Available_Slot_Capacity_By_Zone`
|
|
||||||
|
|
||||||
A compact summary of zone capacities from the mech¡¯s `.damage` file.
|
|
||||||
|
|
||||||
Current format:
|
|
||||||
- `Zone(M# / P# / B# / O#)`
|
|
||||||
|
|
||||||
Where:
|
|
||||||
- `M` = MissileSlots
|
|
||||||
- `P` = ProjectileSlots
|
|
||||||
- `B` = BeamSlots
|
|
||||||
- `O` = OmniSlots
|
|
||||||
|
|
||||||
Example:
|
|
||||||
- `LeftTorso(M0/P2/B2/O0)`
|
|
||||||
|
|
||||||
This reflects what the mech can support in that zone, not what is currently installed.
|
|
||||||
|
|
||||||
### `Available_Hardpoints`
|
|
||||||
|
|
||||||
A list of zones that have at least one positive slot count in the `.damage` file.
|
|
||||||
|
|
||||||
Current format:
|
|
||||||
- `LeftArm(Front)`
|
|
||||||
- `LeftTorso(Front+Rear)`
|
|
||||||
- `RightTorso(Side)`
|
|
||||||
|
|
||||||
This column is a directional summary of where weapons can be mounted.
|
|
||||||
|
|
||||||
Important:
|
|
||||||
- this is derived from slot capacity plus facing information from weapon loadouts
|
|
||||||
- it is not a literal mechanical port map
|
|
||||||
- if a zone has multiple facing types in the mech¡¯s default loadout, it can show a combined label such as `Front+Rear` or `Front+Side`
|
|
||||||
|
|
||||||
## Core Data Sources
|
|
||||||
|
|
||||||
### 1. Mech registration and playability
|
|
||||||
|
|
||||||
Primary files:
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MechLabHeaders.h`
|
|
||||||
- `Gameleap/mw4/Content/ShellScripts/MechLabHeaders.h`
|
|
||||||
- `Gameleap/mw4/Content/Tables/MechChassisTable.tbl`
|
|
||||||
- `Gameleap/mw4/Content/Tables/MechTable.tbl`
|
|
||||||
- `Gameleap/mw4/Content/core.build`
|
|
||||||
|
|
||||||
What they control:
|
|
||||||
- which mechs are actually in the active roster
|
|
||||||
- which IDs exist in code and script space
|
|
||||||
- which mech resources are packed into the runtime build
|
|
||||||
|
|
||||||
If a mech folder exists but it is not listed in these files, it is usually not playable.
|
|
||||||
|
|
||||||
### 2. Default weapon loadout and weapon-facing metadata
|
|
||||||
|
|
||||||
Primary file:
|
|
||||||
- `Gameleap/mw4/Content/Mechs/<MechName>/<mech>.subsystems`
|
|
||||||
|
|
||||||
Each weapon block typically contains:
|
|
||||||
- `Model=` weapon subsystem resource
|
|
||||||
- `InternalLocation=` where the weapon is mounted
|
|
||||||
- `Site=` mount port name
|
|
||||||
- `GroupIndex=` weapon group number
|
|
||||||
- `WeaponFacing=` optional facing metadata
|
|
||||||
- `AmmoCount=` for ammo-using weapons
|
|
||||||
|
|
||||||
The `.subsystems` file is the source for:
|
|
||||||
- `Weapons_With_Locations`
|
|
||||||
- `Default_Installed_Locations`
|
|
||||||
- facing annotations in the hardpoint summaries
|
|
||||||
|
|
||||||
### 3. Slot capacity / hardpoint support
|
|
||||||
|
|
||||||
Primary file:
|
|
||||||
- `Gameleap/mw4/Content/Mechs/<MechName>/<mech>.damage`
|
|
||||||
|
|
||||||
Each section such as `[LeftArmInternal]` or `[RightTorsoInternal]` may contain:
|
|
||||||
- `MissileSlots=`
|
|
||||||
- `ProjectileSlots=`
|
|
||||||
- `BeamSlots=`
|
|
||||||
- `OmniSlots=`
|
|
||||||
|
|
||||||
These are used to derive:
|
|
||||||
- `Available_Slot_Capacity_By_Zone`
|
|
||||||
- `Available_Hardpoints`
|
|
||||||
|
|
||||||
### 4. Weapon slot type rules in code
|
|
||||||
|
|
||||||
Relevant code:
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MWDamageObject.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MWDamageObject.hpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MechLab.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Subsystem_Tool.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon_Tool.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon.hpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/hudweapon.cpp`
|
|
||||||
|
|
||||||
What the code does:
|
|
||||||
- reads slot counts from `.damage`
|
|
||||||
- reads `InternalLocation` and `WeaponFacing` from `.subsystems`
|
|
||||||
- maps weapon slot type and size from the weapon model
|
|
||||||
- assigns weapons to valid locations during mechlab editing
|
|
||||||
|
|
||||||
## Facing Semantics
|
|
||||||
|
|
||||||
Weapon facing is stored per weapon instance, not as a separate hardpoint label.
|
|
||||||
|
|
||||||
Values seen in the data/code:
|
|
||||||
- `0` = front
|
|
||||||
- `1` = rear
|
|
||||||
- `2` = side
|
|
||||||
|
|
||||||
Code references:
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon_Tool.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon.hpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/hudweapon.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MechLab.cpp`
|
|
||||||
|
|
||||||
Important nuance:
|
|
||||||
- a zone name like `LeftTorso` does not tell you the facing by itself
|
|
||||||
- the facing comes from the weapon block¡¯s `WeaponFacing`
|
|
||||||
- the same zone can contain multiple weapons with different facings
|
|
||||||
|
|
||||||
## Group Index Meaning
|
|
||||||
|
|
||||||
The `G1`, `G2`, etc. suffix in `Weapons_With_Locations` is the weapon group number from `GroupIndex` in the subsystem file.
|
|
||||||
|
|
||||||
This is not a location or facing field.
|
|
||||||
|
|
||||||
Meaning:
|
|
||||||
- `G1` = weapon group 1
|
|
||||||
- `G2` = weapon group 2
|
|
||||||
- and so on
|
|
||||||
|
|
||||||
## How The Spreadsheet Was Built
|
|
||||||
|
|
||||||
The CSV was assembled by cross-referencing:
|
|
||||||
- mech folder contents under `Gameleap/mw4/Content/Mechs/`
|
|
||||||
- `.subsystems` weapon blocks
|
|
||||||
- `.damage` internal zone capacities
|
|
||||||
- active roster tables and IDs
|
|
||||||
- string registration files
|
|
||||||
- build manifests
|
|
||||||
- loose UI art assets under `Gameleap/mw4/hsh/`
|
|
||||||
|
|
||||||
The output is a derived audit sheet, not a direct export from a single source file.
|
|
||||||
|
|
||||||
## Known Pitfalls
|
|
||||||
|
|
||||||
### 1. Folder presence does not mean playable
|
|
||||||
|
|
||||||
Some mech folders exist but are not in the active roster tables or headers. These need ID/table/build integration before they are usable in-game.
|
|
||||||
|
|
||||||
### 2. File names are not always canonical
|
|
||||||
|
|
||||||
Some mechs use alternate base filenames inside their folder. Do not assume `FolderName/FolderName.damage` or `FolderName/FolderName.subsystems` always exist.
|
|
||||||
|
|
||||||
Prefer:
|
|
||||||
- parse the `.instance` file when present
|
|
||||||
- otherwise detect the first matching `.subsystems` / `.damage` file by extension and content
|
|
||||||
|
|
||||||
### 3. `Available_Hardpoints` is a summary, not a literal port map
|
|
||||||
|
|
||||||
It summarizes zones with capacity and facing hints, but it does not enumerate every exact port or site name.
|
|
||||||
|
|
||||||
### 4. Rear-facing weapons are per-instance
|
|
||||||
|
|
||||||
If a mech has one rear-mounted weapon in a torso zone, that does not mean all weapons in that zone are rear-facing.
|
|
||||||
|
|
||||||
## Update Checklist For Future Changes
|
|
||||||
|
|
||||||
If a mech is added or changed, check these in order:
|
|
||||||
1. update or verify the mech `.data`, `.instance`, `.subsystems`, and `.damage` files
|
|
||||||
2. ensure the mech is added to the active ID header(s)
|
|
||||||
3. update `MechChassisTable.tbl` and `MechTable.tbl`
|
|
||||||
4. update `core.build` and any related build manifests
|
|
||||||
5. add any needed string IDs or script references
|
|
||||||
6. confirm the mech has the expected loose or packed art assets
|
|
||||||
7. rebuild the CSV derived columns if the data changed
|
|
||||||
|
|
||||||
## Useful File Map
|
|
||||||
|
|
||||||
### Mech data
|
|
||||||
- `Gameleap/mw4/Content/Mechs/<MechName>/`
|
|
||||||
|
|
||||||
### Roster and IDs
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MechLabHeaders.h`
|
|
||||||
- `Gameleap/mw4/Content/ShellScripts/MechLabHeaders.h`
|
|
||||||
- `Gameleap/mw4/Content/Tables/MechChassisTable.tbl`
|
|
||||||
- `Gameleap/mw4/Content/Tables/MechTable.tbl`
|
|
||||||
|
|
||||||
### Slot/hardpoint logic
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MWDamageObject.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/MechLab.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Subsystem_Tool.cpp`
|
|
||||||
|
|
||||||
### Facing logic
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon.hpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/Weapon_Tool.cpp`
|
|
||||||
- `Gameleap/code/mw4/Code/MW4/hudweapon.cpp`
|
|
||||||
|
|
||||||
### Build manifests
|
|
||||||
- `Gameleap/mw4/Content/core.build`
|
|
||||||
- `Gameleap/mw4/Content/props.build`
|
|
||||||
- `Gameleap/mw4/Content/textures.build`
|
|
||||||
|
|
||||||
## Current State Summary
|
|
||||||
|
|
||||||
At the time this doc was written:
|
|
||||||
- `mech_loadouts.csv` includes playability, default loadout, facing, hardpoint, and notes columns
|
|
||||||
- non-playable mechs are explicitly marked `No`
|
|
||||||
- Templar and other mechs with rear or side mounts have facing visible in the CSV
|
|
||||||
- the file is intended to be a living audit artifact for future data cleanup and enablement work
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## MechEditor Web App — Data Sources, Fields, and Conversions (documented 2026-07-23)
|
|
||||||
|
|
||||||
The MechEditor is a single-file Python HTTP server at `/home/rich/Repositories/MechEditor/mech_editor.py`.
|
|
||||||
It runs at `localhost:8765`, parses the firestorm content tree, and presents a full mech configuration editor in the browser.
|
|
||||||
This section documents every data field it reads, every conversion it performs, and every naming rule it enforces.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Data Files Parsed Per Mech
|
|
||||||
|
|
||||||
All files live under `Gameleap/mw4/Content/Mechs/<MechDir>/`.
|
|
||||||
|
|
||||||
#### `.data` file (`parse_data()`)
|
|
||||||
|
|
||||||
| Field in file | Editor key | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| `VehicleTonnage` | `tonnage` | chassis base tonnage (float) |
|
|
||||||
| `MaxVehicleTonnage` | `max_tonnage` | max loadout tonnage (float) |
|
|
||||||
| `TechType` | `tech` | `$(Tech_IS)` ? `"IS"`, `$(Tech_Clan)` ? `"Clan"` |
|
|
||||||
| `MaxHeat` | `max_heat` | heat capacity (int) |
|
|
||||||
| `VehicleTradeValue` | `trade_value` | C-bills |
|
|
||||||
| `DragoonValue` | `dragoon` | used in Power Rating bar scaling |
|
|
||||||
| `MinMaxSpeed` | `min_max_speed` | base speed ceiling in **m/s** |
|
|
||||||
| `MaxSpeed` | `max_speed` | absolute speed ceiling in **m/s** (engine upgrades may not exceed this) |
|
|
||||||
| `FullStopTurnRate` | `full_stop_turn` | turn rate at zero speed, in **degrees/sec** |
|
|
||||||
| `TopSpeedTurnRate` | `top_speed_turn` | turn rate at top speed, in **degrees/sec** |
|
|
||||||
| `Acceleration` | `acceleration` | forward acceleration in **m/s²** |
|
|
||||||
| `Decceleration` | `decceleration` | forward braking in **m/s²** — **double-c spelling is canonical in the engine source** |
|
|
||||||
| `ReverseAccelerationMultiplier` | `rev_accel_mult` | multiplier applied to Acceleration for reverse |
|
|
||||||
| `ReverseDeccelerationMultiplier` | `rev_decel_mult` | multiplier applied to Decceleration for reverse — double-c canonical |
|
|
||||||
| `MinStandTransitionSpeed` | not surfaced | animation threshold only — see note below |
|
|
||||||
| `CanLoadJumpJets` | `can_jj` | Yes/No |
|
|
||||||
| `CanLoadECM` | `can_ecm` | Yes/No |
|
|
||||||
| `CanLoadBeagle` | `can_bap` | Yes/No |
|
|
||||||
| `CanLoadLightAmp` | `can_lightamp` | Yes/No |
|
|
||||||
| `CanLoadAMS` | `can_ams` | Yes/No |
|
|
||||||
| `CanLoadLAMS` | `can_lams` | Yes/No |
|
|
||||||
| `CanLoadIFF_Jammer` | `can_iff` | Yes/No |
|
|
||||||
|
|
||||||
**MinStandTransitionSpeed** is the speed (m/s) below which the mech switches from its walking animation to its idle/standing animation.
|
|
||||||
It is NOT a hard movement limit. It is purely an animation state machine threshold in `Mech.cpp`.
|
|
||||||
Code path: `animStateEngine?RequestState(StandState)` when `currentSpeedMPS <= minStandTransitionSpeed`.
|
|
||||||
Must be > 0 (validated in `Vehicle_Tool.cpp`). Argus = 12.631 m/s = 45.5 kph.
|
|
||||||
|
|
||||||
#### `.instance` file (`parse_instance()`)
|
|
||||||
|
|
||||||
| Field | Editor key | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| `PowerRating` | `PowerRating` | mechlab bar value, 0–100 |
|
|
||||||
| `ArmorRating` | `ArmorRating` | mechlab bar value, 0–100 |
|
|
||||||
| `SpeedRating` | `SpeedRating` | mechlab bar value, 0–100 |
|
|
||||||
| `HeatRating` | `HeatRating` | mechlab bar value, 0–100 |
|
|
||||||
| `DoesHaveLightAmp` | `has_lightamp` | 0 or 1, default 1 — whether LightAmp is currently installed |
|
|
||||||
|
|
||||||
#### `.subsystems` file (`parse_subsystems()`)
|
|
||||||
|
|
||||||
Provides: armor type + per-zone multipliers, installed heatsinks, jump jets, engine upgrades, weapons, electronics.
|
|
||||||
|
|
||||||
**Armor block:**
|
|
||||||
- `ArmorType=` ? armor type string (`Standard`, `FerroFiberus`, `Reactive`, `Reflective`, `Solarian`)
|
|
||||||
- Per-zone entries: `LeftArm=1.0`, `RightTorso=2.5`, etc. — multiplier for that zone
|
|
||||||
|
|
||||||
**Engine:**
|
|
||||||
- `EngineUpgrade` blocks counted ? `engine_upgrades` (0–5)
|
|
||||||
|
|
||||||
**Weapons** — each weapon block contains:
|
|
||||||
- `Model=` ? weapon subsystem resource path (name extracted)
|
|
||||||
- `InternalLocation=` ? zone name
|
|
||||||
- `Site=` ? mount port name (from armature)
|
|
||||||
- `GroupIndex=` ? weapon group number
|
|
||||||
- `WeaponFacing=` ? 0=Front, 1=Rear, 2=Side (absent = Front)
|
|
||||||
- `AmmoCount=` ? rounds for ammo-using weapons
|
|
||||||
- `EjectSite=` ? optional ejection site for ammo
|
|
||||||
|
|
||||||
**Electronics:** ECM, Beagle (BAP), AMS, LAMS, IFF_Jammer detected by subsystem model path.
|
|
||||||
|
|
||||||
#### `.damage` file (`parse_damage()`)
|
|
||||||
|
|
||||||
Per zone section `[ZoneInternal]`:
|
|
||||||
- `BaseArmorValue` ? starting armor (float)
|
|
||||||
- `MaxArmorValue` ? hard cap on armor pts for that zone
|
|
||||||
- `InternalHPValue` ? internal structure HP
|
|
||||||
- `OmniSlots`, `BeamSlots`, `MissileSlots`, `ProjectileSlots` ? weapon slot counts
|
|
||||||
|
|
||||||
Special zones:
|
|
||||||
- `SpecialAttachedToZone=` ? which body section this special zone is attached to
|
|
||||||
- `DamagePropagationZone=` ? where overflow damage propagates
|
|
||||||
|
|
||||||
#### `.engine` file (`parse_engine()`)
|
|
||||||
|
|
||||||
| Field | Editor key | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| `NumHeatSinks` | `NumHeatSinks` | free heatsinks from engine (not in subsystems) |
|
|
||||||
| `TonsPerUpgrade` | `TonsPerUpgrade` | tonnage cost per engine upgrade tier |
|
|
||||||
| `MPSPerUpgrade` | `MPSPerUpgrade` | m/s speed gain per upgrade tier |
|
|
||||||
|
|
||||||
#### `.torso` file (`parse_torso()`)
|
|
||||||
|
|
||||||
| Field | Notes |
|
|
||||||
|---|---|
|
|
||||||
| `TwistSpeed` | torso horizontal rotation speed — may be a macro reference |
|
|
||||||
| `PitchSpeed` | torso vertical rotation speed — may be a macro reference |
|
|
||||||
| `TwistRadius` | max horizontal twist angle — may be a macro reference |
|
|
||||||
| `PitchRadius` | max vertical pitch angle — may be a macro reference |
|
|
||||||
| `ArmRatioAngle` | ratio of arm tracking vs torso rotation — may be a macro reference |
|
|
||||||
|
|
||||||
All torso fields may reference macros from `Content/Defines/MechTorso.defines`.
|
|
||||||
The editor resolves them using a preloaded `TORSO_DEFINES` dict. Notable values:
|
|
||||||
|
|
||||||
```
|
|
||||||
NORMAL_RATIO = 40
|
|
||||||
SNAIL_TSPEED = 40
|
|
||||||
NORMAL_TSPEED = 60
|
|
||||||
FAST_TSPEED = 80
|
|
||||||
WIDE_TRADIUS = 160
|
|
||||||
NORMAL_PRADIUS = 40
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Calculated Ratings and Conversions
|
|
||||||
|
|
||||||
#### Speed (kph)
|
|
||||||
|
|
||||||
```
|
|
||||||
top_speed_kph = min(MinMaxSpeed + MPSPerUpgrade × engine_upgrades, MaxSpeed) × 3.6
|
|
||||||
```
|
|
||||||
|
|
||||||
- `MinMaxSpeed` and `MaxSpeed` from `.data` (m/s)
|
|
||||||
- `MPSPerUpgrade` from `.engine` (m/s per tier)
|
|
||||||
- `engine_upgrades` from `.subsystems` (0–5)
|
|
||||||
- Multiply by 3.6 to convert m/s ? kph
|
|
||||||
- Argus example: (20.28 + 1.11 × 10) × 3.6 = 113.5 kph
|
|
||||||
|
|
||||||
#### Speed Rating (bar)
|
|
||||||
|
|
||||||
```
|
|
||||||
speed_rating = (top_speed_mps / MaxSpeed) × 100 [capped at 100]
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Turn Rate — degrees to radians
|
|
||||||
|
|
||||||
The `.data` file stores turn rates in **degrees/sec**. The mechlab UI label was changed to show rad/sec:
|
|
||||||
- `StringResource.rc`: `IDS_ML_CH_TURNRATE` ? `"Turn Rate (Top Speed Rad/Sec):"`
|
|
||||||
- Conversion: `radians = degrees × ?/180` where `?/180 ? 0.017453`
|
|
||||||
- Argus: FullStopTurn = 75° = **1.309 rad/sec**, TopSpeedTurn = 45° = **0.785 rad/sec**
|
|
||||||
|
|
||||||
#### Acceleration / Deceleration (m/s²)
|
|
||||||
|
|
||||||
Stored directly in `.data`. Reverse values are derived:
|
|
||||||
```
|
|
||||||
reverse_accel = Acceleration × ReverseAccelerationMultiplier
|
|
||||||
reverse_decel = Decceleration × ReverseDeccelerationMultiplier
|
|
||||||
```
|
|
||||||
|
|
||||||
**The double-c spelling (`Decceleration`, `ReverseDeccelerationMultiplier`) is canonical — it matches the engine source. Do not "fix" the spelling.**
|
|
||||||
|
|
||||||
#### Heat Rating (bar)
|
|
||||||
|
|
||||||
```
|
|
||||||
total_hs = NumHeatSinks (engine) + installed_heatsinks (subsystems)
|
|
||||||
effective_hs = total_hs × (2 if Double else 1)
|
|
||||||
heat_rating = (effective_hs / MaxHeat) × 100 [capped at 100]
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Power Rating (bar)
|
|
||||||
|
|
||||||
```
|
|
||||||
total_damage = ? (DamageAmount × NumFire) for each installed weapon
|
|
||||||
power_rating = (total_damage / 80) × 100 [capped at 100]
|
|
||||||
```
|
|
||||||
|
|
||||||
- `DamageAmount` and `NumFire` come from `WeaponSubsystems/<weapon>.data` following `!include` chains
|
|
||||||
- Parsed by `load_weapon_damages()` at server startup, cached in `Handler.weapon_damages`
|
|
||||||
- Argus example with default load: ~36.2 total damage ? 45 rating (stored = 42)
|
|
||||||
|
|
||||||
#### Armor Rating (bar)
|
|
||||||
|
|
||||||
```
|
|
||||||
for each zone:
|
|
||||||
pts = multiplier × ARMOR_PTS_PER_TON[armor_type]
|
|
||||||
effective = min(pts, MaxArmorValue[zone])
|
|
||||||
armor_rating = (? effective / ? MaxArmorValue) × 100
|
|
||||||
```
|
|
||||||
|
|
||||||
Armor pts per ton by type (from `Adept/ResourceImagePool.cpp` and game design):
|
|
||||||
|
|
||||||
| Type | Pts/ton |
|
|
||||||
|---|---|
|
|
||||||
| Standard | 32 |
|
|
||||||
| FerroFiberus | 38 |
|
|
||||||
| Reactive | 30 |
|
|
||||||
| Reflective | 30 |
|
|
||||||
| Solarian | 60 |
|
|
||||||
|
|
||||||
Note: `FerroFiberus` is the canonical internal token (not player-visible). The player sees `DNL_FERROFIB = "Ferro Fibrous"` via string lookup.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Active-in-Game Detection
|
|
||||||
|
|
||||||
Source: `Gameleap/mw4/Content/Tables/MechChassisTable.tbl`
|
|
||||||
|
|
||||||
Format:
|
|
||||||
```
|
|
||||||
DisplayKey=Mechs\DirName\FileName.data
|
|
||||||
//CommentedKey=Mechs\DirName\FileName.data <- inactive
|
|
||||||
```
|
|
||||||
|
|
||||||
- Active = entry exists AND is not prefixed with `//`
|
|
||||||
- Currently the only inactive mech: **Dasher** (commented out)
|
|
||||||
- The editor shows a green **ACTIVE IN GAME** or red **NOT IN GAME** banner at top of Stats tab
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### hsh/ Image Naming Conventions
|
|
||||||
|
|
||||||
The `hsh/` directory under `Gameleap/mw4/` holds loose BMP files loaded at runtime (not packed into `.mw4`).
|
|
||||||
There are four relevant subdirectories, each with a different naming authority.
|
|
||||||
|
|
||||||
#### `hsh/hud/` — in-game HUD damage silhouette (own mech)
|
|
||||||
#### `hsh/MFD/` — MFD target display silhouette (target mech)
|
|
||||||
#### `hsh/radar/hud/` — radar damage overlay
|
|
||||||
|
|
||||||
**All three use identical stems** sourced from `huddamage.cpp` `texturename[]` array.
|
|
||||||
|
|
||||||
Load path:
|
|
||||||
- hud/MFD: `hsh\<texturename>.bmp` where texturename = `hud\<stem>` ? file = `hsh/hud/<stem>.bmp`
|
|
||||||
- radar: `hsh\radar\<texturename>.bmp` ? file = `hsh/radar/hud/<stem>.bmp`
|
|
||||||
|
|
||||||
Code: `render.cpp` `CRadar_Device::LoadRadarDamageTexture()` and `huddamage.cpp` `HUDDamage`.
|
|
||||||
|
|
||||||
#### `hsh/Mechs/` — mw4print scorecard portrait
|
|
||||||
|
|
||||||
Load path: `recscore.cpp` ? `GetLocString(model->m_nameIndex)` ? `DNL_*` string from `StringResource.rc` ? lowercased filename.
|
|
||||||
Different naming authority from the other three.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Complete Canonical Name Table
|
|
||||||
|
|
||||||
Key: mech directory name (case-insensitive) ? canonical stem for `hsh/hud/`, `hsh/MFD/`, `hsh/radar/hud/`.
|
|
||||||
Entries in **bold** differ from the directory name.
|
|
||||||
|
|
||||||
| Directory | hud/MFD/radar stem | hsh/Mechs/ portrait filename |
|
|
||||||
|---|---|---|
|
|
||||||
| Annihilator | annihilator | annihilator.bmp |
|
|
||||||
| Archer | archer | archer.bmp |
|
|
||||||
| ArcticWolf | arcticwolf | arctic wolf.bmp |
|
|
||||||
| Ares | ares | ares.bmp |
|
|
||||||
| Argus | argus | argus.bmp |
|
|
||||||
| Assassin2 | assassin2 | **assassin ii.bmp** |
|
|
||||||
| Atlas | atlas | atlas.bmp |
|
|
||||||
| Avatar | avatar | avatar.bmp |
|
|
||||||
| Awesome | awesome | awesome.bmp |
|
|
||||||
| Battlemaster | battlemaster | battlemaster.bmp |
|
|
||||||
| Battlemaster2c | **battlemasteriic** | **battlemaster iic.bmp** |
|
|
||||||
| Behemoth | behemoth | behemoth.bmp |
|
|
||||||
| Behemoth2 | **behemothii** | **behemoth ii.bmp** |
|
|
||||||
| Blackhawk | blackhawk | black hawk.bmp |
|
|
||||||
| Blacknight | **blackknight** | black knight.bmp |
|
|
||||||
| Blacklanner | blacklanner | black lanner.bmp |
|
|
||||||
| Brigand | brigand | brigand.bmp |
|
|
||||||
| Bushwacker | bushwacker | bushwacker.bmp |
|
|
||||||
| Catapult | catapult | catapult.bmp |
|
|
||||||
| CauldronBorn | cauldronborn | **cauldronborn.bmp** (table key has hyphen; DNL does not) |
|
|
||||||
| Chimera | chimera | chimera.bmp |
|
|
||||||
| Commando | commando | commando.bmp |
|
|
||||||
| Cougar | cougar | cougar.bmp |
|
|
||||||
| Cyclops | cyclops | cyclops.bmp |
|
|
||||||
| Daishi | daishi | daishi.bmp |
|
|
||||||
| Deimos | deimos | deimos.bmp |
|
|
||||||
| Dragon | dragon | dragon.bmp |
|
|
||||||
| Fafnir | fafnir | fafnir.bmp |
|
|
||||||
| Flea | flea | flea.bmp |
|
|
||||||
| Gladiator | gladiator | gladiator.bmp |
|
|
||||||
| Grizzly | grizzly | grizzly.bmp |
|
|
||||||
| Hauptmann | hauptmann | hauptmann.bmp |
|
|
||||||
| Hellhound | hellhound | hellhound.bmp |
|
|
||||||
| Hellspawn | hellspawn | hellspawn.bmp |
|
|
||||||
| Highlander | highlander | highlander.bmp |
|
|
||||||
| Hollander | **hollanderii** | **hollander ii.bmp** |
|
|
||||||
| Hunchback | hunchback | hunchback.bmp |
|
|
||||||
| Kodiak | kodiak | kodiak.bmp |
|
|
||||||
| Loki | loki | loki.bmp |
|
|
||||||
| Longbow | longbow | longbow.bmp |
|
|
||||||
| Madcat | madcat | mad cat.bmp |
|
|
||||||
| Madcat_MKII | **madcat2** | mad cat mkii.bmp |
|
|
||||||
| Masakari | masakari | masakari.bmp |
|
|
||||||
| Mauler | mauler | mauler.bmp |
|
|
||||||
| Novacat | novacat | nova cat.bmp |
|
|
||||||
| Osiris | osiris | osiris.bmp |
|
|
||||||
| Owens | owens | owens.bmp |
|
|
||||||
| Puma | puma | puma.bmp |
|
|
||||||
| Raven | raven | raven.bmp |
|
|
||||||
| Rifleman | rifleman | rifleman.bmp |
|
|
||||||
| Ryoken | ryoken | ryoken.bmp |
|
|
||||||
| Shadowcat | shadowcat | shadow cat.bmp |
|
|
||||||
| Solitaire | solitaire | solitaire.bmp |
|
|
||||||
| Sunder | sunder | sunder.bmp |
|
|
||||||
| Templar | templar | templar.bmp |
|
|
||||||
| Thanatos | thanatos | thanatos.bmp |
|
|
||||||
| Thor | thor | thor.bmp |
|
|
||||||
| Uller | uller | uller.bmp |
|
|
||||||
| Urbanmech | urbanmech | urbanmech.bmp |
|
|
||||||
| Uziel | uziel | uziel.bmp |
|
|
||||||
| Victor | victor | victor.bmp |
|
|
||||||
| Vulture | vulture | vulture.bmp |
|
|
||||||
| Warhammer | warhammer | warhammer.bmp |
|
|
||||||
| Wolfhound | wolfhound | wolfhound.bmp |
|
|
||||||
| Zeus | zeus | zeus.bmp |
|
|
||||||
|
|
||||||
**Critical mismatches where directory name ? hud/MFD stem (files must use the stem, not the dir name):**
|
|
||||||
|
|
||||||
| Directory | Wrong name (dir-based) | Correct name (stem) |
|
|
||||||
|---|---|---|
|
|
||||||
| Battlemaster2c | battlemaster2c.bmp | **battlemasteriic.bmp** |
|
|
||||||
| Behemoth2 | behemoth2.bmp | **behemothii.bmp** |
|
|
||||||
| Blacknight | blacknight.bmp | **blackknight.bmp** |
|
|
||||||
| Hollander | hollander.bmp | **hollanderii.bmp** |
|
|
||||||
| Madcat_MKII | madcat_mkii.bmp | **madcat2.bmp** |
|
|
||||||
|
|
||||||
**Portrait mismatches for hsh/Mechs/ (table key ? DNL string):**
|
|
||||||
|
|
||||||
The `MechChassisTable.tbl` display key and `GetLocString()` DNL string differ for these mechs.
|
|
||||||
mw4print uses the DNL string. The table key is NOT the correct portrait filename for these 5 mechs.
|
|
||||||
|
|
||||||
| Directory | Table key (wrong for mw4print) | DNL string (correct portrait stem) |
|
|
||||||
|---|---|---|
|
|
||||||
| Assassin2 | AssassinII ? assassinii | `DNL_ASSASSIN2 "Assassin II"` ? **assassin ii.bmp** |
|
|
||||||
| Battlemaster2c | BattlemasterIIC ? battlemasteriic | `DNL_BATTLEMASTERIIC "Battlemaster IIc"` ? **battlemaster iic.bmp** |
|
|
||||||
| Behemoth2 | BehemothII ? behemothii | `DNL_BEHEMOTHII "Behemoth II"` ? **behemoth ii.bmp** |
|
|
||||||
| CauldronBorn | Cauldron-Born ? cauldron-born | `DNL_CAULDRONBORN "Cauldronborn"` ? **cauldronborn.bmp** |
|
|
||||||
| Hollander | HollanderII ? hollanderii | `DNL_HOLLANDERII "Hollander II"` ? **hollander ii.bmp** |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### MechEditor Implementation Notes
|
|
||||||
|
|
||||||
The editor encodes all of the above knowledge in two Python dicts:
|
|
||||||
|
|
||||||
**`MECH_HSH_STEMS`** (in `mech_editor.py`)
|
|
||||||
Maps lowercase dir name ? canonical stem for `hsh/hud/`, `hsh/MFD/`, `hsh/radar/hud/`.
|
|
||||||
Source: `huddamage.cpp` `texturename[]` array.
|
|
||||||
|
|
||||||
**`MECH_PORTRAIT_OVERRIDES`** (in `mech_editor.py`)
|
|
||||||
Maps lowercase dir name ? portrait stem for `hsh/Mechs/` where the DNL string differs from the chassis table key.
|
|
||||||
Source: `DNL_*` entries in `Gameleap/code/mw4/Code/scriptstrings/StringResource.rc`.
|
|
||||||
|
|
||||||
For all other mechs, the portrait stem is derived dynamically from `MechChassisTable.tbl` (display key, lowercased).
|
|
||||||
|
|
||||||
The Assets tab in the editor shows all four image types. When an image is missing, it displays:
|
|
||||||
```
|
|
||||||
Wants: hsh/<subdir>/<expected_filename>.bmp
|
|
||||||
```
|
|
||||||
so the user knows exactly what to rename or create.
|
|
||||||
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
Chassis,InternalLocation,Model,Site,AmmoCount,GroupIndex,WeaponFacing
|
|
||||||
Archer,LeftTorso,LRM15,site_ldmissile,24,2,2
|
|
||||||
Archer,RightTorso,LRM15,site_rdmissile,24,2,2
|
|
||||||
Ares,Special2,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Ares,Special2,ClanLRM10,site_missileport,24,2,2
|
|
||||||
Ares,Special2,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
AssassinII,Special1,LRM5,site_missileport,24,2,2
|
|
||||||
Atlas,LeftTorso,LRM20,site_lmissileport,12,2,2
|
|
||||||
Avatar,LeftTorso,LRM5,site_lmissileport,24,2,2
|
|
||||||
Avatar,RightTorso,LRM5,site_rmissileport,24,2,2
|
|
||||||
Avatar,LeftTorso,LRM10,site_lmissileport,24,2,2
|
|
||||||
Avatar,RightTorso,LRM10,site_rmissileport,24,2,2
|
|
||||||
Awesome,CenterTorso,LRM5,site_ctorsoport,24,2,2
|
|
||||||
Battlemaster,RightTorso,MediumLaser,site_rdtorsoport,,1,1
|
|
||||||
Battlemaster,LeftTorso,MediumLaser,site_ldtorsoport,,1,1
|
|
||||||
BattlemasterIIC,RightTorso,ClanERMediumLaser,site_rdtorsoport,,1,1
|
|
||||||
BattlemasterIIC,LeftTorso,ClanERMediumLaser,site_ldtorsoport,,1,1
|
|
||||||
Black Lanner,Special2,ClanSRM6,site_rmissileport,15,2,2
|
|
||||||
Black Lanner,Special1,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Bushwacker,Special1,LRM5,site_missileport,24,2,2
|
|
||||||
Bushwacker,Special1,LRM5,site_missileport,24,2,2
|
|
||||||
Catapult,LeftArm,LRM20,site_lmissileport,12,2,2
|
|
||||||
Catapult,RightArm,LRM20,site_rmissileport,12,2,2
|
|
||||||
Cauldron-Born,Special1,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
Cauldron-Born,Special2,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Chimera,RightTorso,LRM5,site_missileport,24,2,2
|
|
||||||
Chimera,RightTorso,LRM5,site_missileport,24,2,2
|
|
||||||
Chimera,RightTorso,LRM5,site_missileport,24,2,2
|
|
||||||
Chimera,RightTorso,LRM5,site_missileport,24,2,2
|
|
||||||
Cyclops,LeftTorso,LRM10,site_lmissile,24,2,2
|
|
||||||
Cougar,LeftTorso,ClanLRM10,site_lmissileport,12,2,2
|
|
||||||
Cougar,RightTorso,ClanLRM10,site_rmissileport,12,2,2
|
|
||||||
Deimos,Special1,ClanLRM15,site_lmissileport,16,2,2
|
|
||||||
Deimos,Special2,ClanLRM15,site_rmissileport,16,2,2
|
|
||||||
Dragon,CenterTorso,LRM10,site_missleport,24,2,2
|
|
||||||
Flea,LeftTorso,SmallLaser,site_ltorsoport,,1,1
|
|
||||||
Flea,RightTorso,SmallLaser,site_rtorsoport,,1,1
|
|
||||||
Grizzly,LeftTorso,CLANLRM10,site_missleport,24,2,2
|
|
||||||
Hellhound,LeftTorso,ClanLRM10,site_missileport,12,2,2
|
|
||||||
Mad Cat,Special1,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Mad Cat,Special2,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
Mad Cat MKII,Special2,ClanLRM15,site_lmissileport,16,2,2
|
|
||||||
Mad Cat MKII,Special1,ClanLRM15,site_rmissileport,16,2,2
|
|
||||||
Masakari,LeftTorso,ClanLRM10,site_lmissleport,24,2,2
|
|
||||||
Masakari,LeftTorso,ClanLRM10,site_ltorsoport,24,2,2
|
|
||||||
Mauler,LeftTorso,LRM5,site_lmissileport,24,2,2
|
|
||||||
Mauler,LeftTorso,LRM5,site_lmissileport,24,2,2
|
|
||||||
Mauler,LeftTorso,LRM5,site_lmissileport,24,2,2
|
|
||||||
Mauler,RightTorso,LRM5,site_rmissileport,24,2,2
|
|
||||||
Mauler,RightTorso,LRM5,site_rmissileport,24,2,2
|
|
||||||
Mauler,RightTorso,LRM5,site_rmissileport,24,2,2
|
|
||||||
Raven,RightTorso,LRM5,site_rtorsoport,24,2,2
|
|
||||||
Sunder,LeftTorso,MediumLaser,site_ldtorsoport,,1,1
|
|
||||||
Sunder,RightTorso,MediumLaser,site_rdtorsoport,,1,1
|
|
||||||
Templar,LeftTorso,MediumPulseLaser,site_ldrtorsoport,,1,1
|
|
||||||
Templar,RightTorso,MediumPulseLaser,site_rdrtorsoport,,1,1
|
|
||||||
Thor,Special1,CLANLRM10,site_missileport,24,2,2
|
|
||||||
Uziel,Special1,LRM10,site_missileport,24,2,2
|
|
||||||
Vulture,LeftTorso,ClanLRM5,site_lmissileport,24,2,2
|
|
||||||
Vulture,RightTorso,ClanLRM5,site_rmissileport,24,2,2
|
|
||||||
Vulture,LeftTorso,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Vulture,RightTorso,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
Wolfhound,CenterTorso,ClanERMediumLaser,site_reartorsoport,,1,1
|
|
||||||
Zeus,RightTorso,MediumPulseLaser,site_reartorsoport,,1,1
|
|
||||||
|
@@ -1,45 +0,0 @@
|
|||||||
Chassis,InternalLocation,Model,Site,AmmoCount,GroupIndex,WeaponFacing
|
|
||||||
Ares,Special1,ClanERSmallLaser,site_lgunport,,1,
|
|
||||||
Ares,Special1,ClanERSmallLaser,site_rgunport,,1,
|
|
||||||
Ares,Special2,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Ares,Special2,ClanLRM10,site_missileport,24,2,2
|
|
||||||
Ares,Special2,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
AssassinII,Special1,LRM5,site_missileport,24,2,2
|
|
||||||
Atlas,Special1,AC20,site_rtorsoport,10,1,
|
|
||||||
Atlas,Special2,SRM6,site_llmissile,15,2,
|
|
||||||
Avatar,Special1,MachineGun,site_ltorsoport,200,1,
|
|
||||||
Avatar,Special1,MachineGun,site_rtorsoport,200,1,
|
|
||||||
Battlemaster,Special2,PPC,site_rdgunport,,1,
|
|
||||||
Battlemaster,Special1,SRM6,site_missile,15,2,
|
|
||||||
BattlemasterIIC,Special1,ClanSSRM6,site_missile,15,2,
|
|
||||||
Behemoth,Special1,LargeLaser,site_ctorsoport,,1,
|
|
||||||
BehemothII,Special1,LargeLaser,site_ctorsoport,,1,
|
|
||||||
Black Lanner,Special2,ClanSRM6,site_rmissileport,15,2,2
|
|
||||||
Black Lanner,Special1,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Brigand,Special2,MediumLaser,site_ltorsoport,,1,
|
|
||||||
Brigand,Special1,MediumLaser,site_rtorsoport,,1,
|
|
||||||
Bushwacker,Special1,LRM5,site_missileport,24,2,2
|
|
||||||
Bushwacker,Special1,LRM5,site_missileport,24,2,2
|
|
||||||
Cauldron-Born,Special1,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
Cauldron-Born,Special2,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Cyclops,Special1,MediumPulseLaser,site_gunport,,1,
|
|
||||||
Deimos,Special1,ClanLRM15,site_lmissileport,16,2,2
|
|
||||||
Deimos,Special2,ClanLRM15,site_rmissileport,16,2,2
|
|
||||||
Hauptmann,Special1,ClanUltraAC20,site_rutorsoport,16,1,
|
|
||||||
Hellspawn,Special1,SSRM2,site_rmissileport,50,2,
|
|
||||||
HollanderII,Special2,SmallPulseLaser,site_cltorsoport,,1,
|
|
||||||
HollanderII,Special2,SmallPulseLaser,site_crtorsoport,,1,
|
|
||||||
HollanderII,Special1,GaussRifle,site_rtorsoport,16,1,
|
|
||||||
Hunchback,Special1,AC10,site_rutorsoport,20,1,
|
|
||||||
Loki,Special1,ClanSSRM6,site_missileport,15,2,
|
|
||||||
Mad Cat,Special1,ClanLRM10,site_lmissileport,24,2,2
|
|
||||||
Mad Cat,Special2,ClanLRM10,site_rmissileport,24,2,2
|
|
||||||
Mad Cat MKII,Special2,ClanLRM15,site_lmissileport,16,2,2
|
|
||||||
Mad Cat MKII,Special1,ClanLRM15,site_rmissileport,16,2,2
|
|
||||||
Rifleman,Special1,MediumLaser,site_ltorsoport,,1,
|
|
||||||
Rifleman,Special1,MediumLaser,site_rtorsoport,,1,
|
|
||||||
Solitaire,Special1,ClanERLargeLaser,site_rtorsoport,,1,
|
|
||||||
Thor,Special1,CLANLRM10,site_missileport,24,2,2
|
|
||||||
Uziel,Special1,LRM10,site_missileport,24,2,2
|
|
||||||
Vulture,Special1,ClanMachineGun,site_ltorsoport,200,1,
|
|
||||||
Vulture,Special1,ClanMachineGun,site_rtorsoport,200,1,
|
|
||||||
|
@@ -52,9 +52,7 @@ Toolchain is late-90s/early-2000s **Visual C++ 6.0** — no git, no modern build
|
|||||||
- **`Gameleap/`** — only **`mw4/`** is used (game-data source for resource packing). Former siblings
|
- **`Gameleap/`** — only **`mw4/`** is used (game-data source for resource packing). Former siblings
|
||||||
(editor docs, drivers, batch tools, runtime env) were historical/utility → moved to `_UNUSED\`.
|
(editor docs, drivers, batch tools, runtime env) were historical/utility → moved to `_UNUSED\`.
|
||||||
- **`BTFrstrm/`** — FireStorm design data: mech stat workbooks (`MechInfo_5.04.xls`, `scriptaddmech.xls`).
|
- **`BTFrstrm/`** — FireStorm design data: mech stat workbooks (`MechInfo_5.04.xls`, `scriptaddmech.xls`).
|
||||||
- **`Finished HUDS from J&J/`** — J&J external MFD/Radar source art, measurements, generated
|
- **`Finished HUDS from J&J/`** — per-mech HUD art (MFD + Radar) for ~15 'Mechs.
|
||||||
comparison maps, and audit summary for 13 chassis. The usable mappings were installed on
|
|
||||||
2026-08-07; see `MFD-RADAR-MAPPINGS.md` and the STEP 13 note below.
|
|
||||||
|
|
||||||
### Inside `Gameleap\code/`
|
### Inside `Gameleap\code/`
|
||||||
- `CoreTech/` — reusable engine layer (GameOS, gosFX, GOSScript, MLR renderer, Network, Stuff, Language, blade) + Tools.
|
- `CoreTech/` — reusable engine layer (GameOS, gosFX, GOSScript, MLR renderer, Network, Stuff, Language, blade) + Tools.
|
||||||
@@ -736,618 +734,7 @@ keeping old-RIO (type 0) protocol behavior byte-identical:
|
|||||||
call it via `-Command "& '...driver.ps1' game-start '-tbaud 115200'"` — `-File` binding
|
call it via `-Command "& '...driver.ps1' game-start '-tbaud 115200'"` — `-File` binding
|
||||||
rejects dash-leading positional args, and `Start-Process -ArgumentList` doesn't re-quote.
|
rejects dash-leading positional args, and `Start-Process -ArgumentList` doesn't re-quote.
|
||||||
|
|
||||||
## 📋 Branch `mfdsplit`: mech loadouts, time list, build fixes (2026-07-18)
|
|
||||||
|
|
||||||
### Mech loadout changes
|
|
||||||
- **Battlemaster IS** (`Content\Mechs\Battlemaster\battlemaster.subsystems`): replaced lone
|
|
||||||
MediumPulseLaser default with full stock IS loadout — PPC (Special2), 6×ML (3 RT, 3 LT),
|
|
||||||
2×MG (LA, 200 rds), SRM6 (Special1, 15 rds), all GroupIndex=1 except SRM6 (group 2).
|
|
||||||
- **Battlemaster Clan 2C** (`battlemaster2c.subsystems`): ER PPC (RA), 6×ER ML (3 RT, 3 LT),
|
|
||||||
2×Clan Gauss (LA, 16 rds each), Clan SSRM6 (Special1, 15 rds).
|
|
||||||
- **Behemoth / Behemoth2** (`.subsystems`): moved Gauss rifles from weapon group 3 → group 1
|
|
||||||
(3 occurrences each; gauss rifles now in group 1 alongside other main weapons).
|
|
||||||
|
|
||||||
### MP time-limit list fix (ConLobbyMission.script)
|
|
||||||
- Expanded from 9 → 18 entries (1–15, 20, 25, 30 min); `max_displayed=10` so dropdown scrolls.
|
|
||||||
- Fixed bare `else if` (missing braces) that caused a null-reference crash in the console lobby
|
|
||||||
when the commit was merged from `main`. This was the root cause of the `aa500be7` regression.
|
|
||||||
- Fixed `i==5` vs `i==6` max_displayed assignment for time vs radar dropdowns.
|
|
||||||
|
|
||||||
### Resource builder fix (build-resources.ps1) — VM / generic adapter support
|
|
||||||
- Builder now always runs with `-window` (windowed mode + DDrawCompat). Fullscreen native DDraw
|
|
||||||
fails on VMs with generic Microsoft display adapters (no hardware DDraw); windowed DDrawCompat
|
|
||||||
works on all tested configs including VMs.
|
|
||||||
- dgVoodoo2 D3D DLL interceptors (`D3D8.dll`, `D3D9.dll`, `D3DImm.dll`) in the working dir
|
|
||||||
silently break the builder (it exits 0 without building anything). These files were left over
|
|
||||||
from the abandoned dgVoodoo2 experiment (commit `87e25677`) — removed from repo (`git rm`).
|
|
||||||
The build script also moves any such files aside defensively via the `$dgvMoved` block.
|
|
||||||
- Removed all dead code for fullscreen fallback, bitdepth patching, ddraw move-aside logic.
|
|
||||||
- `dgVoodoo.conf` / `dgVoodooCpl.exe` also removed from `Gameleap\mw4\` (no longer in use).
|
|
||||||
- Expected behaviour on VM: a "Hardware Error: not compatible with MechWarrior 4" dialog appears
|
|
||||||
at the end of the build — this is a GameOS hardware-capability warning, NOT a fatal error.
|
|
||||||
Click OK; the .mw4 packages are built correctly regardless.
|
|
||||||
|
|
||||||
### Source tree Korean → English translation + UTF-8 cleanup (2026-07-18)
|
|
||||||
- Translated all EUC-KR/CP949 Korean developer comments to English across **84 source files**
|
|
||||||
(~876 lines). Zero Korean bytes remain outside intentional font-table headers (D3FFontEdit2/
|
|
||||||
fontedit `all.h` etc.). Files are now clean UTF-8 (no BOM), safe for any modern editor.
|
|
||||||
- Notable functional translations: `recscore.cpp` body-part return values and kill-announcer
|
|
||||||
format strings (gameplay-visible on Korean Windows; now English on all systems); `nonmfc.h`
|
|
||||||
assert dialog; GosView profiler `킪` → `us` (microseconds).
|
|
||||||
- Latin-1 chars converted to proper UTF-8: © in 3dsmax4/Maxscrpt headers (82 files), ® in
|
|
||||||
`gosHelp/Remote.cpp`, · bullet points in `ai command.hpp`, Û/ß in AnimationSuite headers.
|
|
||||||
- Font table `*.h` files (`D3FFontEdit2/`, `fontedit/`) intentionally left as-is (raw byte
|
|
||||||
values in C array data, not text).
|
|
||||||
- `korean_diff.html` (side-by-side GitHub-style diff, ~873 KB) committed as documentation.
|
|
||||||
|
|
||||||
### Language DLL: English version from source
|
|
||||||
- `Gameleap\mw4\Language.dll` and `MW4\Language.dll` replaced with the freshly compiled English
|
|
||||||
build from `Language - Win32 English` config (`Language.dsp`). Fixes Korean button labels in
|
|
||||||
the GameOS exception/crash dialog (`??? ??...` / `??` / `???` → More Details / Continue / Exit).
|
|
||||||
The old binary was the original Korean build from the 2009 dev machine.
|
|
||||||
|
|
||||||
### mw4print v2.0 additions
|
|
||||||
- **MySQL export** (`dbexport.h`/`dbexport.cpp`): late-bound runtime load of `libmysql.dll`
|
|
||||||
(no compile-time MySQL SDK needed). Exports match data (match, player_result, pvp, optional
|
|
||||||
event tables) to an external MySQL server after each print job. Schema in `db_schema.sql`.
|
|
||||||
Config via `mw4print.ini [MySQLExport]`; UI via File → Database Settings (Ctrl+D).
|
|
||||||
- **Configurable banner text**: File → Banner Setting... edits the bottom-of-sheet URL string
|
|
||||||
(was hardcoded `WWW.MECHJOCK.COM`). Persisted to `options.ini [battle tech print] BannerText=`.
|
|
||||||
- **libmysql.dll** (MySQL Connector/C 32-bit) added to `Gameleap\mw4\` so deploy copies it
|
|
||||||
alongside `mw4print.exe`.
|
|
||||||
- Version bumped to **2.0**, copyright year updated to **2026**.
|
|
||||||
|
|
||||||
## 📋 MFD mode 4: right device stagger fix (2026-07-18, eaa5fd3)
|
|
||||||
Root cause: `CMFD_Device::BeginScene()` cleared BOTH MFD device back-buffers at `sh_step==0`.
|
|
||||||
But in mode 4 the right MFD flip also fires at `sh_step==1` (= old `sh_step==0` after the
|
|
||||||
stagger increment), so it presented a just-cleared buffer — only the grid, no channel data.
|
|
||||||
|
|
||||||
Fix: `BeginScene()` now only clears/grids the LEFT device at `sh_step==0`. New `BeginSceneRight()`
|
|
||||||
(added to `render.cpp` / `render.hpp`, called from `WinMain.cpp`) clears/grids the RIGHT device at
|
|
||||||
`sh_step==1` — one frame AFTER the right flip — so channels 3–4 render into a fresh buffer before
|
|
||||||
the next flip. Mode 1 is unchanged.
|
|
||||||
|
|
||||||
Mode 4 cycle (with stagger):
|
|
||||||
- `sh_step 0`: radar + left `BeginScene` (clear + grid); no flip
|
|
||||||
- `sh_step 1`: flip right MFD (shows channels 3–4 from previous cycle) + right `BeginScene` (clear + grid)
|
|
||||||
- `sh_step 2–4`: channels 0–2 → left device
|
|
||||||
- `sh_step 5–6`: channels 3–4 → right device
|
|
||||||
- `sh_step 0` (next): flip radar + left MFD (shows channels 0–2 from previous cycle)
|
|
||||||
|
|
||||||
Files: `CoreTech/Libraries/GameOS/WinMain.cpp`, `render.cpp`, `render.hpp`.
|
|
||||||
|
|
||||||
## 📋 Linux→Windows development workflow (2026-07-19, 55b9bfc5)
|
|
||||||
`build-env/sync-to-windows.sh` — rsync script that pushes all source, content, toolchain, and
|
|
||||||
assets to the Windows build machine at `/vwe/firestorm`. Excludes generated build outputs
|
|
||||||
(`rel.bin/`, `dbg.bin/`, `*.mw4`, `*.dep`), `.git`/LFS objects, `_UNUSED/`, and the game deploy
|
|
||||||
dir (`MW4/`). Run from Linux before triggering a Windows build.
|
|
||||||
|
|
||||||
## 📋 ddraw.dll removed from repo; build script moves it aside (2026-07-19, 0ceba9c7, 24825ff3)
|
|
||||||
`Gameleap/mw4/ddraw.dll` (DDrawCompat) removed from git (was LFS-tracked); now lives as
|
|
||||||
`ddraw.dll.old` in the same dir for reference. `deploy-editor.ps1` installs DDrawCompat as
|
|
||||||
`ddraw.dll` at deploy time (the editor needs it for its windowed D3D7 viewport).
|
|
||||||
`build-resources.ps1` moves `ddraw.dll` aside (`.buildaside`) before running `MW4pro.exe`
|
|
||||||
because **DDrawCompat is fatal to MW4pro.exe in BOTH windowed and fullscreen modes**, then
|
|
||||||
restores it in `finally`. The same block also defensively covers dgVoodoo2 interceptors
|
|
||||||
(`D3D8/D3D9/D3DImm.dll`) in case they reappear.
|
|
||||||
|
|
||||||
## 📋 Branch `5.1.0b-in-progress`: multiplayer + RIO + source cleanup (2026-07-19)
|
|
||||||
|
|
||||||
### ConLobby V5.1.0b1 — Super6 mech rotation (c768f7c4)
|
|
||||||
Changes from Buddy 'Highlight' Taylor (MCHL), merged manually:
|
|
||||||
- Console version string bumped to **V5.1.0b1**.
|
|
||||||
- `ROOKIEMECH` defines expanded from 4 → **6 mechs**: added Archer (ID=1) and Warhammer (ID=62).
|
|
||||||
- 16-slot default assignments cycle through all 6 Super6 mechs.
|
|
||||||
- Right-click randomizer expanded from `random(0,3)` → `random(0,5)`.
|
|
||||||
|
|
||||||
### CRIOMAIN.CPP — Korean translation + RIO poll timeout scaling (16fca6c4, a712002f)
|
|
||||||
- Translated all EUC-KR/CP949 Korean developer comments (~35 lines) to English. File re-saved
|
|
||||||
as clean UTF-8. CRLF line endings preserved (`* -text` in `.gitattributes`).
|
|
||||||
⚠️ **Encoding hazard:** always read/write CRIOMAIN.CPP as binary (or with an explicit encoding
|
|
||||||
codec). Python text-mode `readlines()` silently strips `\r`, causing a 3000+-line git diff when
|
|
||||||
every line's `\r\n` becomes `\n`. If that happens, restore CRLF with `re.sub(b'(?<!\r)\n', b'\r\n', data)` in binary mode, then amend the commit.
|
|
||||||
- Added **`g_dwRIOPollTimeout`** global (default 50 ms). Computed in `SetupConnection` before the
|
|
||||||
receive loop using: `clamp(⌈480000/baud⌉, 5, 50)`. Preserves 50 ms at 9600 baud; floors at
|
|
||||||
5 ms for 115200 baud. Implemented with explicit ternary — **`min`/`max` are undeclared in this
|
|
||||||
translation unit under VC6** (not pulled in by CRIOMAIN's includes); use ternary or `__min`/`__max`.
|
|
||||||
|
|
||||||
### 16 pilots + 1 cameraship in multiplayer (f76dc05f)
|
|
||||||
`MW4Shell.cpp`:
|
|
||||||
- `CTCL_DefaultHostSetup` (non-coop): `Environment.NetworkMaxPlayers` set to
|
|
||||||
`params->m_maxPlayers + (CTCL_GetTeslaCountAll() - CTCL_GetTeslaCount())`.
|
|
||||||
The delta = camera-only seats (Tesla seats not assigned to pilots), reserving one extra
|
|
||||||
DirectPlay slot per cameraship so the 17th connection isn't rejected.
|
|
||||||
- `SetNetworkMissionParamater / PLAYER_LIMIT_PARAMETER`: same formula applied at runtime when
|
|
||||||
host changes the player limit. `gos_NetServerCommands(gos_Commend_UpdateMaxPlayers)` still called;
|
|
||||||
`break` must be present in this case (was accidentally dropped once — fall-through to
|
|
||||||
`JOIN_IN_PROGRESS_PARAMETER` corrupts `m_joinInProgress`).
|
|
||||||
- COOP branch unchanged (capped at 9+bots; no camera seat needed there).
|
|
||||||
|
|
||||||
`ConLobby.script`: launch guard `nTempPlayerCount > 16` raised to `> 17` so the cameraship
|
|
||||||
connection doesn't trigger "Too many player/bots".
|
|
||||||
|
|
||||||
### hsh/ BMP canonical renames (5813aeb6, 2026-07-23)
|
|
||||||
All `hsh/MFD/*.bmp` and `hsh/Mechs/*.bmp` filenames reconciled against the canonical stems
|
|
||||||
expected by game code. The engine loads MFD images via `huddamage.cpp` `texturename[]` array
|
|
||||||
(lowercase, no spaces) and Mechs portraits via `GetLocString` DNL strings (mixed-case with
|
|
||||||
spaces). Any mismatch = silently missing image at runtime.
|
|
||||||
Key renames:
|
|
||||||
- `hsh/MFD/assassinii.bmp` → `assassin2.bmp` (matches `texturename[]` canonical)
|
|
||||||
- `hsh/Mechs/battlemasteriic.bmp` → `battlemaster iic.bmp`
|
|
||||||
- `hsh/Mechs/mad cat mk.ii.bmp` → `mad cat mkii.bmp`
|
|
||||||
- `hsh/Mechs/behemoth ii.bmp` added (was absent)
|
|
||||||
Most other files in both directories are LFS pointer updates only (content unchanged).
|
|
||||||
|
|
||||||
### RookieMission configurable defaults via options.ini (5813aeb6, 2026-07-23)
|
|
||||||
CTCL (console) arcade mode has a "Rookie Mission" quick-launch that previously hardcoded all
|
|
||||||
game params. Now all 13 params are overridable from an `[RookieMission]` section in
|
|
||||||
`options.ini` (read by `CTCL_SetCDSP` at startup):
|
|
||||||
- `MW4Shell.cpp`: added 14 `g_` globals (`g_szRookieMission`, `g_nRookieGameType`, and 12
|
|
||||||
numeric params); registered as `gosScript_RegisterVariable` in `StartUp`/`ShutDown`;
|
|
||||||
`CTCL_SetCDSP` reads the `[RookieMission]` page via `NotationFile` and populates them.
|
|
||||||
Defaults: `"ScarabStronghold - Attrition"`, GameType=2 (Attrition), UnlimitedAmmo=1, all
|
|
||||||
others zero. `g_nRookieTimeLimit=-1` means "use the server's current time setting".
|
|
||||||
- `ConLobbyMission.script`: all hardcoded values in `MAIL_SET_ROOKIE_MISSION` handler replaced
|
|
||||||
with `$$g_szRookieMission$$` / `$$g_nRookieXxx$$` references.
|
|
||||||
- Requires rebuild: `MW4.exe` (Release + Profile).
|
|
||||||
|
|
||||||
### Mechlab turn rate label (5813aeb6, 2026-07-23)
|
|
||||||
`StringResource.rc` `IDS_ML_CH_TURNRATE`: "Turn Rate (Degrees/Sec.):" →
|
|
||||||
"Turn Rate (Top Speed Rad/Sec):" to match the actual `.data` field semantics
|
|
||||||
(`TopSpeedTurnRate` is in rad/s at top speed, not deg/s).
|
|
||||||
Requires rebuild: `ScriptStrings.dll`.
|
|
||||||
|
|
||||||
### BTFrstrm design documentation (840bc96c, 2026-07-23)
|
|
||||||
Two Word documents added to `BTFrstrm/`:
|
|
||||||
- `MechDependencyTree.docx` — dependency relationships between mech chassis/variants.
|
|
||||||
- `Special_Zones.docx` — documentation of special zone types used in maps/missions.
|
|
||||||
|
|
||||||
### mech_loadouts.md: MechEditor data model (0344418a, 2026-07-23)
|
|
||||||
`BTFrstrm/mech_loadouts.md` extended with a full reference section documenting the
|
|
||||||
MechEditor web app (`/home/rich/Repositories/MechEditor/mech_editor.py`, localhost:8765):
|
|
||||||
every `.data`/`.instance`/`.subsystems` field parsed, conversions performed (m/s ↔ kph,
|
|
||||||
rad/s ↔ deg/s), and `hsh/` naming rules for MFD/Mechs/HUD/Radar images. Canonical
|
|
||||||
reference for future mech data work.
|
|
||||||
|
|
||||||
### Load File autoconfig stabilization + docs update (2026-07-24)
|
|
||||||
End-to-end Load File flow for the console lobby was stabilized and verified with a
|
|
||||||
full-delta regression INI (all mission options + all 16 slots changed away from rookie
|
|
||||||
defaults), then round-tripped back via the Default button.
|
|
||||||
|
|
||||||
Key fixes in `ConLobby.script` / `ConLobbyMission.script`:
|
|
||||||
- Eliminated first-click vs second-click drift by moving auto-load to a dedicated
|
|
||||||
deterministic mission path and preventing redraw-time decal mutation.
|
|
||||||
- Corrected decal handling: map INI decal IDs to lobby dropdown indices, clamp invalid
|
|
||||||
indices, and show actual decal IDs in labels.
|
|
||||||
- Corrected mission+map sequencing: game type now rebuilds map list first; mission name
|
|
||||||
then resolves against that list (with fallback to map index 0).
|
|
||||||
- Fixed option-state application so first click applies all options (visibility/weather/
|
|
||||||
time/radar/heat/friendly fire/splash/unlimited/jam/advance/armor) without needing a
|
|
||||||
second click.
|
|
||||||
- Fixed Weapon Jam checkbox visibility refresh when set via Load File (UI now re-inits
|
|
||||||
correctly when heat/advanced states are applied).
|
|
||||||
|
|
||||||
New supported autoconfig key:
|
|
||||||
- Added `NoReturn=0|1` under `[mission]`:
|
|
||||||
- parser + script variable in `MW4Shell.cpp` (`g_nAutoNoReturn`),
|
|
||||||
- application in `ConLobbyMission.script` (`RESPAWN_LIMIT_PARAMETER`),
|
|
||||||
- docs + sample INIs updated.
|
|
||||||
|
|
||||||
Docs updates:
|
|
||||||
- `BTFrstrm/autoconfig-file-spec.html` corrected for real behavior:
|
|
||||||
- missing mission keys/section apply defaults (not current UI values),
|
|
||||||
- missing `MissionName` now falls back to first map for that game type,
|
|
||||||
- added `NoReturn` semantics and examples.
|
|
||||||
|
|
||||||
## 📋 STEP 10: Four-monitor MFD bring-up, display diagnostics, and the native-DirectDraw
|
|
||||||
## exclusive-mode wall (2026-07-25)
|
|
||||||
|
|
||||||
A long, dense session on the new 4-monitor bench (`MR_new`: AMD FirePro W4100, 4 outputs,
|
|
||||||
Win10). Everything below is empirical — measured on real hardware, not inferred.
|
|
||||||
|
|
||||||
### The root problem that made all of this hard
|
|
||||||
`CHSH_Device::InitFirst` / `InitSecond` (`CoreTech\Libraries\GameOS\render.cpp`) **discarded
|
|
||||||
every single `HRESULT`** (`SetCooperativeLevel`, `SetDisplayMode`, `CreateSurface`,
|
|
||||||
`GetAttachedSurface`, `QueryInterface`, `CreateDevice`) and **returned `true`
|
|
||||||
unconditionally**. A panel that failed to open produced no error, no crash and no log entry —
|
|
||||||
the monitor simply stayed on the desktop. SPEW is compiled out of shipping builds, so there
|
|
||||||
was no way to see any of it. **Fixing that visibility was what unblocked the whole session.**
|
|
||||||
|
|
||||||
### ✅ Diagnostics added (KEEP THESE — they are why everything below was findable)
|
|
||||||
- **`gos-displays.txt`** (written next to the exe by `VideoCard.cpp` `LogDisplayDevices()`):
|
|
||||||
`NumDevices`/`NumHWDevices`/`NumMonitors`, every DirectDraw device + `hw_rasterization`,
|
|
||||||
the role assignment (`FullScreenDevice`/`g_nNonDualHead`/`g_nDualHead`/`g_nDualHead2`/
|
|
||||||
`g_nMFD1`/`g_nMFD2`), `-tmon` APPLIED/REJECTED per slot, and the decisive
|
|
||||||
"mode 4 requires BOTH mfd1 and mfd2" line.
|
|
||||||
- **Per-call HRESULT logging** in `InitFirst`/`InitSecond` via `HSH_LogInit()` / `HSH_CheckHR()`
|
|
||||||
/ `HSH_HRName()` (27 `DDERR_*` codes decoded by name). Appends to the same file; each line is
|
|
||||||
written and flushed individually so **the log survives a crash**.
|
|
||||||
- **`gos-fps.txt`** — new **`-fps`** switch (`WinMain.cpp` `GOS_LogFrameRate`, hooked onto the
|
|
||||||
existing `frameRate` global). Per-second: frames, avg fps, **5% low**, worst frame in ms,
|
|
||||||
and a count of frames over 2x average ("hitches"), plus a **session summary** at exit with
|
|
||||||
true whole-session 1% / 0.1% lows (computed from a 0.5 ms-bucket histogram). Works in
|
|
||||||
**Release** — the engine's own `AddDebugData("FrameRate")` is `#ifdef LAB_ONLY`
|
|
||||||
(`MWMission.cpp`) so it only exists in `MW4pro.exe`. Off unless `-fps` is given (a global
|
|
||||||
read + branch when absent, no file created).
|
|
||||||
- ⚠️ **Lesson from the first real run: the instrument was measuring itself.** The original
|
|
||||||
version wrote one line per second straight to the file. The frame time is recorded
|
|
||||||
*before* the line is emitted, so the `WriteFile` cost landed in the **next** frame —
|
|
||||||
producing exactly one inflated frame every second (median worst-frame 24.4 ms against a
|
|
||||||
16.7 ms vsync interval, in 82% of seconds). Output is now buffered in memory and flushed
|
|
||||||
only when full or at exit (`atexit`), so a normal session performs no writes while
|
|
||||||
running. Trade-off: a hard crash loses the un-flushed tail — `gos-displays.txt` is the
|
|
||||||
crash-survivable log, this one is a measurement instrument.
|
|
||||||
- Also fixed: a "1% low" over 60 samples/sec degenerates to `nFrames/100 = 0` → clamped to
|
|
||||||
1 → literally the worst frame restated, so the column was redundant. Per-second is now a
|
|
||||||
5% low (worst 3-of-60); true 1% / 0.1% lows are in the session summary. And a single
|
|
||||||
frame longer than a second (a level load) no longer spills into following buckets and
|
|
||||||
emits a run of bogus one-frame rows.
|
|
||||||
|
|
||||||
### ✅ Crash-safety fix (independent of everything else, worth keeping)
|
|
||||||
`hsh_initialized` was set **unconditionally** after panel init. A failed panel therefore left
|
|
||||||
null surfaces and a null `IDirect3DDevice7` behind, and the per-frame path called straight
|
|
||||||
through them. Now: all four `InitSecond` overrides (`CMR`/`CRadar`/`CMFD`/`CMFDRight`) bail on
|
|
||||||
base failure, `CMFD_Device::InitFirst` reports the real result instead of always `true`, and
|
|
||||||
`hsh_initialized` is only set when the panels genuinely came up → **the game runs without MFDs
|
|
||||||
instead of dying**.
|
|
||||||
- **Crash signature to recognise:** `call [ecx+0x44]` with `ECX=0` = `IDirectDrawSurface7::GetDC`
|
|
||||||
on a never-created surface (verified against `build-env\dx7asdk\include\ddraw.h` vtable order).
|
|
||||||
Reported as `EXCEPTION : Attempt to read from address 0x00000044`.
|
|
||||||
|
|
||||||
### ✅ AppCompat shim — the single most important operational fact
|
|
||||||
**`DWM8And16BitMitigation` is keyed on the executable's FULL PATH.** A copy of the game at a
|
|
||||||
new path silently loses it. MW4 renders at `bitdepth=16` and **modern GPUs expose ZERO 16-bit
|
|
||||||
display modes** — the shim *synthesises* them (proved directly: crash dump shows
|
|
||||||
`16 bit modes :` EMPTY without the shim, populated with it).
|
|
||||||
- **Without the shim the error message actively misleads.** GameOS raises
|
|
||||||
`GOS_DXRASTERIZER_NOFULLSCREEN` — *"Another application is preventing use of full screen
|
|
||||||
mode"* (`DXRasterizer.cpp:~1125`). That is a **catch-all** fired after every `SetDisplayMode`
|
|
||||||
attempt fails; it even scans for NetMeeting. It sends you hunting for a conflicting program
|
|
||||||
that does not exist. The real cause is the missing shim / absent 16-bit modes.
|
|
||||||
- **NEW: `build-env\set-appcompat.ps1` + `set-appcompat.bat`** — self-locating (`$PSScriptRoot`)
|
|
||||||
one-click installer. Applies the layer to `MW4.exe`/`MW4pro.exe`/`MW4Ed2.exe` sitting next to
|
|
||||||
it, wherever that install lives; HKCU always, HKLM too if elevated (note the HKLM value format
|
|
||||||
differs — it carries a leading `$` marker). Verifies by reading back; detects the
|
|
||||||
`HIGHDPIAWARE`-only entry that *suppresses* the auto-shim (the original STEP 5 bug).
|
|
||||||
`-Remove` / `-WhatIfOnly` supported. **`deploy-mw4.ps1` now ships both into every deployment.**
|
|
||||||
|
|
||||||
### ✅ Exclusive fullscreen DOES work on Win10 without dgVoodoo2
|
|
||||||
Confirmed on the W4100 with system `ddraw.dll` and dgVoodoo2 physically removed: `MW4.exe`
|
|
||||||
alt-enters to exclusive fullscreen correctly **once the shim is applied to that exe path**.
|
|
||||||
Windowed mode also works natively with no shim at all (windowed sets
|
|
||||||
`Environment.bitDepth = DesktopBpp` = 32, so there is no mode switch). Console/shell confirmed
|
|
||||||
windowed; a **full mission windowed is still untested**.
|
|
||||||
|
|
||||||
### ❌ Native multi-monitor MFD is BLOCKED — and no flag combination fixes it
|
|
||||||
The panels' cooperative-level call was genuinely wrong (a latent 2002 bug): every panel asked to
|
|
||||||
be **both** the process focus window **and** its own device window, on the one shared `hWindow`,
|
|
||||||
*after* the main device had already taken exclusive mode on it. The main device
|
|
||||||
(`DXRasterizer.cpp:~1027`) already uses the correct two-call idiom
|
|
||||||
(`SETFOCUSWINDOW` alone, then `EXCLUSIVE|FULLSCREEN`) — tagged `//sanghoon`, same author. The
|
|
||||||
panels never were.
|
|
||||||
|
|
||||||
A new **`-tcoop <0-5>`** switch was added to test every plausible form on real hardware without a
|
|
||||||
rebuild between attempts. Results (no dgVoodoo2, shim applied, `-tmfds 4`):
|
|
||||||
|
|
||||||
| `-tcoop` | Flags | Result |
|
|
||||||
|---|---|---|
|
|
||||||
| 0 | `SETFOCUSWINDOW\|CREATEDEVICEWINDOW\|ALLOWREBOOT\|EXCLUSIVE\|FULLSCREEN` (legacy) | `DDERR_EXCLUSIVEMODEALREADYSET` |
|
|
||||||
| 1 | `CREATEDEVICEWINDOW\|EXCLUSIVE\|FULLSCREEN` (no focus claim) | `DDERR_INVALIDPARAMS` |
|
|
||||||
| 2 | `SETFOCUSWINDOW`, then `CREATEDEVICEWINDOW\|…` | `DDERR_INVALIDPARAMS` |
|
|
||||||
| 3 | `SETFOCUSWINDOW`, then `EXCLUSIVE\|FULLSCREEN` | 1st panel collides; **that collision steals exclusive from the main display**, after which panels 2+3 fully init (radar reached `CreateDevice(HAL) = DD_OK`). Side effect: desktop left at 1920x1080 **16bpp**. Not viable. |
|
|
||||||
| 4 | `EXCLUSIVE\|FULLSCREEN` only | `DDERR_EXCLUSIVEMODEALREADYSET` on **all** panels |
|
|
||||||
| 5 | `ALLOWREBOOT\|EXCLUSIVE\|FULLSCREEN` | `DDERR_EXCLUSIVEMODEALREADYSET` on **all** panels |
|
|
||||||
|
|
||||||
**CONCLUSION: on modern Windows only ONE DirectDraw object per process may hold exclusive
|
|
||||||
fullscreen.** The main display takes it; every secondary panel is refused. XP allowed multiple;
|
|
||||||
**dgVoodoo2 allows it because it is a full reimplementation of ddraw, not bound by that rule.**
|
|
||||||
=> **dgVoodoo2 cannot be removed by fixing flags.** The limitation is per *secondary display*,
|
|
||||||
not per feature, so it applies to **every mode that opens a second monitor** — all MFD modes
|
|
||||||
(`-tmfds 1/3/4`) **and cameraship mode**, which drives two displays with no MFDs at all via the
|
|
||||||
single-secondary `mr_device` path (`IsMultimonitorAvaliable()` returns false for
|
|
||||||
`_ECTCL_CameraShip`, so it falls to `IsSecondaryMonitorAvaliable()` — still a second exclusive
|
|
||||||
IDirectDraw7). **Console mode is the only configuration that needs no dgVoodoo2**, because it is
|
|
||||||
single-display. Default stays `-tcoop 0`.
|
|
||||||
(`-tcoop` is retained: it is how this was settled and will re-settle it on different hardware.)
|
|
||||||
|
|
||||||
### ✅ Working 4-monitor config (WITH dgVoodoo2)
|
|
||||||
- **dgVoodoo2 Scaling mode MUST be "Stretched, Keep Aspect Ratio".** Plain "Stretched" fails
|
|
||||||
*silently*: main + radar go fullscreen black, both MFD monitors keep showing the desktop, and
|
|
||||||
**every DirectDraw call still returns `DD_OK`** — the devices are alive but dgVoodoo2 never
|
|
||||||
drives those outputs. Diagnosed with a temporary per-panel colour-flash test (since removed).
|
|
||||||
- Device index → physical monitor is **1:1** on this bench (colour test confirmed): main=0,
|
|
||||||
radar=1, mfd-left=2, mfd-right=3, so `-tmon 1,2,3,4` is identical to auto-detection.
|
|
||||||
- **Confirmed working end-to-end: all three secondary panels present, full mission played.**
|
|
||||||
- ⚠️ **dgVoodoo2 is deliberately NOT in the repo and must NOT be — it breaks Windows XP
|
|
||||||
deployments.** The pod fleet is mixed: XP pods need native DirectDraw and nothing else, while
|
|
||||||
Win10/11 pods need dgVoodoo2 for any MFD mode. Shipping it in the build (or having
|
|
||||||
`deploy-mw4.ps1` place it) would push a Win10-only dependency onto XP machines and break them.
|
|
||||||
It stays an **installed-per-machine, OS-dependent prerequisite** set up by the pod owner on
|
|
||||||
Win10/11 only. `dgVoodoo.conf`/`dgVoodooCpl.exe` were removed in `0ceba9c7` for this reason —
|
|
||||||
do not "fix" that by re-adding them. The required setting (Scaling mode
|
|
||||||
`Stretched, Keep Aspect Ratio`, on the **General** tab) is documented in the pod-owner release
|
|
||||||
notes instead.
|
|
||||||
|
|
||||||
### 📐 Engine is 4:3 ONLY (relevant to every display decision)
|
|
||||||
`ImageHlp.cpp:~464` asserts the complete supported resolution set: **640x480, 512x384, 800x600,
|
|
||||||
960x720, 1024x768, 1280x1024 (5:4), 1600x1200**. There is no 16:9 mode and **no aspect
|
|
||||||
correction anywhere** in the codebase (the only `aspect` hits are texture-dimension caps and
|
|
||||||
CameraShip). On a 16:9 monitor a 4:3 image must be adapted by the scaler: plain stretch =
|
|
||||||
distorted (circles → ovals, reticle wrong); keep-aspect = correct geometry + pillarbox bars.
|
|
||||||
Native widescreen would require re-authoring every 2D/shell layout (all fixed 640x480 pixel
|
|
||||||
coordinates) — a content project, not a code tweak.
|
|
||||||
|
|
||||||
### 📐 Assessment: moving to borderless windowed (discussed, NOT started)
|
|
||||||
The only native path to multi-monitor, since it removes exclusive mode from the picture entirely.
|
|
||||||
Smaller than it sounds because the mechanisms already exist:
|
|
||||||
- The windowed present is already `wBlt(FrontBufferSurface, &Window, BackBufferSurface, …)` —
|
|
||||||
a blit to an arbitrary screen rect. `Blt` stretches when the dest rect differs in size, so
|
|
||||||
aspect-preserving borderless output is **rect maths, not new machinery**.
|
|
||||||
- Clipper wrappers (`wCreateClipper`/`wSetClipper`/`wSetHWnd`) already exist in `DirectDraw.cpp`,
|
|
||||||
unused by the fullscreen path.
|
|
||||||
- **None of the drawing code changes** — panels already render into `pDDSTarget` and composite;
|
|
||||||
`DrawQuad`/`DrawTexture`/fonts/`SwapRightState` don't care whether the present is Flip or Blt.
|
|
||||||
- Work is confined to `render.cpp`, `DXRasterizer.cpp`, `WinMain.cpp` (+ a little `Windows.cpp`):
|
|
||||||
panel init → `DDSCL_NORMAL` + clipper + offscreen render surface (~150 lines); ~4 panel `Flip`
|
|
||||||
sites → `Blt`; break the `HSH_EnterFullScreen2()` ↔ `EnterFullScreenMode()` coupling
|
|
||||||
(`DXRasterizer.cpp:~1132` is its ONLY call site, which is also why windowed mode currently
|
|
||||||
creates no panels at all); **new: explicit frame pacing** (windowed Blt has no vsync — this is
|
|
||||||
the same root cause as the known mechlab fast-spin bug).
|
|
||||||
- **Gains:** no dgVoodoo2, no shim, no 16-bit dependency, no exclusive-mode contention, aspect
|
|
||||||
under our control, and panels stay at their monitor's native mode so "this panel won't accept
|
|
||||||
640x480" becomes impossible.
|
|
||||||
- **Risk that decides it:** windowed D3D7 device creation is per-GPU (the *editor* hit
|
|
||||||
`DDERR_INVALIDOBJECT` on Win11 and needed DDrawCompat; the *game* succeeded natively on the
|
|
||||||
W4100). Version lockstep means one build must serve every pod.
|
|
||||||
- **Recommended staging:** (1) `-borderless` for the MAIN display only, default off; (2) convert
|
|
||||||
**one** panel (radar) — the small, make-or-break test of `DDSCL_NORMAL` + clipper +
|
|
||||||
D3D-on-offscreen on the target GPU; (3) all three panels; (4) retire dgVoodoo2 + shim. Keep
|
|
||||||
exclusive fullscreen switch-selectable indefinitely.
|
|
||||||
|
|
||||||
### Incidental findings
|
|
||||||
- **`-2dt` is not a recognised switch anywhere in the codebase**, despite appearing in production
|
|
||||||
`ctcl.ini` launch lines. Completely inert. (2D targets are already the default; `-3dt` is what
|
|
||||||
switches to the 3D model.)
|
|
||||||
- `NumHWDevices` (5) can exceed `NumDevices` (4) — it counts D3D device-enumeration callbacks, and
|
|
||||||
an adapter exposing both a HAL and a T&L HAL yields two. Benign; `InitSecond` hardcodes
|
|
||||||
`IID_IDirect3DHALDevice`.
|
|
||||||
- New switches are documented in `-help` (`-fps` under LOGGING AND DIAGNOSTICS, `-tcoop` under
|
|
||||||
DISPLAY AND VIDEO).
|
|
||||||
|
|
||||||
## STEP 11: Cameraship Map/Armor screen shows background but no overlays — SOLVED
|
|
||||||
## (2026-07-26): it is the CTCL role, NOT the video card
|
|
||||||
|
|
||||||
Reported as *"the secondary armor/score/map screen in cameraship mode shows the background BMP
|
|
||||||
fine but none of the overlay graphics, with certain video cards but not others"*. **The video
|
|
||||||
card is a red herring. The machine was not being told it was a cameraship.**
|
|
||||||
|
|
||||||
### Root cause
|
|
||||||
`-ctcltype <n>` maps **straight** to the role enum — no remapping
|
|
||||||
(`MW4Application.cpp:~1534`, `g_nCTCL = token[0]-'0'`; `ctcl_params.h`):
|
|
||||||
`1 = console`, **`2 = game pod`**, **`3 = cameraship`**, `4 = none`.
|
|
||||||
The failing launch line used `-ctcltype 2` (game pod). The overlay drawing in
|
|
||||||
`mw4\Code\MW4\hudchat.cpp:~596` is gated on
|
|
||||||
`bool draw_mr = CTCL_GetType()==_ECTCL_CameraShip;` (`#ifdef _DEBUG` -> unconditional `true`),
|
|
||||||
so with role 2 the overlay block simply never executes. Fixed by launching `-ctcltype 3`
|
|
||||||
(user-confirmed working).
|
|
||||||
|
|
||||||
### ⚠️ Why this is so hard to spot — the two gates are INDEPENDENT
|
|
||||||
**The Map/Armor screen opens and paints its background regardless of the CTCL role.**
|
|
||||||
`HSH_EnterFullScreen2` / `CMR_Device` decide purely on *"is a spare secondary monitor
|
|
||||||
available?"* and never consult `CTCL_GetType()`; only `hudchat.cpp` checks the role. So a wrong
|
|
||||||
`-ctcltype` produces a screen that lights up, shows the correct artwork, survives mode changes
|
|
||||||
and renders nothing — **visually identical to a graphics-card/DirectDraw fault**, which is
|
|
||||||
exactly why it got mis-attributed to specific GPUs. Diagnose it from `gos-displays.txt`
|
|
||||||
(`CTCL type = ...`), never by eye.
|
|
||||||
- Corollary: `mr_device` also opens in **non-cameraship** configs. Observed here with
|
|
||||||
`-tmfds 1` when `g_nDualHead = -1` (no spanned pair found): MFD mode 1 fell through to the
|
|
||||||
single-secondary `mr_device` path on a *game pod*, giving the same background-only screen.
|
|
||||||
- **Field triage:** on a failing machine read that pod's `ctcl.ini` launch line and its
|
|
||||||
`gos-displays.txt`. `CTCL type = 2` means it is misconfigured, not broken.
|
|
||||||
|
|
||||||
### Diagnostics added (kept)
|
|
||||||
- **`CTCL type = <n>` line in `gos-displays.txt`** (`render.cpp` `HSH_EnterFullScreen2`, via the
|
|
||||||
already-present `g_pfnCTCL_GetType` hook — no game-code dependency). Always logged, states in
|
|
||||||
words whether overlays will be drawn. One look settles the question.
|
|
||||||
- **`-tmr <0-3>`** Map/Armor diagnostic ladder (`g_nMRDiag`, `CMR_Device::BeginScene`):
|
|
||||||
0 = normal, 1 = background blit with `DDBLTFAST_WAIT|DDBLTFAST_NOCOLORKEY`,
|
|
||||||
2 = `Clear` instead of the background blit, 3 = additionally alpha-blend off + untextured
|
|
||||||
magenta `DrawQuad`. Results that cracked this: **3 drew magenta** (device/3D/flip all fine),
|
|
||||||
**2 was pure black** (the background blit was never erasing the overlays), 1 unchanged.
|
|
||||||
- **Draw-call counter** — `CHSH_Device::m_nDrawCalls`, bumped in `DrawQuad` / `DrawThickFrame` /
|
|
||||||
`DrawTexture`, reset in `CMR_Device::BeginScene`, reported for the first 5 frames from
|
|
||||||
`CMR_Device::EndScene` when `g_nMRDiag` is set. **This was the decisive instrument:**
|
|
||||||
`0 draw call(s)` proves the overlay code never ran (a gating problem), whereas non-zero with a
|
|
||||||
blank screen would mean it ran and drew invisibly (texture/alpha). Keep it — it separates
|
|
||||||
"not running" from "not visible" in one run.
|
|
||||||
- Also logged: `CMR_Device` surface creation (`pDDSBackground`/`pDDSTexture`/`pDDSMapTexture`)
|
|
||||||
plus the overlay texture's size/bpp and channel masks. Healthy reference reading on the W4100:
|
|
||||||
`256x256 16bpp a=0000F000 r=00000F00 g=000000F0 b=0000000F` (normal 4-bit alpha, not zero).
|
|
||||||
|
|
||||||
### Method note
|
|
||||||
Every hypothesis reasoned forward from the code was wrong again (blit erasing overlays; alpha
|
|
||||||
channel; per-GPU rendering). The `-tmr` ladder plus the draw-call counter settled it in two runs.
|
|
||||||
Consistent with the rest of STEP 10: **instrument, don't infer.**
|
|
||||||
|
|
||||||
## STEP 12: Intel iGPU + USB display MFD failure — was `-tmon` misread + a real
|
|
||||||
## panel re-entry leak (2026-08-05)
|
|
||||||
|
|
||||||
Reported as *"MFD modes work on a W4100 and a Quadro, and with the radar on a USB adapter, but
|
|
||||||
fail on a machine with CPU-integrated Intel graphics"* — 3 displays (main + 2 MFDs) on an
|
|
||||||
Intel HD 630, radar on a Trigger 6 USB adapter, Win10 + dgVoodoo2. Second MFD panel returned
|
|
||||||
`DDERR_EXCLUSIVEMODEALREADYSET`. **Neither the Intel iGPU nor the mixed-adapter setup was at
|
|
||||||
fault.** Two independent causes, both now fixed/instrumented.
|
|
||||||
|
|
||||||
### Cause 1 — Windows Display Settings numbers are NOT the DirectDraw device order
|
|
||||||
The operator set `-tmon 3,4,2,1` by reading the numbers off the Windows Display Settings
|
|
||||||
arrangement diagram. Those numbers are an **undocumented UI ordinal that no API exposes** and
|
|
||||||
that need not match `\\.\DISPLAYn` *or* the DirectDraw index. On this box all three differed:
|
|
||||||
|
|
||||||
| Settings | `\\.\DISPLAYn` | DDraw device | desktop X | role wanted |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| 3 (primary, 800x600) | DISPLAY1 | 0 | 0 | main |
|
|
||||||
| 4 | DISPLAY4 | 3 | 800 | radar |
|
|
||||||
| 2 | DISPLAY2 | 1 | 1440 | mfd1 |
|
|
||||||
| 1 | DISPLAY3 | 2 | 2080 | mfd2 |
|
|
||||||
|
|
||||||
A permutation with two accidental fixed points — no derivable rule, so it cannot be corrected
|
|
||||||
in code. `-tmon 1,4,2,3` (correct DirectDraw indices) worked first try, user-confirmed.
|
|
||||||
**This is why Windows itself ships an *Identify* button rather than publishing the mapping.**
|
|
||||||
|
|
||||||
### Cause 2 — panels were re-opened without being released (REAL BUG, all machines)
|
|
||||||
`EnterFullScreenMode()` (`DXRasterizer.cpp:1132`) calls `HSH_EnterFullScreen2()` on **every**
|
|
||||||
mode change and every lost-front-buffer recovery, but the teardown `HSH_DirectDrawRelease2()`
|
|
||||||
was only wired to `DirectDrawRelease()` — i.e. full shutdown. So `CHSH_Device::InitFirst()`
|
|
||||||
overwrote `pDD` with a fresh `IDirectDraw7` while the previous one still held exclusive
|
|
||||||
fullscreen, **leaking it and its exclusive claim for the life of the process**.
|
|
||||||
- The log shows it plainly: `HSH_EnterFullScreen2` runs **twice**; the first entry initialises
|
|
||||||
all panels `DD_OK`, the second fails on the same device.
|
|
||||||
- Only bites when a panel sits on the **Windows primary** — secondary outputs grant exclusive
|
|
||||||
mode again, the primary does not. Every working pod happens to have the *main display* on the
|
|
||||||
primary, so no panel is ever there. That is the whole reason it looked hardware-specific.
|
|
||||||
- **FIX:** `render.cpp` `HSH_EnterFullScreen2()` now calls `HSH_DirectDrawRelease2()` first when
|
|
||||||
`hsh_initialized || hsh_mrdev_initialized`. Tagged `[panelreinit]`.
|
|
||||||
|
|
||||||
### ✅ `gos-displays.txt` rewritten as a full startup trace (`VideoCard.cpp`)
|
|
||||||
Was: final device list + role numbers. Now: every stage in the order the game does it —
|
|
||||||
command line (with `-tmon` shown already converted 1-based→0-based), **Windows desktop topology**
|
|
||||||
(`EnumDisplayDevicesA`/`EnumDisplaySettingsA`), each enumeration callback with its GUID and
|
|
||||||
`HMONITOR` resolved to `\\.\DISPLAYn` + rect + primary flag, per-device ACCEPTED/REJECTED, the
|
|
||||||
device table **before and after** the NULL-device merge with `DeviceGUID` **and**
|
|
||||||
`guidDeviceIdentifier` and an **adapter grouping**, every index shift in the merge, every
|
|
||||||
role-selection decision *with the reason each device was skipped*, each `-tmon` override
|
|
||||||
(applied/rejected + what auto-detect had chosen), a **desktop left-to-right order** block, and a
|
|
||||||
**consistency check that names two roles landing on one device as a CLASH**.
|
|
||||||
- **Fixed a real desync while doing it:** the merge shifted `DeviceArray` but nothing tracked
|
|
||||||
which monitor each slot drove → `g_ahDevMonitor[]` is now shifted in lockstep. `HMONITOR` was
|
|
||||||
previously discarded entirely (`videoDevices` gained `hMonitor`; `BufferDevice` takes it).
|
|
||||||
- Startup-only, ~255 open-append-close writes (~25–130 ms), nothing on the frame path. Kept
|
|
||||||
unbuffered deliberately — this is the crash-survivable log (`gos-fps.txt` is the buffered one).
|
|
||||||
- APIs resolved via `GetProcAddress` with locally-declared `MONITORINFOEXA`/`DISPLAY_DEVICEA`
|
|
||||||
layouts, so nothing depends on the 1998 SDK having multimon headers.
|
|
||||||
|
|
||||||
### ✅ NEW: `-tident` — the game's own Identify
|
|
||||||
`MW4.exe -tident [3..120, default 20]` fills **every** display with a distinct colour and prints,
|
|
||||||
huge, the number to type into `-tmon`, plus its DirectDraw device index and the role currently
|
|
||||||
assigned to it. Then exits. This is the only reliable way to map monitors, precisely because the
|
|
||||||
Settings ordinal is unreadable.
|
|
||||||
- **Uses `DDSCL_NORMAL` + GDI on the primary surface — no exclusive mode, no mode change.**
|
|
||||||
Taking exclusive fullscreen on several devices at once is the very failure being diagnosed; a
|
|
||||||
diagnostic that trips over it is worthless. It paints onto each monitor's existing desktop, so
|
|
||||||
it works even on a pod where the MFD modes are broken.
|
|
||||||
- Opens the **real DirectDraw devices** rather than positioning GDI windows by `HMONITOR` — that
|
|
||||||
proves the device-index→physical-output association through the same path the panels use.
|
|
||||||
(Positioning by DirectDraw's own reported `HMONITOR` would be circular.)
|
|
||||||
- Implemented in `VideoCard.cpp` `IdentifyDisplays()`, called at the end of `FindVideoCards()`
|
|
||||||
then `ExitProcess(0)`. Everything it does is also written to `gos-displays.txt`.
|
|
||||||
|
|
||||||
### Docs
|
|
||||||
`-help` for `-tmon` now states outright that these are **not** Windows Display Settings numbers
|
|
||||||
and points at `-tident`/`gos-displays.txt`; the old `-tmon 1,2,3,4` example was actively inviting
|
|
||||||
the mistake. Release notes gained a `-tident` section, the clash/re-entry fixes, and an upgrade
|
|
||||||
checklist step.
|
|
||||||
|
|
||||||
### Method note
|
|
||||||
Same lesson as STEPs 10 and 11, and it caught me out again: my forward-reasoned hypothesis
|
|
||||||
(duplicate `-tmon` assignment) was **wrong**, and the new logging disproved it in one run — the
|
|
||||||
consistency check explicitly printed *"No duplicate device assignments"*. The double
|
|
||||||
`HSH_EnterFullScreen2` was only visible because the log covers the whole start-up rather than a
|
|
||||||
summary. **Instrument, don't infer.**
|
|
||||||
|
|
||||||
## ✅ STEP 13: External MFD/Radar damage mappings installed + art audited (2026-08-07)
|
|
||||||
|
|
||||||
The coordinate and art workflow for the external MFD and Radar damage paper dolls is now fully
|
|
||||||
documented in **`MFD-RADAR-MAPPINGS.md`**. Start there; do not rediscover the image transforms,
|
|
||||||
tuple meanings, runtime offsets, legacy J&J formats, or BMP comparison rules from scratch.
|
|
||||||
|
|
||||||
### Controlling source and semantics
|
|
||||||
- `Gameleap\code\CoreTech\Libraries\GameOS\coord.cpp` owns four positional 65x11 arrays:
|
|
||||||
`texuv2`/`offset2` = external MFD source rectangles/exploded origins;
|
|
||||||
`texuv3`/`offset3` = Radar source rectangles/exploded origins. Numeric Mech ID (array row) is
|
|
||||||
authoritative; comments are labels. Zone order is `LL,RL,LA,RA,RT,LT,CT,CTR,HD,S1,S2`.
|
|
||||||
- These are NOT the normal cockpit HUD's `texuv`/`offset` arrays in `huddamage.cpp`, and NOT the
|
|
||||||
small atlas images under `hsh\MFD`.
|
|
||||||
- Runtime loose art is `Gameleap\mw4\hsh\hud\<stem>.bmp` for MFD and
|
|
||||||
`Gameleap\mw4\hsh\radar\hud\<stem>.bmp` for Radar. Coordinate changes require an MW4.exe
|
|
||||||
rebuild because `DXRasterizer.cpp` includes `coord.cpp`; loose art changes do not require a
|
|
||||||
`.mw4` resource repack.
|
|
||||||
|
|
||||||
### Installed mappings and reproducible audit (`97558039`)
|
|
||||||
- Added `Finished HUDS from J&J/generate_comparison_maps.py` (Pillow) plus 38 LFS-tracked review
|
|
||||||
PNGs and `COMPARISON-SUMMARY.md`. Red = current `coord.cpp`; green = supplied J&J geometry.
|
|
||||||
- Installed every complete supplied set: **19 displays across 13 chassis** (12 MFD + 7 Radar).
|
|
||||||
Final generator result: **19 exact, 0 different, 0 warnings, 7 missing opposite-display
|
|
||||||
inputs**. Missing inputs are Argus/Fafnir/Flea/Gladiator/Kodiak/Longbow Radar and Hellspawn MFD;
|
|
||||||
they were not guessed or changed.
|
|
||||||
- J&J data has two formats. Modern = 4-value unexploded source rectangle + 2-value exploded
|
|
||||||
origin. Legacy = 2-value source upper-left + 4-value exploded bounding box; derive source width/
|
|
||||||
height from that exploded box. Combined files use section headings. All-zero tuples may appear
|
|
||||||
at either width and mean "absent zone."
|
|
||||||
- Normalized four unambiguous input typos without changing reviewed geometry: Behemoth MFD LT
|
|
||||||
`1742→174`, Behemoth Radar CT `202.242→202,242`, blank Behemoth Radar S2 `→0,0`, and Fafnir MFD
|
|
||||||
LL `162.326→162,326`.
|
|
||||||
- Preserve validated odd coordinates rather than rounding them. Radar divides full-size authored
|
|
||||||
values by two using integer arithmetic, so rounding changes final placement.
|
|
||||||
|
|
||||||
### Behemoth II inheritance (`deafc2b0`)
|
|
||||||
- Behemoth II is Mech ID 12 and intentionally shares Behemoth ID 11's art and geometry. All four
|
|
||||||
ID 12 rows now exactly inherit ID 11. The generator asserts this relationship and fails on any
|
|
||||||
future divergence. There is **no Annihilator II** in the 65-ID roster; do not invent a row or
|
|
||||||
runtime stem for it.
|
|
||||||
|
|
||||||
### Runtime-art result: no copies needed
|
|
||||||
- Decoded every supplied exploded 512x512 BMP and compared pixels against its canonical `hsh`
|
|
||||||
destination. All 19 supplied display assets were already pixel-identical. File hashes differed
|
|
||||||
because BMP mode/palette/header encoding differed (`P`/`L`/`RGB`), which is not an art change;
|
|
||||||
no `hsh` file was replaced.
|
|
||||||
- Separately compared `hud\behemothii.bmp` and `radar\hud\behemothii.bmp` to Behemoth's runtime
|
|
||||||
files; both existing Behemoth II files were already pixel-identical 512x512 grayscale images.
|
|
||||||
- Compare decoded pixels before copying. The exploded BMP is the runtime asset; unexploded BMPs
|
|
||||||
and full-color images are authoring references. Resolve canonical stems rather than trusting
|
|
||||||
supplied names (`assian2_*` is a typo; runtime is `assassin2.bmp`; preserve existing `Fafnir.bmp`
|
|
||||||
case on Linux).
|
|
||||||
|
|
||||||
### Validation and remaining work
|
|
||||||
- Run: `python3 "Finished HUDS from J&J/generate_comparison_maps.py"`. Expected current output:
|
|
||||||
`Generated 38 maps for 19 display sets: 19 exact, 0 different` and
|
|
||||||
`Warnings: 0; missing display sets: 7`, followed by the Behemoth II inheritance assertion in
|
|
||||||
`COMPARISON-SUMMARY.md`.
|
|
||||||
- `coord.cpp` must remain CRLF-only and retain four 65-row arrays with 11 zones per row.
|
|
||||||
- **Still required:** rebuild Release/Profile on the Windows VC6 machine, deploy MW4.exe, and test
|
|
||||||
intact/damaged states on physical MFD and Radar displays. Linux validation proves source/data
|
|
||||||
equality and image alignment, not runtime hardware behavior.
|
|
||||||
|
|
||||||
## Next steps (proposed)
|
## Next steps (proposed)
|
||||||
- [ ] (Parked, diagnostics-only, cannot affect a real pod) Two gaps found while testing `-tident`
|
|
||||||
on a **single-monitor VM** (2026-08-05). Both only occur when one physical monitor is exposed as
|
|
||||||
two DirectDraw devices, which happens because the NULL-device merge is gated on
|
|
||||||
`NumMonitors>=2` (`VideoCard.cpp`) — by design, it is a multi-monitor fixup, so a single-monitor
|
|
||||||
box keeps the alias in slot 0.
|
|
||||||
1. **`-tident` overpaints itself.** With device 0 = NULL alias and device 1 = the real output,
|
|
||||||
both resolve to the same screen, so it paints red/"1" then immediately green/"2" over the top.
|
|
||||||
Looks like a glitch; is actually correct. Should detect devices sharing an `HMONITOR` and
|
|
||||||
label them together (`1 & 2 - same monitor`) instead of painting sequentially.
|
|
||||||
2. **The clash check compares device INDICES, not resolved monitors.** On that VM it reported
|
|
||||||
*"No duplicate device assignments"* while `main`→device 0 (primary alias) and `radar`→device 1
|
|
||||||
(`\\.\DISPLAY49`) were the **same physical monitor** — i.e. exactly the collision the check
|
|
||||||
exists to predict, reported as all-clear. Fix: treat a device with no `HMONITOR` as the
|
|
||||||
Windows primary, then compare resolved `HMONITOR`s rather than indices.
|
|
||||||
Neither can occur on a multi-monitor pod. Worth doing only if bench/VM testing starts relying on
|
|
||||||
the check being trustworthy.
|
|
||||||
- [ ] (Researched, NOT started) Make `-window` work for **all** modes — full findings in
|
|
||||||
**`WINDOWED-MODE.md`** (repo root, 2026-08-05). Headline: `-window` does not fail for MFD/
|
|
||||||
cameraship modes, it **silently disables** them, because `use_shgui` is derived from
|
|
||||||
`Environment.fullScreen` (`MW4Application.cpp:1373`). Beyond that one line the work is a windowed
|
|
||||||
variant of `CHSH_Device::InitFirst`/`InitSecond` (DDSCL_NORMAL + clipper + offscreen backbuffer,
|
|
||||||
no SetDisplayMode), one HWND per panel, and 8 `Flip`→`Blt` sites in `WinMain.cpp`. The deciding
|
|
||||||
risk is whether **four** windowed D3D7 devices can coexist in one process — the editor failed
|
|
||||||
this on Win11 and needed DDrawCompat (STEP 8), while the game's own windowed main display
|
|
||||||
succeeds on the W4100. Overlaps heavily with the borderless-windowed assessment below.
|
|
||||||
- [ ] (Decision pending) Borderless-windowed migration — see the staged assessment in STEP 10.
|
|
||||||
Step 2 (one panel) is the cheap, decisive experiment. Note this is the only route that would
|
|
||||||
remove the dgVoodoo2 prerequisite **without** breaking the XP pods, since it needs no external
|
|
||||||
DLL on either OS.
|
|
||||||
- [ ] Test a **full mission windowed** (only the console/shell has been verified windowed).
|
|
||||||
- [x] ~~Windowed 3D viewport on Win11~~ — DONE via DDrawCompat (see STEP 8 viewport section).
|
- [x] ~~Windowed 3D viewport on Win11~~ — DONE via DDrawCompat (see STEP 8 viewport section).
|
||||||
- [ ] (Optional) Curate remaining WIP content as features are exercised (editor loads dev `Content\`).
|
- [ ] (Optional) Curate remaining WIP content as features are exercised (editor loads dev `Content\`).
|
||||||
- [ ] (Optional) Build Debug/Armor configs (need `dbg.bin`/`arm.bin` output dirs).
|
- [ ] (Optional) Build Debug/Armor configs (need `dbg.bin`/`arm.bin` output dirs).
|
||||||
|
|||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -3,7 +3,7 @@ RL 184,170,262,302
|
|||||||
LA 12,106,126,174
|
LA 12,106,126,174
|
||||||
RA 212,106,326,174
|
RA 212,106,326,174
|
||||||
RT 176,86,226,174
|
RT 176,86,226,174
|
||||||
LT 110,82,160,174
|
LT 110,82,160,1742
|
||||||
CT 140,96,198,224
|
CT 140,96,198,224
|
||||||
CTR 0,0,0,0
|
CTR 0,0,0,0
|
||||||
HD 164,122,174,134
|
HD 164,122,174,134
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -4,8 +4,8 @@ LA 8,26
|
|||||||
RA 302,26
|
RA 302,26
|
||||||
RT 294,130
|
RT 294,130
|
||||||
LT 108,130
|
LT 108,130
|
||||||
CT 202,242
|
CT 202.242
|
||||||
CTR 0,0
|
CTR 0,0
|
||||||
HD 230,174
|
HD 230,174
|
||||||
S1 202,28
|
S1 202,28
|
||||||
S2 0,0
|
S2
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,86 +0,0 @@
|
|||||||
# J&J Coordinate Comparison Summary
|
|
||||||
|
|
||||||
Generated by `generate_comparison_maps.py`. Red is the current `coord.cpp` mapping; green is the provided J&J mapping.
|
|
||||||
|
|
||||||
`EXACT` means all eleven source rectangles and all eleven exploded offsets match numerically. `DIFFERENT` means at least one value differs; inspect both generated images.
|
|
||||||
|
|
||||||
| Mech | Display | Status | Source rectangles different | Exploded offsets different |
|
|
||||||
|---|---:|---:|---:|---:|
|
|
||||||
| Annihilator | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Annihilator | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Argus | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| AssassinII | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| AssassinII | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Avatar | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Avatar | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Behemoth | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Behemoth | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| BlackHawk | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| BlackHawk | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Fafnir | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Flea | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Gladiator | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| hellspawn | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Kodiak | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Longbow | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Warhammer | MFD | **EXACT** | 0/11 | 0/11 |
|
|
||||||
| Warhammer | RADAR | **EXACT** | 0/11 | 0/11 |
|
|
||||||
|
|
||||||
## Inherited mappings
|
|
||||||
|
|
||||||
- `Behemoth II` (Mech ID 12) inherits all four coordinate rows from `Behemoth` (Mech ID 11); generator assertion passed
|
|
||||||
|
|
||||||
## Missing comparison inputs
|
|
||||||
|
|
||||||
- `Argus` RADAR: no complete provided mapping/image set configured
|
|
||||||
- `Fafnir` RADAR: no complete provided mapping/image set configured
|
|
||||||
- `Flea` RADAR: no complete provided mapping/image set configured
|
|
||||||
- `Gladiator` RADAR: no complete provided mapping/image set configured
|
|
||||||
- `Kodiak` RADAR: no complete provided mapping/image set configured
|
|
||||||
- `Longbow` RADAR: no complete provided mapping/image set configured
|
|
||||||
- `hellspawn` MFD: no complete provided mapping/image set configured
|
|
||||||
|
|
||||||
## Input warnings
|
|
||||||
|
|
||||||
- None
|
|
||||||
|
|
||||||
## Generated files
|
|
||||||
|
|
||||||
- `Annihilator/MFD/annihilator_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Annihilator/MFD/annihilator_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Annihilator/Radar/annihilator_radar_unexploded_coords_comparison.png`
|
|
||||||
- `Annihilator/Radar/annihilator_radar_exploded_coords_comparison.png`
|
|
||||||
- `Argus/MFD/argus_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Argus/MFD/argus_mfd_exploded_coords_comparison.png`
|
|
||||||
- `AssassinII/HUD/assian2_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `AssassinII/HUD/assian2_mfd_exploded_coords_comparison.png`
|
|
||||||
- `AssassinII/Radar/assian2_radar_unexploded_coords_comparison.png`
|
|
||||||
- `AssassinII/Radar/assian2_radar_exploded_coords_comparison.png`
|
|
||||||
- `Avatar/MFD/avatar_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Avatar/MFD/avatar_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Avatar/Radar/avatar_radar_unexploded_coords_comparison.png`
|
|
||||||
- `Avatar/Radar/avatar_radar_exploded_coords_comparison.png`
|
|
||||||
- `Behemoth/HUD/behemoth_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Behemoth/HUD/behemoth_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Behemoth/Radar/behemoth_radar_unexploded_coords_comparison.png`
|
|
||||||
- `Behemoth/Radar/behemoth_radar_exploded_coords_comparison.png`
|
|
||||||
- `BlackHawk/MFD/blackhawk_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `BlackHawk/MFD/blackhawk_mfd_exploded_coords_comparison.png`
|
|
||||||
- `BlackHawk/Radar/blackhawk_radar_unexploded_coords_comparison.png`
|
|
||||||
- `BlackHawk/Radar/blackhawk_radar_exploded_coords_comparison.png`
|
|
||||||
- `Fafnir/HUD/fafnir_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Fafnir/HUD/fafnir_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Flea/MFD/flea_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Flea/MFD/flea_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Gladiator/MFD/gladiator_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Gladiator/MFD/gladiator_mfd_exploded_coords_comparison.png`
|
|
||||||
- `hellspawn/radar/hellspawn_radar_unexploded_coords_comparison.png`
|
|
||||||
- `hellspawn/radar/hellspawn_radar_exploded_coords_comparison.png`
|
|
||||||
- `Kodiak/MFD/kodiak_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Kodiak/MFD/kodiak_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Longbow/MFD/longbow_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Longbow/MFD/longbow_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Warhammer/MFD/warhammer_mfd_unexploded_coords_comparison.png`
|
|
||||||
- `Warhammer/MFD/warhammer_mfd_exploded_coords_comparison.png`
|
|
||||||
- `Warhammer/Radar/warhammer_radar_unexploded_coords_comparison.png`
|
|
||||||
- `Warhammer/Radar/warhammer_radar_exploded_coords_comparison.png`
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
|||||||
LL 86,142,162,326
|
LL 86,142,162.326
|
||||||
RL 178,142,254,326
|
RL 178,142,254,326
|
||||||
LA 24,22,68,134
|
LA 24,22,68,134
|
||||||
RA 272,22,316,134
|
RA 272,22,316,134
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,339 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import re
|
|
||||||
from dataclasses import dataclass
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from PIL import Image, ImageDraw, ImageFont
|
|
||||||
|
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parent
|
|
||||||
REPO = ROOT.parent
|
|
||||||
COORD = REPO / "Gameleap/code/CoreTech/Libraries/GameOS/coord.cpp"
|
|
||||||
ZONES = ("LL", "RL", "LA", "RA", "RT", "LT", "CT", "CTR", "HD", "S1", "S2")
|
|
||||||
COLORS = {"current": "#ff3030", "provided": "#20e060"}
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class Display:
|
|
||||||
folder: str
|
|
||||||
mech_id: int
|
|
||||||
kind: str
|
|
||||||
output_dir: str
|
|
||||||
slug: str
|
|
||||||
unexploded_text: str
|
|
||||||
exploded_text: str
|
|
||||||
unexploded_image: str | None
|
|
||||||
exploded_image: str
|
|
||||||
source_image: str | None = None
|
|
||||||
runtime_stem: str | None = None
|
|
||||||
|
|
||||||
|
|
||||||
DISPLAYS = (
|
|
||||||
Display("Annihilator", 0, "mfd", "MFD", "annihilator", "MFD/Annihilator Unexploded.txt", "MFD/Annihilator Exploded.txt", "MFD/annihilator_unexploded.bmp", "MFD/annihilator_Exploded.bmp"),
|
|
||||||
Display("Annihilator", 0, "radar", "Radar", "annihilator", "Radar/Annihilator Unexploded.txt", "Radar/Annihilator Exploded.txt", "Radar/annihilator_unexploded.bmp", "Radar/annihilator_exploded.bmp"),
|
|
||||||
Display("Argus", 4, "mfd", "MFD", "argus", "MFD/Argus Cords.txt", "MFD/Argus Cords.txt", "MFD/argus_unexpanded.bmp", "MFD/argus_explode.bmp"),
|
|
||||||
Display("AssassinII", 5, "mfd", "HUD", "assian2", "HUD/assassinII_HUD_unexploded.txt", "HUD/assassinII_hud_exploded.txt", None, "HUD/assian2_hud_exploded.bmp", "assian2_color.png", "assassin2"),
|
|
||||||
Display("AssassinII", 5, "radar", "Radar", "assian2", "Radar/assassinII_radar_unexploded.txt", "Radar/assassinII_radar_exploded.txt", "Radar/assian2_radar_unexploded.bmp", "Radar/assian2_radar_exploded.bmp", None, "assassin2"),
|
|
||||||
Display("Avatar", 7, "mfd", "MFD", "avatar", "MFD/Avatar Coords.txt", "MFD/Avatar Coords.txt", "MFD/avatar_unexploded.bmp", "MFD/avatar_exploded.bmp"),
|
|
||||||
Display("Avatar", 7, "radar", "Radar", "avatar", "Radar/Avatar Coords.txt", "Radar/Avatar Coords.txt", "Radar/avatar_unexploded.bmp", "Radar/avatar_exploded.bmp"),
|
|
||||||
Display("Behemoth", 11, "mfd", "HUD", "behemoth", "HUD/Behemoth_HUD_unexploded.txt", "HUD/Behemoth_HUD_exploded.txt", "HUD/Behemoth_HUD_unexploded.bmp", "HUD/Behemoth_HUD_exploded.bmp"),
|
|
||||||
Display("Behemoth", 11, "radar", "Radar", "behemoth", "Radar/Behemoth_unexploded.txt", "Radar/Behemoth_exploded.txt", "Radar/Behemoth_unexploded_radar.bmp", "Radar/Behemoth_radar_exploded.bmp"),
|
|
||||||
Display("BlackHawk", 13, "mfd", "MFD", "blackhawk", "MFD/Black Hawk.txt", "MFD/Black Hawk.txt", "MFD/blackhawk_unexploded.bmp", "MFD/blackhawk_exploded.bmp"),
|
|
||||||
Display("BlackHawk", 13, "radar", "Radar", "blackhawk", "Radar/Black Hawk.txt", "Radar/Black Hawk.txt", "Radar/blackhawk_unexploded.bmp", "Radar/blackhawk_exploded.bmp"),
|
|
||||||
Display("Fafnir", 27, "mfd", "HUD", "fafnir", "HUD/fafnir_unexploded.txt", "HUD/fafnir_exploded.txt", "HUD/fafnir_unexploded.bmp", "HUD/fafnir_exploded.bmp"),
|
|
||||||
Display("Flea", 28, "mfd", "MFD", "flea", "MFD/Flea unexploded.txt", "MFD/Flea exploded.txt", "MFD/flea_unexploded copy.bmp", "MFD/flea_exploded copy.bmp"),
|
|
||||||
Display("Gladiator", 29, "mfd", "MFD", "gladiator", "MFD/Gladiator unexploded.txt", "MFD/Gladiator Exploded.txt", "MFD/gladiator_unexploded copy.bmp", "MFD/gladiator_exploded copy.bmp"),
|
|
||||||
Display("hellspawn", 33, "radar", "radar", "hellspawn", "radar/hellspawn_radar_unexploded.txt", "radar/hellspawn_radar_exploded.txt", "radar/hellspawn_radar_unexploded.bmp", "radar/hellspawn_radar_exploded.bmp"),
|
|
||||||
Display("Kodiak", 37, "mfd", "MFD", "kodiak", "MFD/Kodiak Cords.txt", "MFD/Kodiak Cords.txt", "MFD/kodiak_unexpanded.bmp", "MFD/kodiak_Explode.bmp"),
|
|
||||||
Display("Longbow", 39, "mfd", "MFD", "longbow", "MFD/Lomgbow unexploded.txt", "MFD/Longbow exploded.txt", "MFD/longbow_unexploded copy.bmp", "MFD/longbow_exploded copy.bmp"),
|
|
||||||
Display("Warhammer", 62, "mfd", "MFD", "warhammer", "MFD/Warhammer unexploded.txt", "MFD/Warhammer exploded.txt", "MFD/warhammer_unexploded copy.bmp", "MFD/warhammer_exploded.bmp"),
|
|
||||||
Display("Warhammer", 62, "radar", "Radar", "warhammer", "Radar/Warhammer unexploded.txt", "Radar/Warhammer exploded.txt", "Radar/warhammer_unexploded copy.bmp", "Radar/warhammer_exploded.bmp"),
|
|
||||||
)
|
|
||||||
|
|
||||||
INHERITED_MAPPINGS = (
|
|
||||||
("Behemoth II", 12, "Behemoth", 11),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_coord_arrays() -> dict[str, list[list[tuple[int, ...]]]]:
|
|
||||||
text = COORD.read_bytes().decode("ascii")
|
|
||||||
arrays = {}
|
|
||||||
for name in ("texuv2", "offset2", "texuv3", "offset3"):
|
|
||||||
match = re.search(rf"\b{name}\[.*?\]=\{{\r?\n(.*?)\r?\n\}};", text, re.S)
|
|
||||||
if not match:
|
|
||||||
raise RuntimeError(f"Could not find {name} in {COORD}")
|
|
||||||
rows = []
|
|
||||||
for line in match.group(1).splitlines():
|
|
||||||
if not line.lstrip().startswith("{{"):
|
|
||||||
continue
|
|
||||||
values = [
|
|
||||||
tuple(map(int, group.split(",")))
|
|
||||||
for group in re.findall(r"\{\s*([0-9 ]+(?:,\s*[0-9 ]+){1,3})\s*\}", line)
|
|
||||||
]
|
|
||||||
if len(values) != len(ZONES):
|
|
||||||
raise RuntimeError(f"Expected 11 zones in {name} row: {line}")
|
|
||||||
rows.append(values)
|
|
||||||
if len(rows) != 65:
|
|
||||||
raise RuntimeError(f"Expected 65 active rows in {name}, found {len(rows)}")
|
|
||||||
arrays[name] = rows
|
|
||||||
return arrays
|
|
||||||
|
|
||||||
|
|
||||||
def parse_measurements(path: Path, wanted_section: str, warnings: list[str]) -> dict[str, tuple[int, ...]]:
|
|
||||||
rows = {}
|
|
||||||
section = None
|
|
||||||
for line_number, raw in enumerate(path.read_text(errors="replace").splitlines(), 1):
|
|
||||||
stripped = raw.strip()
|
|
||||||
lower = stripped.lower()
|
|
||||||
zone_match = re.match(r"^(LL|RL|LA|RA|RT|LT|CT|CTR|HD|S1|S2)\b(.*)$", stripped, re.I)
|
|
||||||
if not zone_match:
|
|
||||||
if "unexploded" in lower or "unexpanded" in lower:
|
|
||||||
section = "unexploded"
|
|
||||||
elif "exploded" in lower or "explode" in lower:
|
|
||||||
section = "exploded"
|
|
||||||
continue
|
|
||||||
if section and section != wanted_section:
|
|
||||||
continue
|
|
||||||
zone = zone_match.group(1).upper()
|
|
||||||
remainder = zone_match.group(2)
|
|
||||||
numbers = tuple(map(int, re.findall(r"\d+", remainder)))
|
|
||||||
if "." in remainder:
|
|
||||||
warnings.append(f"{path.relative_to(ROOT)}:{line_number}: treated '.' as a coordinate separator")
|
|
||||||
if not numbers:
|
|
||||||
warnings.append(f"{path.relative_to(ROOT)}:{line_number}: blank {zone} value treated as zero")
|
|
||||||
rows[zone] = numbers
|
|
||||||
return rows
|
|
||||||
|
|
||||||
|
|
||||||
def normalize_measurements(display: Display, warnings: list[str]) -> tuple[list[tuple[int, ...]], list[tuple[int, ...]]]:
|
|
||||||
base = ROOT / display.folder
|
|
||||||
unexploded_path = base / display.unexploded_text
|
|
||||||
exploded_path = base / display.exploded_text
|
|
||||||
unexploded = parse_measurements(unexploded_path, "unexploded", warnings)
|
|
||||||
exploded = parse_measurements(exploded_path, "exploded", warnings)
|
|
||||||
|
|
||||||
unexploded_lengths = {len(value) for value in unexploded.values() if value and any(value)}
|
|
||||||
exploded_lengths = {len(value) for value in exploded.values() if value and any(value)}
|
|
||||||
if unexploded_lengths == {4} and exploded_lengths == {2}:
|
|
||||||
mode = "modern"
|
|
||||||
elif unexploded_lengths == {2} and exploded_lengths == {4}:
|
|
||||||
mode = "legacy"
|
|
||||||
else:
|
|
||||||
raise RuntimeError(
|
|
||||||
f"Cannot determine format for {display.folder} {display.kind}: "
|
|
||||||
f"unexploded lengths={unexploded_lengths}, exploded lengths={exploded_lengths}"
|
|
||||||
)
|
|
||||||
|
|
||||||
rectangles = []
|
|
||||||
offsets = []
|
|
||||||
for zone in ZONES:
|
|
||||||
un = unexploded.get(zone, ())
|
|
||||||
ex = exploded.get(zone, ())
|
|
||||||
if not un:
|
|
||||||
un = (0, 0, 0, 0) if mode == "modern" else (0, 0)
|
|
||||||
if not ex:
|
|
||||||
ex = (0, 0) if mode == "modern" else (0, 0, 0, 0)
|
|
||||||
expected_un = 4 if mode == "modern" else 2
|
|
||||||
expected_ex = 2 if mode == "modern" else 4
|
|
||||||
if un and not any(un):
|
|
||||||
un = (0,) * expected_un
|
|
||||||
if ex and not any(ex):
|
|
||||||
ex = (0,) * expected_ex
|
|
||||||
if len(un) != expected_un or len(ex) != expected_ex:
|
|
||||||
raise RuntimeError(f"Invalid {zone} values for {display.folder} {display.kind}: {un}, {ex}")
|
|
||||||
if mode == "modern":
|
|
||||||
rectangle = un
|
|
||||||
offset = ex
|
|
||||||
else:
|
|
||||||
width = ex[2] - ex[0]
|
|
||||||
height = ex[3] - ex[1]
|
|
||||||
rectangle = (un[0], un[1], un[0] + width, un[1] + height) if any(ex) else (0, 0, 0, 0)
|
|
||||||
offset = ex[:2]
|
|
||||||
rectangles.append(rectangle)
|
|
||||||
offsets.append(offset)
|
|
||||||
return rectangles, offsets
|
|
||||||
|
|
||||||
|
|
||||||
def load_unexploded(display: Display) -> Image.Image:
|
|
||||||
base = ROOT / display.folder
|
|
||||||
if display.source_image:
|
|
||||||
source = Image.open(base / display.source_image).convert("RGB")
|
|
||||||
scaled = source.resize((320, 320), Image.Resampling.LANCZOS)
|
|
||||||
prepared = Image.new("RGB", (340, 340), "black")
|
|
||||||
prepared.paste(scaled, (10, 10))
|
|
||||||
else:
|
|
||||||
prepared = Image.open(base / display.unexploded_image).convert("RGB")
|
|
||||||
if prepared.size == (512, 512):
|
|
||||||
return prepared
|
|
||||||
if prepared.width > 512 or prepared.height > 512:
|
|
||||||
raise RuntimeError(f"Unexpected unexploded size {prepared.size} for {display.folder} {display.kind}")
|
|
||||||
canvas = Image.new("RGB", (512, 512), "black")
|
|
||||||
canvas.paste(prepared, (0, 0))
|
|
||||||
return canvas
|
|
||||||
|
|
||||||
|
|
||||||
def component_boxes(rectangles: list[tuple[int, ...]], offsets: list[tuple[int, ...]]) -> list[tuple[int, ...]]:
|
|
||||||
boxes = []
|
|
||||||
for rectangle, offset in zip(rectangles, offsets):
|
|
||||||
if not any(rectangle) or not any(offset):
|
|
||||||
boxes.append((0, 0, 0, 0))
|
|
||||||
continue
|
|
||||||
width = rectangle[2] - rectangle[0]
|
|
||||||
height = rectangle[3] - rectangle[1]
|
|
||||||
boxes.append((offset[0], offset[1], offset[0] + width, offset[1] + height))
|
|
||||||
return boxes
|
|
||||||
|
|
||||||
|
|
||||||
def draw_legend(draw: ImageDraw.ImageDraw, font: ImageFont.ImageFont) -> None:
|
|
||||||
draw.rectangle((365, 12, 505, 67), fill="black", outline="white", width=1)
|
|
||||||
draw.line((377, 30, 402, 30), fill=COLORS["current"], width=3)
|
|
||||||
draw.text((410, 22), "current", fill=COLORS["current"], font=font)
|
|
||||||
draw.line((377, 51, 402, 51), fill=COLORS["provided"], width=3)
|
|
||||||
draw.text((410, 43), "provided", fill=COLORS["provided"], font=font)
|
|
||||||
|
|
||||||
|
|
||||||
def draw_comparison(
|
|
||||||
image: Image.Image,
|
|
||||||
current: list[tuple[int, ...]],
|
|
||||||
provided: list[tuple[int, ...]],
|
|
||||||
output: Path,
|
|
||||||
mark_origins: bool,
|
|
||||||
) -> None:
|
|
||||||
draw = ImageDraw.Draw(image)
|
|
||||||
font = ImageFont.load_default(size=14)
|
|
||||||
for label, boxes in (("current", current), ("provided", provided)):
|
|
||||||
color = COLORS[label]
|
|
||||||
for zone, box in zip(ZONES, boxes):
|
|
||||||
if not any(box):
|
|
||||||
continue
|
|
||||||
draw.rectangle(box, outline=color, width=3)
|
|
||||||
if mark_origins:
|
|
||||||
x, y = box[:2]
|
|
||||||
draw.line((x - 4, y, x + 5, y), fill=color, width=2)
|
|
||||||
draw.line((x, y - 4, x, y + 5), fill=color, width=2)
|
|
||||||
draw.text((box[0] + 3, box[1] + 2), zone, fill=color, font=font, stroke_width=2, stroke_fill="black")
|
|
||||||
draw_legend(draw, font)
|
|
||||||
output.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
image.save(output)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_provided(
|
|
||||||
display: Display,
|
|
||||||
rectangles: list[tuple[int, ...]],
|
|
||||||
offsets: list[tuple[int, ...]],
|
|
||||||
warnings: list[str],
|
|
||||||
) -> None:
|
|
||||||
source_limit = 340 if display.kind == "mfd" else 512
|
|
||||||
for zone, rectangle, offset in zip(ZONES, rectangles, offsets):
|
|
||||||
if any(rectangle):
|
|
||||||
if rectangle[2] <= rectangle[0] or rectangle[3] <= rectangle[1]:
|
|
||||||
warnings.append(f"{display.folder} {display.kind} {zone}: non-positive source rectangle {rectangle}")
|
|
||||||
if min(rectangle) < 0 or max(rectangle) > source_limit:
|
|
||||||
warnings.append(f"{display.folder} {display.kind} {zone}: source rectangle outside 0..{source_limit}: {rectangle}")
|
|
||||||
if any(offset) and (offset[0] < 0 or offset[1] < 0 or offset[0] > 512 or offset[1] > 512):
|
|
||||||
warnings.append(f"{display.folder} {display.kind} {zone}: offset outside 512 canvas: {offset}")
|
|
||||||
|
|
||||||
|
|
||||||
def difference_count(left: list[tuple[int, ...]], right: list[tuple[int, ...]]) -> int:
|
|
||||||
return sum(a != b for a, b in zip(left, right))
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
|
||||||
arrays = parse_coord_arrays()
|
|
||||||
results = []
|
|
||||||
all_warnings = []
|
|
||||||
generated = []
|
|
||||||
|
|
||||||
for variant_name, variant_id, base_name, base_id in INHERITED_MAPPINGS:
|
|
||||||
for array_name in ("texuv2", "offset2", "texuv3", "offset3"):
|
|
||||||
if arrays[array_name][variant_id] != arrays[array_name][base_id]:
|
|
||||||
raise RuntimeError(
|
|
||||||
f"{variant_name} (ID {variant_id}) must inherit {array_name} "
|
|
||||||
f"from {base_name} (ID {base_id})"
|
|
||||||
)
|
|
||||||
|
|
||||||
for display in DISPLAYS:
|
|
||||||
warnings = []
|
|
||||||
provided_rectangles, provided_offsets = normalize_measurements(display, warnings)
|
|
||||||
validate_provided(display, provided_rectangles, provided_offsets, warnings)
|
|
||||||
current_rectangles = arrays["texuv2" if display.kind == "mfd" else "texuv3"][display.mech_id]
|
|
||||||
current_offsets = arrays["offset2" if display.kind == "mfd" else "offset3"][display.mech_id]
|
|
||||||
|
|
||||||
output_dir = ROOT / display.folder / display.output_dir
|
|
||||||
unexploded_output = output_dir / f"{display.slug}_{display.kind}_unexploded_coords_comparison.png"
|
|
||||||
exploded_output = output_dir / f"{display.slug}_{display.kind}_exploded_coords_comparison.png"
|
|
||||||
draw_comparison(
|
|
||||||
load_unexploded(display),
|
|
||||||
current_rectangles,
|
|
||||||
provided_rectangles,
|
|
||||||
unexploded_output,
|
|
||||||
mark_origins=False,
|
|
||||||
)
|
|
||||||
exploded_image = Image.open(ROOT / display.folder / display.exploded_image).convert("RGB")
|
|
||||||
draw_comparison(
|
|
||||||
exploded_image,
|
|
||||||
component_boxes(current_rectangles, current_offsets),
|
|
||||||
component_boxes(provided_rectangles, provided_offsets),
|
|
||||||
exploded_output,
|
|
||||||
mark_origins=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
rectangle_differences = difference_count(current_rectangles, provided_rectangles)
|
|
||||||
offset_differences = difference_count(current_offsets, provided_offsets)
|
|
||||||
status = "EXACT" if rectangle_differences == 0 and offset_differences == 0 else "DIFFERENT"
|
|
||||||
results.append((display, status, rectangle_differences, offset_differences, warnings))
|
|
||||||
generated.extend((unexploded_output, exploded_output))
|
|
||||||
all_warnings.extend(warnings)
|
|
||||||
|
|
||||||
configured = {(display.folder.lower(), display.kind) for display in DISPLAYS}
|
|
||||||
missing = []
|
|
||||||
for folder in sorted(path.name for path in ROOT.iterdir() if path.is_dir()):
|
|
||||||
for kind in ("mfd", "radar"):
|
|
||||||
if (folder.lower(), kind) not in configured:
|
|
||||||
missing.append((folder, kind))
|
|
||||||
|
|
||||||
lines = [
|
|
||||||
"# J&J Coordinate Comparison Summary",
|
|
||||||
"",
|
|
||||||
"Generated by `generate_comparison_maps.py`. Red is the current `coord.cpp` mapping; green is the provided J&J mapping.",
|
|
||||||
"",
|
|
||||||
"`EXACT` means all eleven source rectangles and all eleven exploded offsets match numerically. `DIFFERENT` means at least one value differs; inspect both generated images.",
|
|
||||||
"",
|
|
||||||
"| Mech | Display | Status | Source rectangles different | Exploded offsets different |",
|
|
||||||
"|---|---:|---:|---:|---:|",
|
|
||||||
]
|
|
||||||
for display, status, rectangle_differences, offset_differences, _ in results:
|
|
||||||
lines.append(f"| {display.folder} | {display.kind.upper()} | **{status}** | {rectangle_differences}/11 | {offset_differences}/11 |")
|
|
||||||
|
|
||||||
lines.extend(("", "## Inherited mappings", ""))
|
|
||||||
for variant_name, variant_id, base_name, base_id in INHERITED_MAPPINGS:
|
|
||||||
lines.append(
|
|
||||||
f"- `{variant_name}` (Mech ID {variant_id}) inherits all four coordinate rows "
|
|
||||||
f"from `{base_name}` (Mech ID {base_id}); generator assertion passed"
|
|
||||||
)
|
|
||||||
|
|
||||||
lines.extend(("", "## Missing comparison inputs", ""))
|
|
||||||
for folder, kind in missing:
|
|
||||||
lines.append(f"- `{folder}` {kind.upper()}: no complete provided mapping/image set configured")
|
|
||||||
|
|
||||||
lines.extend(("", "## Input warnings", ""))
|
|
||||||
if all_warnings:
|
|
||||||
for warning in sorted(set(all_warnings)):
|
|
||||||
lines.append(f"- {warning}")
|
|
||||||
else:
|
|
||||||
lines.append("- None")
|
|
||||||
|
|
||||||
lines.extend(("", "## Generated files", ""))
|
|
||||||
for output in generated:
|
|
||||||
lines.append(f"- `{output.relative_to(ROOT)}`")
|
|
||||||
lines.append("")
|
|
||||||
(ROOT / "COMPARISON-SUMMARY.md").write_text("\n".join(lines))
|
|
||||||
|
|
||||||
exact = sum(status == "EXACT" for _, status, _, _, _ in results)
|
|
||||||
print(f"Generated {len(generated)} maps for {len(results)} display sets: {exact} exact, {len(results) - exact} different")
|
|
||||||
print(f"Warnings: {len(set(all_warnings))}; missing display sets: {len(missing)}")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -104,7 +104,7 @@ char *TimeToString( double secs )
|
|||||||
else
|
else
|
||||||
if( secs*1000000.f >= 1.0f )
|
if( secs*1000000.f >= 1.0f )
|
||||||
{
|
{
|
||||||
sprintf(TimeStr,"%.2f us", secs*1000000.f);
|
sprintf(TimeStr,"%.2f µS", secs*1000000.f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ const char *DivStrings[] =
|
|||||||
"1nS / div", // 10^-9
|
"1nS / div", // 10^-9
|
||||||
"10nS / div", // 10^-8
|
"10nS / div", // 10^-8
|
||||||
"100nS / div",
|
"100nS / div",
|
||||||
"1us / div",
|
"1µS / div",
|
||||||
"10us / div",
|
"10µS / div",
|
||||||
"100us / div",
|
"100µS / div",
|
||||||
"1mS / div",
|
"1mS / div",
|
||||||
"10mS / div",
|
"10mS / div",
|
||||||
"100mS / div",
|
"100mS / div",
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ char *TimeToString( double secs )
|
|||||||
else
|
else
|
||||||
if( secs*1000000.f >= 1.0f )
|
if( secs*1000000.f >= 1.0f )
|
||||||
{
|
{
|
||||||
sprintf(TimeStr,"%.2f us", secs*1000000.f);
|
sprintf(TimeStr,"%.2f µS", secs*1000000.f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ const char *DivStrings[] =
|
|||||||
"1nS / div", // 10^-9
|
"1nS / div", // 10^-9
|
||||||
"10nS / div", // 10^-8
|
"10nS / div", // 10^-8
|
||||||
"100nS / div",
|
"100nS / div",
|
||||||
"1us / div",
|
"1µS / div",
|
||||||
"10us / div",
|
"10µS / div",
|
||||||
"100us / div",
|
"100µS / div",
|
||||||
"1mS / div",
|
"1mS / div",
|
||||||
"10mS / div",
|
"10mS / div",
|
||||||
"100mS / div",
|
"100mS / div",
|
||||||
|
|||||||
@@ -1032,19 +1032,19 @@ void __stdcall gos_SetViewport( DWORD LeftX, DWORD TopY, DWORD Width, DWORD Heig
|
|||||||
// You can only clear the backbuffer or Z buffer on the FIRST setup viewport (outside the Begin/End Scene
|
// You can only clear the backbuffer or Z buffer on the FIRST setup viewport (outside the Begin/End Scene
|
||||||
//
|
//
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
void __cdecl ClearTargetCameraBackBuffer()
|
void __cdecl ClearTargetCameraBackBuffer()
|
||||||
{
|
{
|
||||||
D3DRECT rc={0,10,120,112};
|
D3DRECT rc={0,10,120,112};
|
||||||
wClear(d3dDevice7,1,&rc,D3DCLEAR_TARGET,0xFF00FFFF,0,0);
|
wClear(d3dDevice7,1,&rc,D3DCLEAR_TARGET,0xFF00FFFF,0,0);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
void __stdcall gos_SetupViewport( bool FillZ, float ZBuffer, bool FillBG, DWORD BGColor, float top, float left, float bottom, float right, bool ClearStencil, DWORD StencilValue )
|
void __stdcall gos_SetupViewport( bool FillZ, float ZBuffer, bool FillBG, DWORD BGColor, float top, float left, float bottom, float right, bool ClearStencil, DWORD StencilValue )
|
||||||
{
|
{
|
||||||
//sanghoon
|
//상훈짱...
|
||||||
//This violates the normal rules, so we suppress the ASSERT.
|
//원래의 법칙에 어긋나는 행동이기 때문에 ASSERT를 무시한다.
|
||||||
//gosASSERT( !InsideBeginScene || !(FillZ || FillBG) );
|
//gosASSERT( !InsideBeginScene || !(FillZ || FillBG) );
|
||||||
//
|
//
|
||||||
// Work out size of viewport
|
// Work out size of viewport
|
||||||
|
|||||||
@@ -47,11 +47,11 @@ extern DWORD gDisableJoystick;
|
|||||||
bool DisablePolling=0;
|
bool DisablePolling=0;
|
||||||
void CMRestoreEffects( int stick );
|
void CMRestoreEffects( int stick );
|
||||||
|
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
int g_bUseOrgJoy = TRUE;
|
int g_bUseOrgJoy = TRUE;
|
||||||
void (__stdcall *g_pfnRIO_Joy)(DIJOYSTATE& js) = NULL; // Check out Test ..
|
void (__stdcall *g_pfnRIO_Joy)(DIJOYSTATE& js) = NULL; // Check out Test ..
|
||||||
bool g_bNoWeaponRangeCheck = false;
|
bool g_bNoWeaponRangeCheck = false;
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Initialize the DirectInput devices
|
// Initialize the DirectInput devices
|
||||||
@@ -479,7 +479,7 @@ extern DWORD EnableDisplayInfo;
|
|||||||
|
|
||||||
if( EnableDisplayInfo==0 ) {
|
if( EnableDisplayInfo==0 ) {
|
||||||
disp:
|
disp:
|
||||||
sprintf(DisplayInfoText, "COIN: %d coins", g_nCoinCount);
|
sprintf(DisplayInfoText, "COIN: %d 코인이래요", g_nCoinCount);
|
||||||
EnableDisplayInfo = 1;
|
EnableDisplayInfo = 1;
|
||||||
} else if (EnableDisplayInfo==2) {
|
} else if (EnableDisplayInfo==2) {
|
||||||
if( timeGetTime() < EndDisplayInfoTime+50 ) {
|
if( timeGetTime() < EndDisplayInfoTime+50 ) {
|
||||||
|
|||||||
@@ -100,11 +100,11 @@ IDirectDraw7* DDobject = NULL; // Primiary DirectDraw object (for persistant
|
|||||||
IDirectDraw7* CurrentDDobject = NULL; // DirectDraw object for rendering (can be the same as DDObject)
|
IDirectDraw7* CurrentDDobject = NULL; // DirectDraw object for rendering (can be the same as DDObject)
|
||||||
IDirectDrawSurface7* ZBufferSurface = NULL; // ZBuffer surface
|
IDirectDrawSurface7* ZBufferSurface = NULL; // ZBuffer surface
|
||||||
IDirectDrawSurface7* RefZBufferSurface = NULL; // Referemce rasterizer ZBuffer surface
|
IDirectDrawSurface7* RefZBufferSurface = NULL; // Referemce rasterizer ZBuffer surface
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
IDirectDrawSurface7* SH_TargetBufferSurface = NULL;
|
IDirectDrawSurface7* SH_TargetBufferSurface = NULL;
|
||||||
IDirectDrawSurface7* SH_SwirlTexture= NULL;
|
IDirectDrawSurface7* SH_SwirlTexture= NULL;
|
||||||
IDirectDrawSurface7* SH_GameEndTexture= NULL;
|
IDirectDrawSurface7* SH_GameEndTexture= NULL;
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
|
|
||||||
DDSURFACEDESC2 BackBufferddsd;
|
DDSURFACEDESC2 BackBufferddsd;
|
||||||
//
|
//
|
||||||
@@ -167,7 +167,7 @@ float GammaSetting=0.0;
|
|||||||
bool UseGammaCorrection=0;
|
bool UseGammaCorrection=0;
|
||||||
float UserGamma=1.0f;
|
float UserGamma=1.0f;
|
||||||
|
|
||||||
//sanghoon begin
|
//����¯-begin
|
||||||
bool use_shgui = false;
|
bool use_shgui = false;
|
||||||
bool hsh_initialized=false;
|
bool hsh_initialized=false;
|
||||||
bool hsh_mrdev_initialized=false;
|
bool hsh_mrdev_initialized=false;
|
||||||
@@ -176,7 +176,7 @@ bool hsh_mrdev_initialized=false;
|
|||||||
#include "coord.cpp"
|
#include "coord.cpp"
|
||||||
//#include "hsh_dxras.cpp"
|
//#include "hsh_dxras.cpp"
|
||||||
#include "render.hpp"
|
#include "render.hpp"
|
||||||
//sanghoon end
|
//����¯-end
|
||||||
|
|
||||||
//
|
//
|
||||||
// Value range 0-10,000, default 750 (See DirectX docs)
|
// Value range 0-10,000, default 750 (See DirectX docs)
|
||||||
@@ -1021,11 +1021,11 @@ void EnterFullScreenMode()
|
|||||||
//
|
//
|
||||||
|
|
||||||
#ifdef LAB_ONLY
|
#ifdef LAB_ONLY
|
||||||
//sanghoon
|
//����¯
|
||||||
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_SETFOCUSWINDOW );
|
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_SETFOCUSWINDOW );
|
||||||
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
|
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
|
||||||
#else
|
#else
|
||||||
//sanghoon
|
//����¯
|
||||||
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_SETFOCUSWINDOW );
|
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_SETFOCUSWINDOW );
|
||||||
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
|
wSetCooperativeLevel( CurrentDDobject, hWindow, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
|
||||||
#endif
|
#endif
|
||||||
@@ -1127,11 +1127,11 @@ void EnterFullScreenMode()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//sanghoon begin
|
//����¯-begin
|
||||||
if(use_shgui){
|
if(use_shgui){
|
||||||
HSH_EnterFullScreen2();
|
HSH_EnterFullScreen2();
|
||||||
}
|
}
|
||||||
//sanghoon end
|
//����¯-end
|
||||||
|
|
||||||
//
|
//
|
||||||
// Changed modes, create all the surfaces
|
// Changed modes, create all the surfaces
|
||||||
@@ -1164,7 +1164,7 @@ void EnterFullScreenMode()
|
|||||||
// Debugging information
|
// Debugging information
|
||||||
//
|
//
|
||||||
SPEW(( GROUP_DIRECTDRAW, "EnterFullScreenMode() Finished" ));
|
SPEW(( GROUP_DIRECTDRAW, "EnterFullScreenMode() Finished" ));
|
||||||
//sanghoon
|
//����
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1289,7 +1289,7 @@ void DisplayBackBuffer()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
extern bool sh_game_started;
|
extern bool sh_game_started;
|
||||||
static FILE* fp=0;
|
static FILE* fp=0;
|
||||||
static recorded_count=0;
|
static recorded_count=0;
|
||||||
@@ -1352,11 +1352,11 @@ extern bool sh_game_started;
|
|||||||
pp=(double*)malloc(800*600*2);
|
pp=(double*)malloc(800*600*2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
#endif
|
#endif
|
||||||
wFlip( FrontBufferSurface,NULL,DDFLIP_DONOTWAIT );//|DDFLIP_INTERVAL2 );
|
wFlip( FrontBufferSurface,NULL,DDFLIP_DONOTWAIT );//|DDFLIP_INTERVAL2 );
|
||||||
//sanghoon marker..
|
//���� ��ħ..
|
||||||
//sanghoon
|
//����
|
||||||
//wFlip( FrontBufferSurface,NULL,DDFLIP_WAIT );
|
//wFlip( FrontBufferSurface,NULL,DDFLIP_WAIT );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1403,11 +1403,11 @@ extern bool sh_game_started;
|
|||||||
//
|
//
|
||||||
void DirectDrawRelease()
|
void DirectDrawRelease()
|
||||||
{
|
{
|
||||||
//sanghoon begin
|
//����¯-begin
|
||||||
if(use_shgui){
|
if(use_shgui){
|
||||||
HSH_DirectDrawRelease2();
|
HSH_DirectDrawRelease2();
|
||||||
}
|
}
|
||||||
//sanghoon end
|
//����¯-end
|
||||||
|
|
||||||
SPEW(( GROUP_DIRECTDRAW, "DirectDrawRelease()" ));
|
SPEW(( GROUP_DIRECTDRAW, "DirectDrawRelease()" ));
|
||||||
SafeFPU();
|
SafeFPU();
|
||||||
@@ -1496,7 +1496,7 @@ void DirectDrawRelease()
|
|||||||
wRelease( ZBufferSurface );
|
wRelease( ZBufferSurface );
|
||||||
ZBufferSurface=0;
|
ZBufferSurface=0;
|
||||||
}
|
}
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
//DirectDrawRelease
|
//DirectDrawRelease
|
||||||
if( SH_TargetBufferSurface)
|
if( SH_TargetBufferSurface)
|
||||||
{
|
{
|
||||||
@@ -1513,7 +1513,7 @@ void DirectDrawRelease()
|
|||||||
wRelease( SH_GameEndTexture );
|
wRelease( SH_GameEndTexture );
|
||||||
SH_GameEndTexture=0;
|
SH_GameEndTexture=0;
|
||||||
}
|
}
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
if( GammaControlInterface )
|
if( GammaControlInterface )
|
||||||
{
|
{
|
||||||
wRelease( GammaControlInterface );
|
wRelease( GammaControlInterface );
|
||||||
@@ -1593,20 +1593,20 @@ void DirectDrawCreateDDObject()
|
|||||||
//
|
//
|
||||||
// Create the NULL (primary) DirectDraw object
|
// Create the NULL (primary) DirectDraw object
|
||||||
//
|
//
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
/*
|
/*
|
||||||
wDirectDrawCreateEx( &DeviceArray[0].DeviceGUID, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
wDirectDrawCreateEx( &DeviceArray[0].DeviceGUID, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
||||||
// wDirectDrawCreateEx( &DeviceArray[Environment.FullScreenDevice].DeviceGUID, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
// wDirectDrawCreateEx( &DeviceArray[Environment.FullScreenDevice].DeviceGUID, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
||||||
wSetCooperativeLevel( DDobject, hWindow, DDSCL_NORMAL );
|
wSetCooperativeLevel( DDobject, hWindow, DDSCL_NORMAL );
|
||||||
CurrentDDobject=DDobject;
|
CurrentDDobject=DDobject;
|
||||||
*/
|
*/
|
||||||
//sanghoon ..
|
//���� �ҽ�..
|
||||||
//wDirectDrawCreateEx(&DeviceArray[0].DeviceGUID, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
//wDirectDrawCreateEx(&DeviceArray[0].DeviceGUID, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
||||||
wDirectDrawCreateEx(NULL, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
wDirectDrawCreateEx(NULL, (void**)&DDobject, IID_IDirectDraw7, NULL );
|
||||||
|
|
||||||
wSetCooperativeLevel( DDobject, hWindow, DDSCL_NORMAL );
|
wSetCooperativeLevel( DDobject, hWindow, DDSCL_NORMAL );
|
||||||
CurrentDDobject=DDobject;
|
CurrentDDobject=DDobject;
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -1630,11 +1630,11 @@ bool SetupMode( bool FullScreen, DWORD Renderer )
|
|||||||
BackBufferSurface=0;
|
BackBufferSurface=0;
|
||||||
ClipperObject=0;
|
ClipperObject=0;
|
||||||
ZBufferSurface=0;
|
ZBufferSurface=0;
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
SH_TargetBufferSurface = 0;
|
SH_TargetBufferSurface = 0;
|
||||||
SH_SwirlTexture=0;
|
SH_SwirlTexture=0;
|
||||||
SH_GameEndTexture=0;
|
SH_GameEndTexture=0;
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
Maind3dDevice7=0;
|
Maind3dDevice7=0;
|
||||||
d3dDevice7=0;
|
d3dDevice7=0;
|
||||||
DDSURFACEDESC2 ddsd;
|
DDSURFACEDESC2 ddsd;
|
||||||
@@ -1993,7 +1993,7 @@ bool SetupMode( bool FullScreen, DWORD Renderer )
|
|||||||
}
|
}
|
||||||
wAddAttachedSurface( BackBufferSurface, ZBufferSurface );
|
wAddAttachedSurface( BackBufferSurface, ZBufferSurface );
|
||||||
|
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
{
|
{
|
||||||
DDSURFACEDESC2 rdesc;
|
DDSURFACEDESC2 rdesc;
|
||||||
memset(&rdesc,0,sizeof(ddsd));
|
memset(&rdesc,0,sizeof(ddsd));
|
||||||
@@ -2019,7 +2019,7 @@ bool SetupMode( bool FullScreen, DWORD Renderer )
|
|||||||
|
|
||||||
if(SUCCEEDED(wCreateSurface( CurrentDDobject, &rdesc, &SH_SwirlTexture, NULL ))){
|
if(SUCCEEDED(wCreateSurface( CurrentDDobject, &rdesc, &SH_SwirlTexture, NULL ))){
|
||||||
;
|
;
|
||||||
//Draw texture content to screen. .
|
//ȭ�鿡 �ؽ��� ������ ����.
|
||||||
}
|
}
|
||||||
|
|
||||||
rdesc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE;
|
rdesc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE;
|
||||||
@@ -2031,11 +2031,11 @@ bool SetupMode( bool FullScreen, DWORD Renderer )
|
|||||||
|
|
||||||
if(SUCCEEDED(wCreateSurface( CurrentDDobject, &rdesc, &SH_GameEndTexture, NULL ))){
|
if(SUCCEEDED(wCreateSurface( CurrentDDobject, &rdesc, &SH_GameEndTexture, NULL ))){
|
||||||
;
|
;
|
||||||
//Draw texture content to screen. .
|
//ȭ�鿡 �ؽ��� ������ ����.
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
//
|
//
|
||||||
// Get the Z buffer pixel format (nVidia may always match front bit depth)
|
// Get the Z buffer pixel format (nVidia may always match front bit depth)
|
||||||
//
|
//
|
||||||
@@ -2258,7 +2258,7 @@ Failed:
|
|||||||
wRelease( ZBufferSurface );
|
wRelease( ZBufferSurface );
|
||||||
ZBufferSurface=0;
|
ZBufferSurface=0;
|
||||||
}
|
}
|
||||||
//sanghoon
|
//����
|
||||||
//SetupMode
|
//SetupMode
|
||||||
if( SH_TargetBufferSurface)
|
if( SH_TargetBufferSurface)
|
||||||
{
|
{
|
||||||
@@ -2275,7 +2275,7 @@ Failed:
|
|||||||
wRelease( SH_SwirlTexture );
|
wRelease( SH_SwirlTexture );
|
||||||
SH_SwirlTexture=0;
|
SH_SwirlTexture=0;
|
||||||
}
|
}
|
||||||
//sanghoon
|
//����
|
||||||
if( ClipperObject )
|
if( ClipperObject )
|
||||||
{
|
{
|
||||||
if( FrontBufferSurface )
|
if( FrontBufferSurface )
|
||||||
@@ -2578,7 +2578,7 @@ void DirectDrawCreateAllBuffers()
|
|||||||
wRelease( ZBufferSurface );
|
wRelease( ZBufferSurface );
|
||||||
ZBufferSurface=0;
|
ZBufferSurface=0;
|
||||||
}
|
}
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
//DirectDrawCreateAllBuffers
|
//DirectDrawCreateAllBuffers
|
||||||
if( SH_TargetBufferSurface)
|
if( SH_TargetBufferSurface)
|
||||||
{
|
{
|
||||||
@@ -2595,7 +2595,7 @@ void DirectDrawCreateAllBuffers()
|
|||||||
wRelease( SH_SwirlTexture );
|
wRelease( SH_SwirlTexture );
|
||||||
SH_SwirlTexture=0;
|
SH_SwirlTexture=0;
|
||||||
}
|
}
|
||||||
//sanghoon marker
|
//���� ��
|
||||||
if( ClipperObject )
|
if( ClipperObject )
|
||||||
{
|
{
|
||||||
if( FrontBufferSurface )
|
if( FrontBufferSurface )
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ HRESULT wEndScene( IDirect3DDevice7* d3dDevice7 )
|
|||||||
|
|
||||||
//Original
|
//Original
|
||||||
//if( FAILED(result) )
|
//if( FAILED(result) )
|
||||||
//sanghoon
|
//상훈
|
||||||
if( FAILED(result) && result!=DDERR_SURFACELOST)
|
if( FAILED(result) && result!=DDERR_SURFACELOST)
|
||||||
PAUSE(( "FAILED (0x%x - %s) - EndScene()",result,ErrorNumberToMessage(result)));
|
PAUSE(( "FAILED (0x%x - %s) - EndScene()",result,ErrorNumberToMessage(result)));
|
||||||
|
|
||||||
|
|||||||
@@ -38,10 +38,6 @@ typedef struct
|
|||||||
GUID GUID;
|
GUID GUID;
|
||||||
char* lpDriverDescription;
|
char* lpDriverDescription;
|
||||||
char* lpDriverName;
|
char* lpDriverName;
|
||||||
// [displaylog] Which physical monitor this device drives. Only the Ex form of
|
|
||||||
// the enumeration reports it, and it is the ONLY link between a DirectDraw
|
|
||||||
// device index and a monitor the operator can actually identify.
|
|
||||||
HMONITOR hMonitor;
|
|
||||||
|
|
||||||
} videoDevices;
|
} videoDevices;
|
||||||
|
|
||||||
@@ -50,16 +46,6 @@ videoDevices BufferedDevices[8];
|
|||||||
int g_nDualHead = -1; // jcem
|
int g_nDualHead = -1; // jcem
|
||||||
int g_nDualHead2 = -1; // jcem
|
int g_nDualHead2 = -1; // jcem
|
||||||
int g_nNonDualHead = -1; // jcem
|
int g_nNonDualHead = -1; // jcem
|
||||||
int g_nMFD1 = -1; // mode 4: left 640x480 MFD monitor
|
|
||||||
int g_nMFD2 = -1; // mode 4: right 640x480 MFD monitor
|
|
||||||
// [tmon] Operator override for display-device selection, in Main/Radar/MFD1/MFD2 order.
|
|
||||||
// -1 = leave that slot to auto-detection. Populated by the -tmon command-line switch,
|
|
||||||
// which is parsed in MW4Application's WinMain - that runs before FindVideoCards().
|
|
||||||
int g_naMonitorOverride[4] = { -1, -1, -1, -1 };
|
|
||||||
// [tident] Non-zero paints each display with its -tmon number and then exits.
|
|
||||||
// Set by the -tident command-line switch, parsed in MW4Application's WinMain.
|
|
||||||
int g_nIdentDisplays = 0;
|
|
||||||
int g_nIdentSeconds = 20;
|
|
||||||
// MSL 5.03 Mechview
|
// MSL 5.03 Mechview
|
||||||
int g_nMechViewType; // jcem : 0 - no mechview, 1 - on radar screen, 2 - on main screen
|
int g_nMechViewType; // jcem : 0 - no mechview, 1 - on radar screen, 2 - on main screen
|
||||||
|
|
||||||
@@ -279,665 +265,16 @@ BOOL CALLBACK DirectDrawEnumerateExCallback( GUID* lpGUID, LPSTR lpDriverDescrip
|
|||||||
BOOL CALLBACK DirectDrawEnumerateCallback( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID );
|
BOOL CALLBACK DirectDrawEnumerateCallback( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID );
|
||||||
HRESULT CALLBACK EnumModesCallback2( LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext );
|
HRESULT CALLBACK EnumModesCallback2( LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext );
|
||||||
|
|
||||||
//===========================================================================//
|
|
||||||
// [displaylog] Progressive display-enumeration report -> gos-displays.txt
|
|
||||||
//
|
|
||||||
// Every stage of display discovery is written out as it happens: the Windows
|
|
||||||
// desktop topology, each DirectDraw enumeration callback, the device table
|
|
||||||
// before and after the NULL-device merge, every role-selection decision, and
|
|
||||||
// the -tmon overrides. SPEW is compiled out of shipping builds, so without
|
|
||||||
// this there is no way to tell why a panel opened on the wrong monitor - or on
|
|
||||||
// the SAME monitor as another panel, which surfaces only as a DirectDraw error
|
|
||||||
// that names neither the role nor the display.
|
|
||||||
//
|
|
||||||
// Each line is opened/appended/closed so the report survives a hard crash.
|
|
||||||
//===========================================================================//
|
|
||||||
|
|
||||||
// Monitor driving each DeviceArray slot, kept in step through the NULL-device merge.
|
|
||||||
static HMONITOR g_ahDevMonitor[8] = { 0,0,0,0,0,0,0,0 };
|
|
||||||
// Index into BufferedDevices of the device DoEnum is currently checking.
|
|
||||||
static int g_nEnumBufferedIndex = -1;
|
|
||||||
|
|
||||||
// Declared here so the report does not depend on the 1998 SDK's multimon headers;
|
|
||||||
// layouts match MONITORINFOEXA and DISPLAY_DEVICEA exactly.
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DWORD cbSize;
|
|
||||||
RECT rcMonitor;
|
|
||||||
RECT rcWork;
|
|
||||||
DWORD dwFlags;
|
|
||||||
char szDevice[32];
|
|
||||||
} DispLogMonitorInfo;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DWORD cb;
|
|
||||||
char DeviceName[32];
|
|
||||||
char DeviceString[128];
|
|
||||||
DWORD StateFlags;
|
|
||||||
char DeviceID[128];
|
|
||||||
char DeviceKey[128];
|
|
||||||
} DispLogDisplayDevice;
|
|
||||||
|
|
||||||
typedef BOOL (WINAPI* PFNDISPLOGGETMONITORINFOA)( HMONITOR, DispLogMonitorInfo* );
|
|
||||||
typedef BOOL (WINAPI* PFNDISPLOGENUMDISPLAYDEVICESA)( LPCSTR, DWORD, DispLogDisplayDevice*, DWORD );
|
|
||||||
|
|
||||||
// The build toolchain predates these; define defensively rather than assume.
|
|
||||||
#ifndef ENUM_CURRENT_SETTINGS
|
|
||||||
#define ENUM_CURRENT_SETTINGS ((DWORD)-1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static PFNDISPLOGGETMONITORINFOA pfnDispLogGetMonitorInfoA = 0;
|
|
||||||
static PFNDISPLOGENUMDISPLAYDEVICESA pfnDispLogEnumDisplayDevicesA = 0;
|
|
||||||
static bool bDispLogApisResolved = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Resolved at run time: these APIs postdate the build toolchain's headers.
|
|
||||||
//
|
|
||||||
static void DispLogResolveApis()
|
|
||||||
{
|
|
||||||
if( bDispLogApisResolved )
|
|
||||||
return;
|
|
||||||
bDispLogApisResolved=true;
|
|
||||||
HMODULE hUser=GetModuleHandleA( "user32.dll" );
|
|
||||||
if( hUser )
|
|
||||||
{
|
|
||||||
pfnDispLogGetMonitorInfoA =(PFNDISPLOGGETMONITORINFOA)GetProcAddress( hUser, "GetMonitorInfoA" );
|
|
||||||
pfnDispLogEnumDisplayDevicesA=(PFNDISPLOGENUMDISPLAYDEVICESA)GetProcAddress( hUser, "EnumDisplayDevicesA" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DispLogPath( char* szPath )
|
|
||||||
{
|
|
||||||
char szDir[MAX_PATH];
|
|
||||||
szDir[0]='\0';
|
|
||||||
GetModuleFileNameA( NULL, szDir, sizeof(szDir) );
|
|
||||||
char* pSlash=strrchr( szDir, '\\' );
|
|
||||||
if( pSlash )
|
|
||||||
*(pSlash+1)='\0';
|
|
||||||
else
|
|
||||||
szDir[0]='\0';
|
|
||||||
sprintf( szPath, "%sgos-displays.txt", szDir );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Append one line. Opened and closed per call so a crash cannot lose the tail.
|
|
||||||
//
|
|
||||||
static void DispLog( const char* fmt, ... )
|
|
||||||
{
|
|
||||||
char szPath[MAX_PATH];
|
|
||||||
char szLine[1024];
|
|
||||||
DWORD dwWritten=0;
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
DispLogPath( szPath );
|
|
||||||
HANDLE hFile=CreateFileA( szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL,
|
|
||||||
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
|
||||||
if( hFile==INVALID_HANDLE_VALUE )
|
|
||||||
return;
|
|
||||||
SetFilePointer( hFile, 0, NULL, FILE_END );
|
|
||||||
|
|
||||||
va_start( ap, fmt );
|
|
||||||
vsprintf( szLine, fmt, ap );
|
|
||||||
va_end( ap );
|
|
||||||
|
|
||||||
WriteFile( hFile, szLine, (DWORD)strlen(szLine), &dwWritten, NULL );
|
|
||||||
CloseHandle( hFile );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Truncate the report at the start of a run.
|
|
||||||
//
|
|
||||||
static void DispLogReset()
|
|
||||||
{
|
|
||||||
char szPath[MAX_PATH];
|
|
||||||
DispLogPath( szPath );
|
|
||||||
HANDLE hFile=CreateFileA( szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL,
|
|
||||||
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
|
||||||
if( hFile!=INVALID_HANDLE_VALUE )
|
|
||||||
CloseHandle( hFile );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// A zeroed GUID is not "no GUID" - it is how GameOS stores the NULL device that
|
|
||||||
// DirectDraw reports first, which aliases whichever monitor Windows calls primary.
|
|
||||||
// Saying so explicitly here has settled more than one wrong-monitor report.
|
|
||||||
//
|
|
||||||
static const char* DispLogGuid( const GUID* pG, char* szBuf )
|
|
||||||
{
|
|
||||||
GUID zero;
|
|
||||||
if( !pG )
|
|
||||||
{
|
|
||||||
strcpy( szBuf, "NULL pointer = primary display driver (no dedicated GUID)" );
|
|
||||||
return szBuf;
|
|
||||||
}
|
|
||||||
memset( &zero, 0, sizeof(zero) );
|
|
||||||
if( 0==memcmp( pG, &zero, sizeof(GUID) ) )
|
|
||||||
{
|
|
||||||
strcpy( szBuf, "{00000000-0000-0000-0000-000000000000} ZERO = primary display driver alias" );
|
|
||||||
return szBuf;
|
|
||||||
}
|
|
||||||
sprintf( szBuf, "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
|
|
||||||
(unsigned long)pG->Data1, (unsigned int)pG->Data2, (unsigned int)pG->Data3,
|
|
||||||
pG->Data4[0], pG->Data4[1], pG->Data4[2], pG->Data4[3],
|
|
||||||
pG->Data4[4], pG->Data4[5], pG->Data4[6], pG->Data4[7] );
|
|
||||||
return szBuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Resolve an HMONITOR to the name Windows uses for it, plus its desktop rectangle.
|
|
||||||
// This is the bridge between a DirectDraw device index and a monitor the operator
|
|
||||||
// can point at.
|
|
||||||
//
|
|
||||||
static const char* DispLogMonitorName( HMONITOR hm, char* szBuf )
|
|
||||||
{
|
|
||||||
DispLogMonitorInfo mi;
|
|
||||||
DispLogResolveApis();
|
|
||||||
if( !hm )
|
|
||||||
{
|
|
||||||
strcpy( szBuf, "(none reported - primary display driver alias)" );
|
|
||||||
return szBuf;
|
|
||||||
}
|
|
||||||
if( !pfnDispLogGetMonitorInfoA )
|
|
||||||
{
|
|
||||||
sprintf( szBuf, "HMONITOR %p (GetMonitorInfoA unavailable)", hm );
|
|
||||||
return szBuf;
|
|
||||||
}
|
|
||||||
memset( &mi, 0, sizeof(mi) );
|
|
||||||
mi.cbSize=sizeof(mi);
|
|
||||||
if( pfnDispLogGetMonitorInfoA( hm, &mi ) )
|
|
||||||
sprintf( szBuf, "%-12s %ldx%ld at %ld,%ld%s",
|
|
||||||
mi.szDevice,
|
|
||||||
(long)(mi.rcMonitor.right-mi.rcMonitor.left),
|
|
||||||
(long)(mi.rcMonitor.bottom-mi.rcMonitor.top),
|
|
||||||
(long)mi.rcMonitor.left, (long)mi.rcMonitor.top,
|
|
||||||
(mi.dwFlags & 1) ? " [WINDOWS PRIMARY]" : "" );
|
|
||||||
else
|
|
||||||
sprintf( szBuf, "HMONITOR %p (GetMonitorInfoA failed)", hm );
|
|
||||||
return szBuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Dump what Windows itself thinks is attached. Operators read monitor numbers off
|
|
||||||
// Display Settings and assume -tmon takes them; it does not, it takes DirectDraw
|
|
||||||
// device indices, and on multi-adapter machines the two orders differ.
|
|
||||||
//
|
|
||||||
static void DispLogWindowsTopology()
|
|
||||||
{
|
|
||||||
DispLogDisplayDevice dd;
|
|
||||||
DWORD iAdapter;
|
|
||||||
|
|
||||||
DispLogResolveApis();
|
|
||||||
DispLog( "\r\n--- Windows desktop topology -------------------------------------------\r\n" );
|
|
||||||
DispLog( "Display Settings numbers monitors independently of the DirectDraw device\r\n"
|
|
||||||
"order below. -tmon takes DIRECTDRAW indices, not Windows monitor numbers.\r\n"
|
|
||||||
"Cross-reference using the \\\\.\\DISPLAYn name shown against each device.\r\n\r\n" );
|
|
||||||
|
|
||||||
if( !pfnDispLogEnumDisplayDevicesA )
|
|
||||||
{
|
|
||||||
DispLog( " EnumDisplayDevicesA unavailable - cannot report Windows topology.\r\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( iAdapter=0; iAdapter<16; iAdapter++ )
|
|
||||||
{
|
|
||||||
DEVMODEA dm;
|
|
||||||
memset( &dd, 0, sizeof(dd) );
|
|
||||||
dd.cb=sizeof(dd);
|
|
||||||
if( !pfnDispLogEnumDisplayDevicesA( NULL, iAdapter, &dd, 0 ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
DispLog( " %-14s %s\r\n", dd.DeviceName, dd.DeviceString );
|
|
||||||
DispLog( " state : %s%s\r\n",
|
|
||||||
(dd.StateFlags & 0x00000001) ? "attached-to-desktop " : "NOT attached ",
|
|
||||||
(dd.StateFlags & 0x00000004) ? "PRIMARY" : "" );
|
|
||||||
|
|
||||||
memset( &dm, 0, sizeof(dm) );
|
|
||||||
dm.dmSize=sizeof(dm);
|
|
||||||
if( EnumDisplaySettingsA( dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm ) )
|
|
||||||
DispLog( " mode : %lux%lu %lubpp @ %luHz\r\n",
|
|
||||||
(unsigned long)dm.dmPelsWidth, (unsigned long)dm.dmPelsHeight,
|
|
||||||
(unsigned long)dm.dmBitsPerPel, (unsigned long)dm.dmDisplayFrequency );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Full device table. Printed before and after the NULL-device merge so an index
|
|
||||||
// shift is visible rather than inferred.
|
|
||||||
//
|
|
||||||
static void DispLogDeviceTable( const char* szWhen )
|
|
||||||
{
|
|
||||||
char szG[192];
|
|
||||||
char szDI[192];
|
|
||||||
char szMon[192];
|
|
||||||
DWORD iDev;
|
|
||||||
|
|
||||||
DispLog( "\r\n--- DirectDraw device table: %s (NumDevices=%d) ---\r\n",
|
|
||||||
szWhen, (int)NumDevices );
|
|
||||||
|
|
||||||
for( iDev=0; iDev<NumDevices; iDev++ )
|
|
||||||
{
|
|
||||||
DispLog( " [%d] %s\r\n", (int)iDev, DeviceArray[iDev].DDid.szDescription );
|
|
||||||
DispLog( " driver : %s\r\n", DeviceArray[iDev].DDid.szDriver );
|
|
||||||
DispLog( " DeviceGUID : %s\r\n",
|
|
||||||
DispLogGuid( &DeviceArray[iDev].DeviceGUID, szG ) );
|
|
||||||
DispLog( " guidDeviceIdent : %s\r\n",
|
|
||||||
DispLogGuid( &DeviceArray[iDev].DDid.guidDeviceIdentifier, szDI ) );
|
|
||||||
DispLog( " vendor/device : %04lX / %04lX rev %lu\r\n",
|
|
||||||
(unsigned long)DeviceArray[iDev].DDid.dwVendorId,
|
|
||||||
(unsigned long)DeviceArray[iDev].DDid.dwDeviceId,
|
|
||||||
(unsigned long)DeviceArray[iDev].DDid.dwRevision );
|
|
||||||
DispLog( " hw_rasterizer : %s\r\n",
|
|
||||||
(DeviceArray[iDev].D3DCaps.dwDevCaps & D3DDEVCAPS_HWRASTERIZATION) ? "yes" : "NO - cannot host a panel" );
|
|
||||||
DispLog( " monitor : %s\r\n",
|
|
||||||
DispLogMonitorName( g_ahDevMonitor[iDev], szMon ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// guidDeviceIdentifier identifies the ADAPTER, not the output. Devices sharing
|
|
||||||
// it are outputs of one card - which is exactly what the NULL-device merge keys
|
|
||||||
// on, and why a mixed iGPU + USB adapter setup behaves differently to one card.
|
|
||||||
DispLog( "\r\n Adapter grouping (devices sharing guidDeviceIdentifier are one card):\r\n" );
|
|
||||||
{
|
|
||||||
DWORD iOuter;
|
|
||||||
for( iOuter=0; iOuter<NumDevices; iOuter++ )
|
|
||||||
{
|
|
||||||
DWORD iInner;
|
|
||||||
bool bFirst=true;
|
|
||||||
bool bAlreadyListed=false;
|
|
||||||
for( iInner=0; iInner<iOuter; iInner++ )
|
|
||||||
{
|
|
||||||
if( DeviceArray[iInner].DDid.guidDeviceIdentifier==DeviceArray[iOuter].DDid.guidDeviceIdentifier )
|
|
||||||
bAlreadyListed=true;
|
|
||||||
}
|
|
||||||
if( bAlreadyListed )
|
|
||||||
continue;
|
|
||||||
DispLog( " %-40s : devices", DeviceArray[iOuter].DDid.szDescription );
|
|
||||||
for( iInner=0; iInner<NumDevices; iInner++ )
|
|
||||||
{
|
|
||||||
if( DeviceArray[iInner].DDid.guidDeviceIdentifier==DeviceArray[iOuter].DDid.guidDeviceIdentifier )
|
|
||||||
{
|
|
||||||
DispLog( "%s %d", bFirst ? "" : ",", (int)iInner );
|
|
||||||
bFirst=false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DispLog( "\r\n" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Called once at startup, enumerate and get caps of all 3D video cards
|
// Called once at startup, enumerate and get caps of all 3D video cards
|
||||||
//
|
|
||||||
// [tmon] Apply a hard-assigned display device, but only if the operator supplied one
|
|
||||||
// and it names a device that actually exists. Anything else is ignored, so a stale
|
|
||||||
// -tmon left on the command line of a machine with fewer monitors simply falls back
|
|
||||||
// to auto-detection instead of breaking startup. Rejections are reported in
|
|
||||||
// gos-displays.txt - silently doing nothing is worse than useless when the operator
|
|
||||||
// is trying to work out why a monitor did not light up.
|
|
||||||
//
|
|
||||||
static void ApplyMonitorOverride(int slot, int* pTarget)
|
|
||||||
{
|
|
||||||
static const char* apszOverrideRole[4] = { "main", "radar", "mfd1", "mfd2" };
|
|
||||||
int dev = g_naMonitorOverride[slot];
|
|
||||||
if( dev < 0 )
|
|
||||||
{
|
|
||||||
DispLog( " %-5s : auto (kept device %d)\r\n", apszOverrideRole[slot], *pTarget );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( dev < (int)NumDevices )
|
|
||||||
{
|
|
||||||
DispLog( " %-5s : device %d APPLIED (auto-detect had chosen %d)\r\n",
|
|
||||||
apszOverrideRole[slot], dev, *pTarget );
|
|
||||||
*pTarget = dev;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DispLog( " %-5s : device %d *** REJECTED - only %d device(s) exist, keeping %d ***\r\n",
|
|
||||||
apszOverrideRole[slot], dev, (int)NumDevices, *pTarget );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Desktop arrangement, left to right, annotated with the DirectDraw device index.
|
|
||||||
//
|
|
||||||
// Display Settings draws the monitors in this order and labels them with its own
|
|
||||||
// ordinals, which are NOT the \\.\DISPLAYn numbers and NOT the DirectDraw indices.
|
|
||||||
// All three can disagree, and on mixed-adapter machines they usually do. Printing
|
|
||||||
// the physical order lets an operator match the picture on screen to a device index
|
|
||||||
// without guessing.
|
|
||||||
//
|
|
||||||
static void DispLogDesktopOrder()
|
|
||||||
{
|
|
||||||
int anOrder[8];
|
|
||||||
long alLeft[8];
|
|
||||||
int nCount=0;
|
|
||||||
int i;
|
|
||||||
char szMon[192];
|
|
||||||
|
|
||||||
DispLogResolveApis();
|
|
||||||
if( !pfnDispLogGetMonitorInfoA )
|
|
||||||
return;
|
|
||||||
|
|
||||||
for( i=0; i<(int)NumDevices && i<8; i++ )
|
|
||||||
{
|
|
||||||
DispLogMonitorInfo mi;
|
|
||||||
if( !g_ahDevMonitor[i] )
|
|
||||||
continue;
|
|
||||||
memset( &mi, 0, sizeof(mi) );
|
|
||||||
mi.cbSize=sizeof(mi);
|
|
||||||
if( !pfnDispLogGetMonitorInfoA( g_ahDevMonitor[i], &mi ) )
|
|
||||||
continue;
|
|
||||||
anOrder[nCount]=i;
|
|
||||||
alLeft[nCount]=mi.rcMonitor.left;
|
|
||||||
nCount++;
|
|
||||||
}
|
|
||||||
if( nCount<2 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Small n; a plain insertion sort keeps this readable.
|
|
||||||
for( i=1; i<nCount; i++ )
|
|
||||||
{
|
|
||||||
int nDev=anOrder[i];
|
|
||||||
long lPos=alLeft[i];
|
|
||||||
int j=i-1;
|
|
||||||
while( j>=0 && alLeft[j]>lPos )
|
|
||||||
{
|
|
||||||
anOrder[j+1]=anOrder[j];
|
|
||||||
alLeft[j+1]=alLeft[j];
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
anOrder[j+1]=nDev;
|
|
||||||
alLeft[j+1]=lPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
DispLog( "\r\n Desktop arrangement, left to right (compare with Display Settings):\r\n" );
|
|
||||||
for( i=0; i<nCount; i++ )
|
|
||||||
DispLog( " position %d : device %d -> %s\r\n",
|
|
||||||
i+1, anOrder[i], DispLogMonitorName( g_ahDevMonitor[anOrder[i]], szMon ) );
|
|
||||||
DispLog( " Display Settings labels these with its OWN numbers, which need not match\r\n"
|
|
||||||
" either the \\\\.\\DISPLAYn names or the device indices. Identify the monitor\r\n"
|
|
||||||
" by its position and size above, then use its device index + 1 in -tmon.\r\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// [tident] Paint each display with the number the operator must type into -tmon.
|
|
||||||
//
|
|
||||||
// Windows Display Settings numbers its monitors with an ordinal that no API
|
|
||||||
// exposes, so it cannot be translated to a DirectDraw device index - see the
|
|
||||||
// desktop-order block above. Windows itself solves this with an Identify button.
|
|
||||||
// This is the same answer: open every device, put its number on the glass, and let
|
|
||||||
// the operator read the mapping off the pod instead of deducing it.
|
|
||||||
//
|
|
||||||
// Deliberately uses DDSCL_NORMAL and paints the desktop through GDI. Taking
|
|
||||||
// exclusive fullscreen on several devices at once is the very thing that fails on
|
|
||||||
// modern Windows, and a diagnostic that trips over the fault it is diagnosing is
|
|
||||||
// worthless. Nothing here changes a display mode.
|
|
||||||
//
|
|
||||||
static void IdentifyDisplays()
|
|
||||||
{
|
|
||||||
IDirectDraw7* apDD[8];
|
|
||||||
IDirectDrawSurface7* apSurf[8];
|
|
||||||
DWORD iDev;
|
|
||||||
// Distinct fill per device so the panels remain tellable apart from across the
|
|
||||||
// room, and readable if the font fails to create for any reason.
|
|
||||||
static const COLORREF acrFill[8] =
|
|
||||||
{
|
|
||||||
RGB(160,0,0), RGB(0,120,0), RGB(0,0,170), RGB(150,110,0),
|
|
||||||
RGB(120,0,140), RGB(0,120,140), RGB(90,90,90), RGB(180,60,0)
|
|
||||||
};
|
|
||||||
static const char* apszRole[6] = { "main", "radar", "span", "span2", "mfd1", "mfd2" };
|
|
||||||
int anRoleDev[6];
|
|
||||||
|
|
||||||
anRoleDev[0]=Environment.FullScreenDevice;
|
|
||||||
anRoleDev[1]=g_nNonDualHead;
|
|
||||||
anRoleDev[2]=g_nDualHead;
|
|
||||||
anRoleDev[3]=g_nDualHead2;
|
|
||||||
anRoleDev[4]=g_nMFD1;
|
|
||||||
anRoleDev[5]=g_nMFD2;
|
|
||||||
|
|
||||||
DispLog( "\r\n--- -tident: display identification ------------------------------------\r\n" );
|
|
||||||
DispLog( "Painting each display with its -tmon number. No display mode is changed and\r\n"
|
|
||||||
"no device takes exclusive mode. The game exits when the display period ends.\r\n\r\n" );
|
|
||||||
|
|
||||||
for( iDev=0; iDev<NumDevices && iDev<8; iDev++ )
|
|
||||||
{
|
|
||||||
apDD[iDev]=0;
|
|
||||||
apSurf[iDev]=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( iDev=0; iDev<NumDevices && iDev<8; iDev++ )
|
|
||||||
{
|
|
||||||
DDSURFACEDESC2 ddsd;
|
|
||||||
HRESULT hr;
|
|
||||||
HWND hCoop = hWindow ? hWindow : GetDesktopWindow();
|
|
||||||
char szMon[192];
|
|
||||||
|
|
||||||
DispLog( " device %d -> %s\r\n", (int)iDev,
|
|
||||||
DispLogMonitorName( g_ahDevMonitor[iDev], szMon ) );
|
|
||||||
|
|
||||||
hr=wDirectDrawCreateEx( &DeviceArray[iDev].DeviceGUID, (VOID**)&apDD[iDev], IID_IDirectDraw7, NULL );
|
|
||||||
if( FAILED(hr) || !apDD[iDev] )
|
|
||||||
{
|
|
||||||
DispLog( " *** DirectDrawCreateEx failed (0x%08lX) - cannot identify this one ***\r\n",
|
|
||||||
(unsigned long)hr );
|
|
||||||
apDD[iDev]=0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr=apDD[iDev]->SetCooperativeLevel( hCoop, DDSCL_NORMAL );
|
|
||||||
if( FAILED(hr) )
|
|
||||||
{
|
|
||||||
DispLog( " *** SetCooperativeLevel(NORMAL) failed (0x%08lX) ***\r\n", (unsigned long)hr );
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset( &ddsd, 0, sizeof(ddsd) );
|
|
||||||
ddsd.dwSize=sizeof(ddsd);
|
|
||||||
ddsd.dwFlags=DDSD_CAPS;
|
|
||||||
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
|
|
||||||
hr=apDD[iDev]->CreateSurface( &ddsd, &apSurf[iDev], NULL );
|
|
||||||
if( FAILED(hr) || !apSurf[iDev] )
|
|
||||||
{
|
|
||||||
DispLog( " *** CreateSurface(primary) failed (0x%08lX) ***\r\n", (unsigned long)hr );
|
|
||||||
apSurf[iDev]=0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
HDC hdc=NULL;
|
|
||||||
const char* pszRole="unused";
|
|
||||||
int iRole;
|
|
||||||
|
|
||||||
for( iRole=0; iRole<6; iRole++ )
|
|
||||||
if( anRoleDev[iRole]==(int)iDev )
|
|
||||||
{
|
|
||||||
pszRole=apszRole[iRole];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr=apSurf[iDev]->GetDC( &hdc );
|
|
||||||
if( FAILED(hr) || !hdc )
|
|
||||||
{
|
|
||||||
DispLog( " *** GetDC failed (0x%08lX) ***\r\n", (unsigned long)hr );
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
RECT rc;
|
|
||||||
HBRUSH hBrush;
|
|
||||||
HFONT hFontBig;
|
|
||||||
HFONT hFontSmall;
|
|
||||||
HFONT hOld;
|
|
||||||
char szBig[16];
|
|
||||||
char szLine[256];
|
|
||||||
int nWidth;
|
|
||||||
int nHeight;
|
|
||||||
|
|
||||||
nWidth =GetDeviceCaps( hdc, HORZRES );
|
|
||||||
nHeight=GetDeviceCaps( hdc, VERTRES );
|
|
||||||
|
|
||||||
rc.left=0; rc.top=0; rc.right=nWidth; rc.bottom=nHeight;
|
|
||||||
hBrush=CreateSolidBrush( acrFill[iDev] );
|
|
||||||
FillRect( hdc, &rc, hBrush );
|
|
||||||
DeleteObject( hBrush );
|
|
||||||
|
|
||||||
SetBkMode( hdc, TRANSPARENT );
|
|
||||||
SetTextColor( hdc, RGB(255,255,255) );
|
|
||||||
|
|
||||||
// The number the operator types; everything else is confirmation.
|
|
||||||
sprintf( szBig, "%d", (int)iDev+1 );
|
|
||||||
hFontBig=CreateFontA( nHeight/2, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
|
|
||||||
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
|
||||||
ANTIALIASED_QUALITY, FF_DONTCARE, "Arial" );
|
|
||||||
hOld=(HFONT)SelectObject( hdc, hFontBig );
|
|
||||||
rc.top=nHeight/8;
|
|
||||||
DrawTextA( hdc, szBig, -1, &rc, DT_CENTER|DT_TOP|DT_SINGLELINE );
|
|
||||||
SelectObject( hdc, hOld );
|
|
||||||
DeleteObject( hFontBig );
|
|
||||||
|
|
||||||
hFontSmall=CreateFontA( nHeight/16, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
|
|
||||||
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
|
||||||
ANTIALIASED_QUALITY, FF_DONTCARE, "Arial" );
|
|
||||||
hOld=(HFONT)SelectObject( hdc, hFontSmall );
|
|
||||||
|
|
||||||
rc.top=nHeight*3/4;
|
|
||||||
sprintf( szLine, "use %d in -tmon", (int)iDev+1 );
|
|
||||||
DrawTextA( hdc, szLine, -1, &rc, DT_CENTER|DT_TOP|DT_SINGLELINE );
|
|
||||||
|
|
||||||
rc.top=nHeight*3/4 + nHeight/14;
|
|
||||||
sprintf( szLine, "device %d currently: %s", (int)iDev, pszRole );
|
|
||||||
DrawTextA( hdc, szLine, -1, &rc, DT_CENTER|DT_TOP|DT_SINGLELINE );
|
|
||||||
|
|
||||||
SelectObject( hdc, hOld );
|
|
||||||
DeleteObject( hFontSmall );
|
|
||||||
}
|
|
||||||
|
|
||||||
apSurf[iDev]->ReleaseDC( hdc );
|
|
||||||
DispLog( " painted: -tmon value %d, currently assigned to %s\r\n",
|
|
||||||
(int)iDev+1, pszRole );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DispLog( "\r\n Write down the number on each monitor, then set -tmon in the order\r\n"
|
|
||||||
" main,radar,mfd1,mfd2 using those numbers.\r\n" );
|
|
||||||
DispLog( " Holding the display for %d seconds...\r\n", g_nIdentSeconds );
|
|
||||||
|
|
||||||
Sleep( (DWORD)g_nIdentSeconds * 1000 );
|
|
||||||
|
|
||||||
for( iDev=0; iDev<NumDevices && iDev<8; iDev++ )
|
|
||||||
{
|
|
||||||
if( apSurf[iDev] )
|
|
||||||
apSurf[iDev]->Release();
|
|
||||||
if( apDD[iDev] )
|
|
||||||
apDD[iDev]->Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
DispLog( " -tident finished; exiting.\r\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// [displaylog] Final summary: the role assignment, how each role maps back to a
|
|
||||||
// physical monitor, and whether the assignment is self-consistent.
|
|
||||||
//
|
|
||||||
static void LogDisplayDevices()
|
|
||||||
{
|
|
||||||
static const char* apszRoleName[6] =
|
|
||||||
{ "main ", "radar", "span ", "span2", "mfd1 ", "mfd2 " };
|
|
||||||
int anRoleDev[6];
|
|
||||||
char szMon[192];
|
|
||||||
int iRole;
|
|
||||||
|
|
||||||
DispLogDeviceTable( "FINAL" );
|
|
||||||
DispLogDesktopOrder();
|
|
||||||
|
|
||||||
anRoleDev[0]=Environment.FullScreenDevice;
|
|
||||||
anRoleDev[1]=g_nNonDualHead;
|
|
||||||
anRoleDev[2]=g_nDualHead;
|
|
||||||
anRoleDev[3]=g_nDualHead2;
|
|
||||||
anRoleDev[4]=g_nMFD1;
|
|
||||||
anRoleDev[5]=g_nMFD2;
|
|
||||||
|
|
||||||
DispLog( "\r\n--- Final role assignment ----------------------------------------------\r\n" );
|
|
||||||
DispLog( " main (FullScreenDevice) = %d\r\n", Environment.FullScreenDevice );
|
|
||||||
DispLog( " radar (g_nNonDualHead) = %d\r\n", g_nNonDualHead );
|
|
||||||
DispLog( " span (g_nDualHead) = %d\r\n", g_nDualHead );
|
|
||||||
DispLog( " span2 (g_nDualHead2) = %d\r\n", g_nDualHead2 );
|
|
||||||
DispLog( " mfd1 (g_nMFD1) = %d\r\n", g_nMFD1 );
|
|
||||||
DispLog( " mfd2 (g_nMFD2) = %d\r\n", g_nMFD2 );
|
|
||||||
DispLog( " (-1 means the role was never assigned a device)\r\n" );
|
|
||||||
|
|
||||||
DispLog( "\r\n Role -> device -> physical monitor:\r\n" );
|
|
||||||
for( iRole=0; iRole<6; iRole++ )
|
|
||||||
{
|
|
||||||
if( anRoleDev[iRole] < 0 || anRoleDev[iRole] >= (int)NumDevices )
|
|
||||||
continue;
|
|
||||||
DispLog( " %s -> device %d -> %s\r\n",
|
|
||||||
apszRoleName[iRole], anRoleDev[iRole],
|
|
||||||
DispLogMonitorName( g_ahDevMonitor[anRoleDev[iRole]], szMon ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Two roles on one device cannot work: the first takes exclusive fullscreen and
|
|
||||||
// the second fails with DDERR_EXCLUSIVEMODEALREADYSET, an error that names
|
|
||||||
// neither role. -tmon applies each slot independently and has no cross-check,
|
|
||||||
// so a hand-written override is the usual way to get here.
|
|
||||||
//
|
|
||||||
DispLog( "\r\n--- Consistency check --------------------------------------------------\r\n" );
|
|
||||||
{
|
|
||||||
bool bClash=false;
|
|
||||||
int iA;
|
|
||||||
for( iA=0; iA<6; iA++ )
|
|
||||||
{
|
|
||||||
int iB;
|
|
||||||
if( anRoleDev[iA] < 0 )
|
|
||||||
continue;
|
|
||||||
for( iB=iA+1; iB<6; iB++ )
|
|
||||||
{
|
|
||||||
if( anRoleDev[iB] < 0 )
|
|
||||||
continue;
|
|
||||||
if( anRoleDev[iA]==anRoleDev[iB] )
|
|
||||||
{
|
|
||||||
DispLog( " *** CLASH: %s and %s are BOTH on device %d ***\r\n",
|
|
||||||
apszRoleName[iA], apszRoleName[iB], anRoleDev[iA] );
|
|
||||||
bClash=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( bClash )
|
|
||||||
DispLog( " Two roles cannot share one display. Whichever initialises second will\r\n"
|
|
||||||
" fail with DDERR_EXCLUSIVEMODEALREADYSET because the first already holds\r\n"
|
|
||||||
" exclusive fullscreen on that monitor. Fix the -tmon assignment, or drop\r\n"
|
|
||||||
" -tmon entirely - auto-detection cannot produce a duplicate.\r\n" );
|
|
||||||
else
|
|
||||||
DispLog( " No duplicate device assignments.\r\n" );
|
|
||||||
|
|
||||||
// Device 0 is the primary-display-driver slot. If the merge below did not
|
|
||||||
// collapse it onto a real device it still aliases the Windows primary, so any
|
|
||||||
// panel pointed at it lands on the main display's monitor.
|
|
||||||
if( !g_ahDevMonitor[0] && NumDevices )
|
|
||||||
DispLog( " *** WARNING: device 0 has no monitor of its own - it is still the primary\r\n"
|
|
||||||
" display driver alias. Any role assigned to device 0 will open on the\r\n"
|
|
||||||
" Windows primary monitor, whichever device that really is. ***\r\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
// The decisive line: whether the MFD subsystem will initialise at all.
|
|
||||||
DispLog( "\r\nMFD mode (-tmfds) = %d\r\n", g_nTypeOfMFDs );
|
|
||||||
if( g_nTypeOfMFDs == 4 )
|
|
||||||
{
|
|
||||||
bool bOK = (g_nMFD1 != -1) && (g_nMFD2 != -1);
|
|
||||||
DispLog( "mode 4 requires BOTH mfd1 and mfd2: %s\r\n", bOK ? "OK" : "*** FAILED ***" );
|
|
||||||
if( !bOK )
|
|
||||||
DispLog(
|
|
||||||
" -> IsMultimonitorAvaliable() returns false, so HSH_EnterFullScreen2()\r\n"
|
|
||||||
" falls back to the single-secondary-monitor path and the two MFD\r\n"
|
|
||||||
" displays are never opened. Four hardware-rasterizing DirectDraw\r\n"
|
|
||||||
" devices are needed: main, radar, mfd1, mfd2.\r\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
DispLog( "\r\n--- Panel initialisation (DirectDraw results per display) --------------\r\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
void FindVideoCards()
|
void FindVideoCards()
|
||||||
@@ -951,112 +288,49 @@ void FindVideoCards()
|
|||||||
NumHWDevices=0;
|
NumHWDevices=0;
|
||||||
NumBuffered=0;
|
NumBuffered=0;
|
||||||
pDeviceArray=DeviceArray;
|
pDeviceArray=DeviceArray;
|
||||||
|
|
||||||
// [displaylog] Start a fresh report for this run.
|
|
||||||
memset( g_ahDevMonitor, 0, sizeof(g_ahDevMonitor) );
|
|
||||||
DispLogReset();
|
|
||||||
DispLog( "GameOS display enumeration report\r\n" );
|
|
||||||
DispLog( "=================================\r\n" );
|
|
||||||
DispLog( "Written by FindVideoCards() at startup, then appended to by each panel as\r\n" );
|
|
||||||
DispLog( "it initialises. Read top to bottom: it follows the order the game does.\r\n" );
|
|
||||||
{
|
|
||||||
char szExe[MAX_PATH];
|
|
||||||
szExe[0]='\0';
|
|
||||||
GetModuleFileNameA( NULL, szExe, sizeof(szExe) );
|
|
||||||
DispLog( "\r\nexecutable : %s\r\n", szExe );
|
|
||||||
DispLog( "command line : %s\r\n", GetCommandLineA() );
|
|
||||||
}
|
|
||||||
DispLog( "requested : -tmfds %d -tmon %d,%d,%d,%d (0 = auto; values are 1-based\r\n"
|
|
||||||
" on the command line and appear here already converted to\r\n"
|
|
||||||
" 0-based DirectDraw device indices, -1 meaning auto)\r\n",
|
|
||||||
g_nTypeOfMFDs,
|
|
||||||
g_naMonitorOverride[0], g_naMonitorOverride[1],
|
|
||||||
g_naMonitorOverride[2], g_naMonitorOverride[3] );
|
|
||||||
|
|
||||||
DispLogWindowsTopology();
|
|
||||||
//
|
//
|
||||||
// Disable all hardware devices?
|
// Disable all hardware devices?
|
||||||
//
|
//
|
||||||
if( gUseBlade )
|
if( gUseBlade )
|
||||||
{
|
|
||||||
DispLog( "\r\n*** gUseBlade set - hardware device enumeration skipped entirely. ***\r\n" );
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// Enumerate all D3D cards
|
// Enumerate all D3D cards
|
||||||
//
|
//
|
||||||
DispLog( "\r\n--- Stage 1: DirectDraw enumeration callbacks ---------------------------\r\n" );
|
|
||||||
gos_MathExceptions( 0,0 );
|
gos_MathExceptions( 0,0 );
|
||||||
wDirectDrawEnumerate(DirectDrawEnumerateCallback,DirectDrawEnumerateExCallback,0);
|
wDirectDrawEnumerate(DirectDrawEnumerateCallback,DirectDrawEnumerateExCallback,0);
|
||||||
gos_MathExceptions(1,0);
|
gos_MathExceptions(1,0);
|
||||||
DispLog( "\r\n %d device(s) buffered, NumMonitors=%d\r\n", (int)NumBuffered, (int)NumMonitors );
|
|
||||||
//
|
//
|
||||||
// Now test them all
|
// Now test them all
|
||||||
//
|
//
|
||||||
DispLog( "\r\n--- Stage 2: capability check of each enumerated device ----------------\r\n" );
|
|
||||||
CheckDevices();
|
CheckDevices();
|
||||||
DispLog( "\r\n NumDevices=%d NumHWDevices=%d (DeviceArray holds at most 8)\r\n",
|
|
||||||
(int)NumDevices, (int)NumHWDevices );
|
|
||||||
|
|
||||||
DispLogDeviceTable( "after enumeration, BEFORE the NULL-device merge" );
|
|
||||||
//
|
//
|
||||||
// On a multimonitor system remove the NULL device
|
// On a multimonitor system remove the NULL device
|
||||||
//
|
//
|
||||||
DispLog( "\r\n--- Stage 3: NULL-device merge -----------------------------------------\r\n" );
|
|
||||||
DispLog( "DirectDraw reports the primary display driver first, with no GUID. It is an\r\n"
|
|
||||||
"ALIAS of whichever monitor Windows calls primary, not an extra output. It is\r\n"
|
|
||||||
"collapsed onto the real device sharing its guidDeviceIdentifier (= same card),\r\n"
|
|
||||||
"which shifts every later device index down by one.\r\n" );
|
|
||||||
if( NumMonitors>=2 && NumDevices )
|
if( NumMonitors>=2 && NumDevices )
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Find the real device GUID that matches the primary
|
// Find the real device GUID that matches the primary
|
||||||
//
|
//
|
||||||
DispLog( " guard NumMonitors(%d)>=2 && NumDevices(%d) : PASSED - merge will run\r\n",
|
|
||||||
(int)NumMonitors, (int)NumDevices );
|
|
||||||
bool bMerged=false;
|
|
||||||
for( int t0=1; t0<NumDevices; t0++ )
|
for( int t0=1; t0<NumDevices; t0++ )
|
||||||
{
|
{
|
||||||
if( DeviceArray[t0].DDid.guidDeviceIdentifier==DeviceArray[0].DDid.guidDeviceIdentifier )
|
if( DeviceArray[t0].DDid.guidDeviceIdentifier==DeviceArray[0].DDid.guidDeviceIdentifier )
|
||||||
{
|
{
|
||||||
DispLog( " device [%d] '%s' shares the primary's adapter GUID\r\n",
|
|
||||||
t0, DeviceArray[t0].DDid.szDescription );
|
|
||||||
DispLog( " -> copying it into slot 0 and shifting devices %d..%d down one\r\n",
|
|
||||||
t0+1, (int)NumDevices-1 );
|
|
||||||
DeviceArray[0]=DeviceArray[t0];
|
DeviceArray[0]=DeviceArray[t0];
|
||||||
g_ahDevMonitor[0]=g_ahDevMonitor[t0];
|
|
||||||
while( t0+1<NumDevices )
|
while( t0+1<NumDevices )
|
||||||
{
|
{
|
||||||
DeviceArray[t0]=DeviceArray[t0+1];
|
DeviceArray[t0]=DeviceArray[t0+1];
|
||||||
g_ahDevMonitor[t0]=g_ahDevMonitor[t0+1];
|
|
||||||
DispLog( " device index %d is now what was index %d\r\n", t0, t0+1 );
|
|
||||||
t0++;
|
t0++;
|
||||||
}
|
}
|
||||||
NumDevices-=1;
|
NumDevices-=1;
|
||||||
bMerged=true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( !bMerged )
|
|
||||||
DispLog( " *** no device shares the primary's adapter GUID - slot 0 REMAINS the\r\n"
|
|
||||||
" NULL alias. Any role assigned to device 0 will open on the Windows\r\n"
|
|
||||||
" primary monitor, which is probably also the main display. ***\r\n" );
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
DispLog( " guard NumMonitors(%d)>=2 && NumDevices(%d) : NOT met - merge SKIPPED.\r\n",
|
|
||||||
(int)NumMonitors, (int)NumDevices );
|
|
||||||
DispLog( " *** Device 0 is still the primary display driver alias. ***\r\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
DispLogDeviceTable( "AFTER the NULL-device merge - these are the indices -tmon uses" );
|
|
||||||
//
|
//
|
||||||
// Make sure initial full screen device is valid. -1 means select 1st
|
// Make sure initial full screen device is valid. -1 means select 1st
|
||||||
//
|
//
|
||||||
DispLog( "\r\n--- Stage 4: automatic role selection ----------------------------------\r\n" );
|
|
||||||
|
|
||||||
// jcem - dual heads...
|
// jcem - dual heads...
|
||||||
{
|
{
|
||||||
DispLog( " span search (a device offering a 1280x480 mode):\r\n" );
|
|
||||||
for(int t0 = 0; t0 < NumDevices; t0++)
|
for(int t0 = 0; t0 < NumDevices; t0++)
|
||||||
{
|
{
|
||||||
for( int t1=0; t1<sizeof(DeviceArray[0].Modes16) / sizeof(WORD); t1+=2 )
|
for( int t1=0; t1<sizeof(DeviceArray[0].Modes16) / sizeof(WORD); t1+=2 )
|
||||||
@@ -1066,105 +340,45 @@ void FindVideoCards()
|
|||||||
if (g_nDualHead == -1)
|
if (g_nDualHead == -1)
|
||||||
{
|
{
|
||||||
g_nDualHead = t0;
|
g_nDualHead = t0;
|
||||||
DispLog( " device %d has 1280x480 -> g_nDualHead\r\n", t0 );
|
|
||||||
}
|
}
|
||||||
else if (g_nDualHead2 == -1)
|
else if (g_nDualHead2 == -1)
|
||||||
{
|
{
|
||||||
g_nDualHead2 = t0;
|
g_nDualHead2 = t0;
|
||||||
DispLog( " device %d has 1280x480 -> g_nDualHead2\r\n", t0 );
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( g_nDualHead==-1 )
|
|
||||||
DispLog( " no device offers 1280x480 (normal unless using spanned MFD mode 1/3)\r\n" );
|
|
||||||
}
|
}
|
||||||
// jcem
|
// jcem
|
||||||
//if( Environment.FullScreenDevice==-1 )
|
//if( Environment.FullScreenDevice==-1 )
|
||||||
{
|
{
|
||||||
DispLog( " main search (first hardware rasterizer that is not a span device):\r\n" );
|
|
||||||
for( int t0=0; t0<NumDevices; t0++ )
|
for( int t0=0; t0<NumDevices; t0++ )
|
||||||
{
|
{
|
||||||
if( DeviceArray[t0].D3DCaps.dwDevCaps&D3DDEVCAPS_HWRASTERIZATION && (t0 != g_nDualHead) && (t0 != g_nDualHead2))
|
if( DeviceArray[t0].D3DCaps.dwDevCaps&D3DDEVCAPS_HWRASTERIZATION && (t0 != g_nDualHead) && (t0 != g_nDualHead2))
|
||||||
{
|
{
|
||||||
Environment.FullScreenDevice=t0;
|
Environment.FullScreenDevice=t0;
|
||||||
DispLog( " device %d selected as main\r\n", t0 );
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DispLog( " device %d skipped (%s)\r\n", t0,
|
|
||||||
(t0==g_nDualHead || t0==g_nDualHead2) ? "reserved as a span device" : "no hardware rasterizer" );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( Environment.FullScreenDevice>=NumDevices || Environment.FullScreenDevice<0 )
|
if( Environment.FullScreenDevice>=NumDevices || Environment.FullScreenDevice<0 )
|
||||||
{
|
|
||||||
DispLog( " main device %d is out of range - forced to 0\r\n", Environment.FullScreenDevice );
|
|
||||||
Environment.FullScreenDevice=0;
|
Environment.FullScreenDevice=0;
|
||||||
}
|
|
||||||
// jcem
|
// jcem
|
||||||
if (g_nDualHead != -1) {
|
if (g_nDualHead != -1) {
|
||||||
if (g_nDualHead2 != -1) {
|
if (g_nDualHead2 != -1) {
|
||||||
g_nNonDualHead = g_nDualHead2;
|
g_nNonDualHead = g_nDualHead2;
|
||||||
DispLog( " radar : taken from g_nDualHead2 -> device %d\r\n", g_nNonDualHead );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (g_nNonDualHead == -1) {
|
if (g_nNonDualHead == -1) {
|
||||||
DispLog( " radar search (first hardware rasterizer that is not main or span):\r\n" );
|
|
||||||
for( int t0=0; t0<NumDevices; t0++ )
|
for( int t0=0; t0<NumDevices; t0++ )
|
||||||
{
|
{
|
||||||
if( (t0 != Environment.FullScreenDevice) && (t0 != g_nDualHead) && DeviceArray[t0].D3DCaps.dwDevCaps&D3DDEVCAPS_HWRASTERIZATION )
|
if( (t0 != Environment.FullScreenDevice) && (t0 != g_nDualHead) && DeviceArray[t0].D3DCaps.dwDevCaps&D3DDEVCAPS_HWRASTERIZATION )
|
||||||
{
|
{
|
||||||
g_nNonDualHead = t0;
|
g_nNonDualHead = t0;
|
||||||
DispLog( " device %d selected as radar\r\n", t0 );
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DispLog( " device %d skipped (%s)\r\n", t0,
|
|
||||||
(t0==Environment.FullScreenDevice) ? "already the main display" :
|
|
||||||
(t0==g_nDualHead) ? "reserved as a span device" :
|
|
||||||
"no hardware rasterizer" );
|
|
||||||
}
|
}
|
||||||
if( g_nNonDualHead==-1 )
|
|
||||||
DispLog( " *** no device available for radar ***\r\n" );
|
|
||||||
}
|
|
||||||
// [tmon] Hard-assigned Main/Radar overrides. Applied BEFORE the mode 4 MFD search
|
|
||||||
// below so that search still skips whichever devices the operator picked.
|
|
||||||
DispLog( "\r\n--- Stage 5: -tmon overrides for main/radar ----------------------------\r\n" );
|
|
||||||
ApplyMonitorOverride(0, &Environment.FullScreenDevice);
|
|
||||||
ApplyMonitorOverride(1, &g_nNonDualHead);
|
|
||||||
// Mode 4 (split dual 640x480): find two extra D3D devices beyond
|
|
||||||
// FullScreenDevice and g_nNonDualHead. These need no special resolution.
|
|
||||||
{
|
|
||||||
int found = 0;
|
|
||||||
DispLog( "\r\n--- Stage 6: mode 4 MFD search (two devices beyond main and radar) -----\r\n" );
|
|
||||||
for (int t0 = 0; t0 < NumDevices && found < 2; t0++) {
|
|
||||||
if (t0 == Environment.FullScreenDevice) { DispLog( " device %d skipped (already the main display)\r\n", t0 ); continue; }
|
|
||||||
if (t0 == g_nNonDualHead) { DispLog( " device %d skipped (already the radar)\r\n", t0 ); continue; }
|
|
||||||
if (DeviceArray[t0].D3DCaps.dwDevCaps & D3DDEVCAPS_HWRASTERIZATION) {
|
|
||||||
if (found == 0) { g_nMFD1 = t0; DispLog( " device %d selected as mfd1\r\n", t0 ); }
|
|
||||||
else { g_nMFD2 = t0; DispLog( " device %d selected as mfd2\r\n", t0 ); }
|
|
||||||
found++;
|
|
||||||
} else {
|
|
||||||
DispLog( " device %d skipped (no hardware rasterizer)\r\n", t0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( found<2 )
|
|
||||||
DispLog( " only %d of the 2 required MFD devices were found\r\n", found );
|
|
||||||
}
|
|
||||||
// [tmon] Hard-assigned MFD overrides (only meaningful with -tmfds 4).
|
|
||||||
DispLog( "\r\n--- Stage 7: -tmon overrides for mfd1/mfd2 -----------------------------\r\n" );
|
|
||||||
ApplyMonitorOverride(2, &g_nMFD1);
|
|
||||||
ApplyMonitorOverride(3, &g_nMFD2);
|
|
||||||
// [displaylog] Write gos-displays.txt with the full enumeration and the role
|
|
||||||
// assignment. SPEW is compiled out of shipping builds, so a file is the only way
|
|
||||||
// the operator can see why a display did or did not get picked up.
|
|
||||||
LogDisplayDevices();
|
|
||||||
|
|
||||||
// [tident] Identification is a diagnostic mode, not a play mode: show the numbers
|
|
||||||
// and quit rather than carrying on with surfaces the operator has just been shown.
|
|
||||||
if( g_nIdentDisplays )
|
|
||||||
{
|
|
||||||
IdentifyDisplays();
|
|
||||||
ExitProcess( 0 );
|
|
||||||
}
|
}
|
||||||
// jcem
|
// jcem
|
||||||
//
|
//
|
||||||
@@ -1961,24 +1175,11 @@ BOOL DoEnum( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName )
|
|||||||
memset( &pDeviceArray->DeviceGUID, 0, sizeof( GUID ));
|
memset( &pDeviceArray->DeviceGUID, 0, sizeof( GUID ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// [displaylog] Capture the monitor before the slot index advances - the
|
|
||||||
// enumeration is the only place the association is available.
|
|
||||||
if( NumDevices<8 )
|
|
||||||
g_ahDevMonitor[NumDevices]=
|
|
||||||
( g_nEnumBufferedIndex>=0 && g_nEnumBufferedIndex<8 )
|
|
||||||
? BufferedDevices[g_nEnumBufferedIndex].hMonitor : 0;
|
|
||||||
DispLog( " result : ACCEPTED as DirectDraw device [%d]%s\r\n",
|
|
||||||
(int)NumDevices, FoundHal ? " (HAL present)" : " (no HAL)" );
|
|
||||||
|
|
||||||
pDeviceArray++;
|
pDeviceArray++;
|
||||||
NumDevices++;
|
NumDevices++;
|
||||||
if( FoundHal )
|
if( FoundHal )
|
||||||
NumHWDevices++;
|
NumHWDevices++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
DispLog( " result : REJECTED - failed capability checks, no device index assigned\r\n" );
|
|
||||||
}
|
|
||||||
return (NumDevices<8) ? DDENUMRET_OK : DDENUMRET_CANCEL;
|
return (NumDevices<8) ? DDENUMRET_OK : DDENUMRET_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1992,26 +1193,17 @@ void CheckDevices()
|
|||||||
{
|
{
|
||||||
for( int t0=0; t0<NumBuffered; t0++ )
|
for( int t0=0; t0<NumBuffered; t0++ )
|
||||||
{
|
{
|
||||||
char szChkG[192];
|
|
||||||
char szChkMon[192];
|
|
||||||
// [displaylog] DoEnum has no access to the monitor handle; hand it the index.
|
|
||||||
g_nEnumBufferedIndex=t0;
|
|
||||||
DispLog( "\r\n checking buffered device %d : %s\r\n", t0, BufferedDevices[t0].lpDriverDescription );
|
|
||||||
DispLog( " driver : %s\r\n", BufferedDevices[t0].lpDriverName );
|
|
||||||
DispLog( " GUID : %s\r\n", DispLogGuid( BufferedDevices[t0].lpGUID, szChkG ) );
|
|
||||||
DispLog( " monitor : %s\r\n", DispLogMonitorName( BufferedDevices[t0].hMonitor, szChkMon ) );
|
|
||||||
DoEnum( BufferedDevices[ t0 ].lpGUID, BufferedDevices[ t0 ].lpDriverDescription, BufferedDevices[ t0 ].lpDriverName );
|
DoEnum( BufferedDevices[ t0 ].lpGUID, BufferedDevices[ t0 ].lpDriverDescription, BufferedDevices[ t0 ].lpDriverName );
|
||||||
gos_Free( BufferedDevices[ t0 ].lpDriverDescription );
|
gos_Free( BufferedDevices[ t0 ].lpDriverDescription );
|
||||||
gos_Free( BufferedDevices[ t0 ].lpDriverName );
|
gos_Free( BufferedDevices[ t0 ].lpDriverName );
|
||||||
}
|
}
|
||||||
g_nEnumBufferedIndex=-1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// During enumeration, save all information in an array
|
// During enumeration, save all information in an array
|
||||||
//
|
//
|
||||||
BOOL BufferDevice( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, HMONITOR hm )
|
BOOL BufferDevice( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName )
|
||||||
{
|
{
|
||||||
if( lpGUID )
|
if( lpGUID )
|
||||||
{
|
{
|
||||||
@@ -2023,8 +1215,6 @@ BOOL BufferDevice( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName,
|
|||||||
BufferedDevices[ NumBuffered ].lpGUID=0;
|
BufferedDevices[ NumBuffered ].lpGUID=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferedDevices[ NumBuffered ].hMonitor=hm;
|
|
||||||
|
|
||||||
BufferedDevices[ NumBuffered ].lpDriverDescription=(char*)gos_Malloc( strlen(lpDriverDescription)+1 );
|
BufferedDevices[ NumBuffered ].lpDriverDescription=(char*)gos_Malloc( strlen(lpDriverDescription)+1 );
|
||||||
|
|
||||||
BufferedDevices[ NumBuffered ].lpDriverName=(char*)gos_Malloc( strlen(lpDriverName)+1 );
|
BufferedDevices[ NumBuffered ].lpDriverName=(char*)gos_Malloc( strlen(lpDriverName)+1 );
|
||||||
@@ -2048,29 +1238,16 @@ BOOL BufferDevice( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName,
|
|||||||
//
|
//
|
||||||
BOOL WINAPI DirectDrawEnumerateExCallback( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID, HMONITOR hm )
|
BOOL WINAPI DirectDrawEnumerateExCallback( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID, HMONITOR hm )
|
||||||
{
|
{
|
||||||
char szCbG[128];
|
|
||||||
char szCbMon[192];
|
|
||||||
DispLog( " callback %d (Ex) : %s\r\n", (int)NumBuffered, lpDriverDescription ? lpDriverDescription : "(no description)" );
|
|
||||||
DispLog( " driver : %s\r\n", lpDriverName ? lpDriverName : "(none)" );
|
|
||||||
DispLog( " GUID : %s\r\n", DispLogGuid( lpGUID, szCbG ) );
|
|
||||||
DispLog( " monitor : %s\r\n", DispLogMonitorName( hm, szCbMon ) );
|
|
||||||
if( hm )
|
if( hm )
|
||||||
NumMonitors++;
|
NumMonitors++;
|
||||||
else
|
return BufferDevice( lpGUID, lpDriverDescription, lpDriverName );
|
||||||
DispLog( " note : no HMONITOR - this entry is the primary display driver alias,\r\n"
|
|
||||||
" not an independent output. NumMonitors is NOT incremented.\r\n" );
|
|
||||||
return BufferDevice( lpGUID, lpDriverDescription, lpDriverName, hm );
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Ddraw enumeration in Win95
|
// Ddraw enumeration in Win95
|
||||||
//
|
//
|
||||||
BOOL WINAPI DirectDrawEnumerateCallback( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID )
|
BOOL WINAPI DirectDrawEnumerateCallback( GUID* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID )
|
||||||
{
|
{
|
||||||
char szCbG[128];
|
return BufferDevice( lpGUID, lpDriverDescription, lpDriverName );
|
||||||
DispLog( " callback %d (legacy, no monitor info) : %s\r\n",
|
|
||||||
(int)NumBuffered, lpDriverDescription ? lpDriverDescription : "(no description)" );
|
|
||||||
DispLog( " GUID : %s\r\n", DispLogGuid( lpGUID, szCbG ) );
|
|
||||||
return BufferDevice( lpGUID, lpDriverDescription, lpDriverName, 0 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
#include "MemoryManager.hpp"
|
#include "MemoryManager.hpp"
|
||||||
#include "DirectX.hpp"
|
#include "DirectX.hpp"
|
||||||
#include "FileIO.hpp"
|
#include "FileIO.hpp"
|
||||||
#include <stdlib.h> // [fpslog] atexit() for the frame pacing summary
|
|
||||||
#include "ControlManager.hpp"
|
#include "ControlManager.hpp"
|
||||||
#include "LocalizationManager.hpp"
|
#include "LocalizationManager.hpp"
|
||||||
#include "Time.hpp"
|
#include "Time.hpp"
|
||||||
@@ -835,264 +834,13 @@ __int64 ProfileRenderEnd( __int64 RenderTime )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
#include "render.hpp"
|
#include "render.hpp"
|
||||||
HRESULT App_Render( LPDIRECT3DDEVICE7 pd3dDevice,LPDIRECTDRAWSURFACE7 pddsTexture);
|
HRESULT App_Render( LPDIRECT3DDEVICE7 pd3dDevice,LPDIRECTDRAWSURFACE7 pddsTexture);
|
||||||
|
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// [fpslog] Frame pacing report, written to gos-fps.txt next to the executable.
|
|
||||||
//
|
|
||||||
// Off unless the -fps switch is given, so a normal pod run does no extra work at all.
|
|
||||||
// Set from MW4Application's command-line parser.
|
|
||||||
//
|
|
||||||
int g_nFpsLog = 0;
|
|
||||||
|
|
||||||
// The engine's own FrameRate readout is inside #ifdef LAB_ONLY, so it exists only in
|
|
||||||
// MW4pro.exe. This works in Release builds, which is what actually runs on the pods.
|
|
||||||
//
|
|
||||||
// Average FPS on its own hides stutter: 60 fps average is indistinguishable from 60 fps
|
|
||||||
// with a dropped frame every second. So this also reports the slowest frames, which is
|
|
||||||
// where rhythmic hitching shows up.
|
|
||||||
//
|
|
||||||
// IMPORTANT - why the output is buffered:
|
|
||||||
// The first version wrote one line per second straight to the file. That put a WriteFile
|
|
||||||
// on the render thread every second, and its cost landed in the NEXT frame's measurement
|
|
||||||
// (the frame time is recorded before the line is emitted). The result was exactly one
|
|
||||||
// inflated frame per second, forever - the tool was reporting its own overhead as the
|
|
||||||
// game's worst frame. Everything is now accumulated in memory and flushed only when the
|
|
||||||
// buffer fills or at exit, so a normal session performs no writes at all while running.
|
|
||||||
// Trade-off: a hard crash loses the un-flushed tail. gos-displays.txt is the
|
|
||||||
// crash-survivable log; this one is a measurement instrument.
|
|
||||||
//
|
|
||||||
static char s_szFpsBuf[131072]; // ~2000 lines, about 33 minutes at 1 line/sec
|
|
||||||
static int s_nFpsBufUsed = 0;
|
|
||||||
static HANDLE s_hFpsFile = INVALID_HANDLE_VALUE;
|
|
||||||
static int s_bFpsAtExit = 0;
|
|
||||||
|
|
||||||
// Whole-session frame time histogram in 0.5 ms buckets (0 - 1000 ms). Lets the true
|
|
||||||
// session-wide percentiles be computed at exit without retaining every frame time.
|
|
||||||
#define FPS_HIST_BUCKETS 2000
|
|
||||||
static DWORD s_adwFpsHist[FPS_HIST_BUCKETS];
|
|
||||||
static DWORD s_dwFpsFrames = 0;
|
|
||||||
static double s_dFpsTotalMS = 0.0;
|
|
||||||
static DWORD s_dwFpsHitches = 0;
|
|
||||||
|
|
||||||
static void GOS_FpsFlush( void )
|
|
||||||
{
|
|
||||||
DWORD dwWritten=0;
|
|
||||||
|
|
||||||
if( s_nFpsBufUsed<=0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( s_hFpsFile==INVALID_HANDLE_VALUE )
|
|
||||||
{
|
|
||||||
char szDir[MAX_PATH];
|
|
||||||
char szPath[MAX_PATH];
|
|
||||||
|
|
||||||
szDir[0]='\0';
|
|
||||||
GetModuleFileNameA( NULL, szDir, sizeof(szDir) );
|
|
||||||
char* pSlash=strrchr( szDir, '\\' );
|
|
||||||
if( pSlash )
|
|
||||||
*(pSlash+1)='\0';
|
|
||||||
else
|
|
||||||
szDir[0]='\0';
|
|
||||||
sprintf( szPath, "%sgos-fps.txt", szDir );
|
|
||||||
|
|
||||||
// FILE_SHARE_READ so the file can be read while the game is still running.
|
|
||||||
s_hFpsFile=CreateFileA( szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL,
|
|
||||||
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
|
||||||
if( s_hFpsFile==INVALID_HANDLE_VALUE )
|
|
||||||
{
|
|
||||||
s_nFpsBufUsed=0; // drop it rather than retry every second
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteFile( s_hFpsFile, s_szFpsBuf, (DWORD)s_nFpsBufUsed, &dwWritten, NULL );
|
|
||||||
s_nFpsBufUsed=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mean frame time (ms) of the slowest dwCount frames of the whole session.
|
|
||||||
static double GOS_FpsSlowestMean( DWORD dwCount )
|
|
||||||
{
|
|
||||||
double dSum=0.0;
|
|
||||||
DWORD dwSeen=0;
|
|
||||||
int b;
|
|
||||||
|
|
||||||
if( dwCount<1 )
|
|
||||||
dwCount=1;
|
|
||||||
|
|
||||||
for( b=FPS_HIST_BUCKETS-1; b>=0 && dwSeen<dwCount; b-- )
|
|
||||||
{
|
|
||||||
DWORD dwTake=s_adwFpsHist[b];
|
|
||||||
if( !dwTake )
|
|
||||||
continue;
|
|
||||||
if( dwTake>dwCount-dwSeen )
|
|
||||||
dwTake=dwCount-dwSeen;
|
|
||||||
dSum += (((double)b+0.5)/2.0)*(double)dwTake;
|
|
||||||
dwSeen += dwTake;
|
|
||||||
}
|
|
||||||
return dwSeen ? (dSum/(double)dwSeen) : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GOS_FpsAppend( const char* pszLine )
|
|
||||||
{
|
|
||||||
int nLen=(int)strlen(pszLine);
|
|
||||||
|
|
||||||
if( nLen<=0 )
|
|
||||||
return;
|
|
||||||
if( s_nFpsBufUsed+nLen > (int)sizeof(s_szFpsBuf) )
|
|
||||||
GOS_FpsFlush(); // buffer full: one write, rarely
|
|
||||||
if( s_nFpsBufUsed+nLen > (int)sizeof(s_szFpsBuf) )
|
|
||||||
return; // still no room: give up quietly
|
|
||||||
|
|
||||||
memcpy( s_szFpsBuf+s_nFpsBufUsed, pszLine, nLen );
|
|
||||||
s_nFpsBufUsed += nLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: must be __cdecl. GameOS builds with /Gz (__stdcall by default), but atexit()
|
|
||||||
// takes a __cdecl callback, so without this the compiler rejects it with C2664.
|
|
||||||
static void __cdecl GOS_FpsAtExit( void )
|
|
||||||
{
|
|
||||||
char szLine[256];
|
|
||||||
|
|
||||||
if( s_dwFpsFrames )
|
|
||||||
{
|
|
||||||
// True session-wide percentiles, which a per-second bucket cannot give:
|
|
||||||
// 1% of 60 frames is 0, so a "1% low" computed per second degenerates into
|
|
||||||
// "the single worst frame". Over a whole session it is meaningful.
|
|
||||||
double dAvgMS = s_dFpsTotalMS/(double)s_dwFpsFrames;
|
|
||||||
double dOnePct = GOS_FpsSlowestMean( s_dwFpsFrames/100 );
|
|
||||||
double dTenthPct= GOS_FpsSlowestMean( s_dwFpsFrames/1000 );
|
|
||||||
|
|
||||||
GOS_FpsAppend( "\r\n" );
|
|
||||||
GOS_FpsAppend( "session summary\r\n" );
|
|
||||||
GOS_FpsAppend( "---------------\r\n" );
|
|
||||||
sprintf( szLine, " frames : %lu\r\n", (unsigned long)s_dwFpsFrames );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
sprintf( szLine, " elapsed : %.1f s\r\n", s_dFpsTotalMS/1000.0 );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
sprintf( szLine, " average : %.1f fps (%.2f ms)\r\n",
|
|
||||||
(dAvgMS>0.0)?1000.0/dAvgMS:0.0, dAvgMS );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
sprintf( szLine, " 1%% low : %.1f fps (%.2f ms)\r\n",
|
|
||||||
(dOnePct>0.0)?1000.0/dOnePct:0.0, dOnePct );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
sprintf( szLine, " 0.1%% low : %.1f fps (%.2f ms)\r\n",
|
|
||||||
(dTenthPct>0.0)?1000.0/dTenthPct:0.0, dTenthPct );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
sprintf( szLine, " frames over 2x avg: %lu\r\n", (unsigned long)s_dwFpsHitches );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
}
|
|
||||||
|
|
||||||
GOS_FpsFlush();
|
|
||||||
if( s_hFpsFile!=INVALID_HANDLE_VALUE )
|
|
||||||
{
|
|
||||||
CloseHandle( s_hFpsFile );
|
|
||||||
s_hFpsFile=INVALID_HANDLE_VALUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GOS_LogFrameRate( float fFrameRate )
|
|
||||||
{
|
|
||||||
enum { MAX_WORST = 64 };
|
|
||||||
static float s_afWorst[MAX_WORST]; // longest frames this second, descending ms
|
|
||||||
static int s_nWorst = 0;
|
|
||||||
static float s_fAccumMS= 0.0f;
|
|
||||||
static float s_fSumMS = 0.0f;
|
|
||||||
static float s_fMaxMS = 0.0f;
|
|
||||||
static int s_nFrames = 0;
|
|
||||||
static int s_nSecond = 0;
|
|
||||||
char szLine[256];
|
|
||||||
|
|
||||||
if( !g_nFpsLog ) // [fpslog] -fps not given: do nothing
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( fFrameRate<=0.0f )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( !s_bFpsAtExit )
|
|
||||||
{
|
|
||||||
s_bFpsAtExit=1;
|
|
||||||
atexit( GOS_FpsAtExit ); // flush the buffer + write the summary
|
|
||||||
}
|
|
||||||
|
|
||||||
float fMS = 1000.0f/fFrameRate;
|
|
||||||
|
|
||||||
s_nFrames++;
|
|
||||||
s_fSumMS += fMS;
|
|
||||||
s_fAccumMS += fMS;
|
|
||||||
if( fMS>s_fMaxMS )
|
|
||||||
s_fMaxMS = fMS;
|
|
||||||
|
|
||||||
// Whole-session histogram (0.5 ms buckets, saturating at the top bucket).
|
|
||||||
int nBucket=(int)(fMS*2.0f);
|
|
||||||
if( nBucket<0 )
|
|
||||||
nBucket=0;
|
|
||||||
if( nBucket>=FPS_HIST_BUCKETS )
|
|
||||||
nBucket=FPS_HIST_BUCKETS-1;
|
|
||||||
s_adwFpsHist[nBucket]++;
|
|
||||||
s_dwFpsFrames++;
|
|
||||||
s_dFpsTotalMS += fMS;
|
|
||||||
|
|
||||||
// Maintain the longest frames of this second, sorted longest-first.
|
|
||||||
if( s_nWorst<MAX_WORST )
|
|
||||||
s_afWorst[s_nWorst++] = fMS;
|
|
||||||
else if( fMS>s_afWorst[MAX_WORST-1] )
|
|
||||||
s_afWorst[MAX_WORST-1] = fMS;
|
|
||||||
for( int i=s_nWorst-1; i>0 && s_afWorst[i]>s_afWorst[i-1]; i-- ) {
|
|
||||||
float fTmp=s_afWorst[i]; s_afWorst[i]=s_afWorst[i-1]; s_afWorst[i-1]=fTmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( s_fAccumMS<1000.0f )
|
|
||||||
return;
|
|
||||||
|
|
||||||
float fAvgMS = s_fSumMS/(float)s_nFrames;
|
|
||||||
float fAvgFPS = 1000.0f/fAvgMS;
|
|
||||||
|
|
||||||
// 5% low, not 1%: at 60 samples a "1% low" is a single frame, which is just the
|
|
||||||
// worst-frame column restated. Worst 3-of-60 is a number that actually differs.
|
|
||||||
int nLow = s_nFrames/20;
|
|
||||||
if( nLow<3 )
|
|
||||||
nLow = 3;
|
|
||||||
if( nLow>s_nWorst )
|
|
||||||
nLow = s_nWorst;
|
|
||||||
float fLowSum=0.0f;
|
|
||||||
for( int j=0; j<nLow; j++ )
|
|
||||||
fLowSum += s_afWorst[j];
|
|
||||||
float fLowFPS = (fLowSum>0.0f) ? (1000.0f/(fLowSum/(float)nLow)) : 0.0f;
|
|
||||||
|
|
||||||
// Frames that took more than twice the average - i.e. visible hitches.
|
|
||||||
int nHitch=0;
|
|
||||||
for( int k=0; k<s_nWorst; k++ )
|
|
||||||
if( s_afWorst[k]>fAvgMS*2.0f )
|
|
||||||
nHitch++;
|
|
||||||
s_dwFpsHitches += nHitch;
|
|
||||||
|
|
||||||
if( s_nSecond==0 )
|
|
||||||
GOS_FpsAppend( " sec frames avg fps 5% low worst frame hitches\r\n"
|
|
||||||
" --- ------ ------- ------ ----------- -------\r\n" );
|
|
||||||
|
|
||||||
sprintf( szLine, "%5d %6d %8.1f %8.1f %8.1f ms %s%d\r\n",
|
|
||||||
s_nSecond, s_nFrames, fAvgFPS, fLowFPS, s_fMaxMS,
|
|
||||||
nHitch ? "<-- " : "", nHitch );
|
|
||||||
GOS_FpsAppend( szLine );
|
|
||||||
|
|
||||||
s_nSecond++;
|
|
||||||
s_nFrames = 0;
|
|
||||||
s_nWorst = 0;
|
|
||||||
s_fSumMS = 0.0f;
|
|
||||||
s_fMaxMS = 0.0f;
|
|
||||||
// A single frame longer than a second (a level load) must not spill into the next
|
|
||||||
// buckets and emit a run of bogus one-frame rows, which is what used to happen.
|
|
||||||
s_fAccumMS-= 1000.0f;
|
|
||||||
if( s_fAccumMS<0.0f || s_fAccumMS>=1000.0f )
|
|
||||||
s_fAccumMS = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Update the display (call all the 'Update Renderers' routines
|
// Update the display (call all the 'Update Renderers' routines
|
||||||
//
|
//
|
||||||
@@ -1137,7 +885,6 @@ void gos_UpdateDisplay( bool Everything )
|
|||||||
|
|
||||||
frameRate=(float)frequency/(float)thisframe; // Calculate frame rate based on clock frequency
|
frameRate=(float)frequency/(float)thisframe; // Calculate frame rate based on clock frequency
|
||||||
StartOfRenderTime=GetCycles();
|
StartOfRenderTime=GetCycles();
|
||||||
GOS_LogFrameRate( frameRate ); // [fpslog] per-second pacing report
|
|
||||||
//
|
//
|
||||||
// Don't trigger watchdog timer
|
// Don't trigger watchdog timer
|
||||||
//
|
//
|
||||||
@@ -1168,8 +915,8 @@ void gos_UpdateDisplay( bool Everything )
|
|||||||
ProfileTime( TimeClearViewPort, gos_SetupViewport( 0, 0, 1, 0x303050 , 0.0, 0.0, 1.0, 1.0 ) );
|
ProfileTime( TimeClearViewPort, gos_SetupViewport( 0, 0, 1, 0x303050 , 0.0, 0.0, 1.0, 1.0 ) );
|
||||||
TimeInClearViewPort+=TimeClearViewPort;
|
TimeInClearViewPort+=TimeClearViewPort;
|
||||||
}
|
}
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
//Draw background image to backbuffer...
|
//backbuffer에 Background Image를 그린다...
|
||||||
|
|
||||||
if(hsh_initialized){
|
if(hsh_initialized){
|
||||||
// 0 - no MFDs, 1 - orginal(5+1=dual & single), 2 - B&W(3 + 1=1 dual), 3 - color(3 + 1=2 dual)
|
// 0 - no MFDs, 1 - orginal(5+1=dual & single), 2 - B&W(3 + 1=1 dual), 3 - color(3 + 1=2 dual)
|
||||||
@@ -1193,25 +940,13 @@ void gos_UpdateDisplay( bool Everything )
|
|||||||
radar_device.BeginScene();
|
radar_device.BeginScene();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
|
||||||
// Step 0: clear + grid for radar and LEFT MFD.
|
|
||||||
// Step 1: clear + grid for RIGHT MFD (staggered so the right
|
|
||||||
// flip at new sh_step==1 shows channels 3-4 from the previous
|
|
||||||
// cycle, not a freshly-cleared buffer).
|
|
||||||
if(sh_step==0){
|
|
||||||
radar_device.BeginScene();
|
|
||||||
mfd_device.BeginScene(); // left device only
|
|
||||||
} else if(sh_step==1) {
|
|
||||||
mfd_device.BeginSceneRight(); // right device clear + grid
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}else if(hsh_mrdev_initialized){
|
}else if(hsh_mrdev_initialized){
|
||||||
mr_device.BeginScene();
|
mr_device.BeginScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
//HSH_RenderAux1SmallMech();
|
//HSH_RenderAux1SmallMech();
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
if (g_pfnCTCL_AfterBeginScene) {
|
if (g_pfnCTCL_AfterBeginScene) {
|
||||||
(*g_pfnCTCL_AfterBeginScene)();
|
(*g_pfnCTCL_AfterBeginScene)();
|
||||||
}
|
}
|
||||||
@@ -1308,7 +1043,7 @@ void gos_UpdateDisplay( bool Everything )
|
|||||||
LOG_BLOCK("Gos::UpdateDebugger()");
|
LOG_BLOCK("Gos::UpdateDebugger()");
|
||||||
ProfileTime( TimeDebugger, UpdateDebugger() );
|
ProfileTime( TimeDebugger, UpdateDebugger() );
|
||||||
}
|
}
|
||||||
//sanghoon
|
//상훈..
|
||||||
#if 1
|
#if 1
|
||||||
extern LPDIRECT3DDEVICE7 d3dDevice7;
|
extern LPDIRECT3DDEVICE7 d3dDevice7;
|
||||||
static bool preload_GameEndScreem=true;;
|
static bool preload_GameEndScreem=true;;
|
||||||
@@ -1342,8 +1077,8 @@ void gos_UpdateDisplay( bool Everything )
|
|||||||
//
|
//
|
||||||
// Flip or Blit the current image onto the display
|
// Flip or Blit the current image onto the display
|
||||||
//
|
//
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
//Perform the Flip.
|
//Flip을 한다.
|
||||||
if(hsh_initialized){
|
if(hsh_initialized){
|
||||||
// 0 - no MFDs, 1 - orginal(5+1=dual & single), 2 - B&W(3 + 1=1 dual), 3 - color(3 + 1=2 dual)
|
// 0 - no MFDs, 1 - orginal(5+1=dual & single), 2 - B&W(3 + 1=1 dual), 3 - color(3 + 1=2 dual)
|
||||||
switch(g_nTypeOfMFDs) {
|
switch(g_nTypeOfMFDs) {
|
||||||
@@ -1371,32 +1106,13 @@ void gos_UpdateDisplay( bool Everything )
|
|||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
break;
|
break;
|
||||||
case 4:
|
|
||||||
// 7-step cadence. Radar + left MFD flip on step 0 (same as mode 1).
|
|
||||||
// Right MFD flip is staggered to step 1 so that three back-to-back
|
|
||||||
// DGVoodoo2 Present() calls don't all land in the same frame and
|
|
||||||
// cause rhythmic stutter on the main display.
|
|
||||||
// Right device finishes rendering at step 6 (channel 4), so
|
|
||||||
// flipping at step 1 is still correct timing.
|
|
||||||
sh_step++;
|
|
||||||
sh_step%=7;
|
|
||||||
if(sh_step==0) {
|
|
||||||
radar_device.EndScene();
|
|
||||||
radar_device.pDDSFront->Flip(0,DDFLIP_DONOTWAIT|DDFLIP_NOVSYNC);
|
|
||||||
mfd_device.EndScene();
|
|
||||||
mfd_device.pDDSFront->Flip(0,DDFLIP_DONOTWAIT|DDFLIP_NOVSYNC);
|
|
||||||
} else if(sh_step==1) {
|
|
||||||
if (mfd_device_right.pDDSFront)
|
|
||||||
mfd_device_right.pDDSFront->Flip(0,DDFLIP_DONOTWAIT|DDFLIP_NOVSYNC);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}else if(hsh_mrdev_initialized){
|
}else if(hsh_mrdev_initialized){
|
||||||
mr_device.EndScene();
|
mr_device.EndScene();
|
||||||
mr_device.pDDSFront->Flip(0,DDFLIP_DONOTWAIT|DDFLIP_NOVSYNC);
|
mr_device.pDDSFront->Flip(0,DDFLIP_DONOTWAIT|DDFLIP_NOVSYNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
{
|
{
|
||||||
LOG_BLOCK("Gos::DisplayBackBuffer()");
|
LOG_BLOCK("Gos::DisplayBackBuffer()");
|
||||||
ProfileTime( TimeDisplay, DisplayBackBuffer() );
|
ProfileTime( TimeDisplay, DisplayBackBuffer() );
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ extern DWORD gNumLockMode;
|
|||||||
extern DWORD gCapLockMode;
|
extern DWORD gCapLockMode;
|
||||||
extern DWORD gScrollLockMode;
|
extern DWORD gScrollLockMode;
|
||||||
|
|
||||||
// hyun begin
|
// úè - start
|
||||||
void (__stdcall *g_pfnRIO_ButtonEvent)(BYTE* by) = NULL;
|
void (__stdcall *g_pfnRIO_ButtonEvent)(BYTE* by) = NULL;
|
||||||
// hyun end
|
// úè - end
|
||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -106,14 +106,14 @@ LRESULT CALLBACK GameOSWinProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
|
|||||||
|
|
||||||
switch( uMsg )
|
switch( uMsg )
|
||||||
{
|
{
|
||||||
// hyun
|
// úè
|
||||||
case WM_USER + 100:
|
case WM_USER + 100:
|
||||||
{
|
{
|
||||||
// hyun begin
|
// úè - start
|
||||||
if (g_pfnRIO_ButtonEvent) {
|
if (g_pfnRIO_ButtonEvent) {
|
||||||
(*g_pfnRIO_ButtonEvent)((BYTE*)&lParam);
|
(*g_pfnRIO_ButtonEvent)((BYTE*)&lParam);
|
||||||
}
|
}
|
||||||
// hyun end
|
// úè - end
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -2,20 +2,20 @@
|
|||||||
// MSL ADD MECH
|
// MSL ADD MECH
|
||||||
// MFD
|
// MFD
|
||||||
float texuv2[65][11][4]={
|
float texuv2[65][11][4]={
|
||||||
{{ 78,152,156,328},{182,152,262,328},{ 56, 72,128,164},{210, 72,284,164},{180, 64,208,200},{132, 64,160,200},{146, 10,192,198},{ 0, 0, 0, 0},{162, 32,176, 38},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Annihilator
|
{{186,156,237,336},{ 96,156,147,336},{237, 24,294,168},{ 57, 24, 93,162},{ 99, 39,150,129},{186, 39,234,129},{312, 48,375,207},{ 0, 0, 0, 0},{159, 24,177, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Annihilator
|
||||||
{{195,171,258,351},{ 69,171,132,351},{264,168,309,240},{ 15,168, 60,240},{ 54, 39,141,162},{183, 39,270,162},{141, 51,183,207},{ 0, 0, 0, 0},{153, 15,171, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Archer
|
{{195,171,258,351},{ 69,171,132,351},{264,168,309,240},{ 15,168, 60,240},{ 54, 39,141,162},{183, 39,270,162},{141, 51,183,207},{ 0, 0, 0, 0},{153, 15,171, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Archer
|
||||||
{{250,150,328,330},{ 10,150, 90,330},{254, 86,332,136},{ 4, 86, 84,136},{102,252,158,310},{168,252,226,312},{128, 34,210,198},{ 0, 0, 0, 0},{154, 10,174, 24},{228, 8,308, 64},{ 28, 8,108, 64}}, // M_Arctic Wolf
|
{{250,150,328,330},{ 10,150, 90,330},{254, 86,332,136},{ 4, 86, 84,136},{102,252,158,310},{168,252,226,312},{128, 34,210,198},{ 0, 0, 0, 0},{154, 10,174, 24},{228, 8,308, 64},{ 28, 8,108, 64}}, // M_Arctic Wolf
|
||||||
{{254,142,324,334},{ 16,142, 86,334},{248, 56,326,108},{ 12, 56, 92,108},{ 94, 70,156,152},{182, 70,246,152},{132,166,208,292},{ 0, 0, 0, 0},{ 40, 24, 58, 30},{140,302,198,332},{122, 2,218, 60}}, // M_Ares
|
{{254,142,324,334},{ 16,142, 86,334},{248, 56,326,108},{ 12, 56, 92,108},{ 94, 70,156,152},{182, 70,246,152},{132,166,208,292},{ 0, 0, 0, 0},{ 40, 24, 58, 30},{140,302,198,332},{122, 2,218, 60}}, // M_Ares
|
||||||
{{ 42,138,158,326},{176,138,292,336},{ 54, 30,124,106},{224, 24,306,124},{194, 38,222,100},{124, 38,142,100},{128, 14,210,186},{ 0, 0, 0, 0},{156, 48,178, 56},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Argus
|
{{202,130,326,338},{ 6,130,130,338},{242, 14,334,120},{ 6, 18, 94,100},{100, 26,125,118},{198, 18,232,116},{134, 2,190,188},{ 0, 0, 0, 0},{150,220,174,226},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Argus
|
||||||
{{ 98,142,148,328},{190,142,240,328},{ 56, 48,124,154},{216, 48,282,154},{180, 22,220,120},{120, 22,158,120},{144, 36,194,186},{ 0, 0, 0, 0},{158, 70,180, 86},{148, 10,190, 48},{ 0, 0, 0, 0}}, // M_Assassin2
|
{{270,136,330,332},{ 10,136, 68,332},{240, 28,302,114},{ 38, 28, 92,114},{114, 12,218,116},{178,218,218,282},{148,128,192,182},{ 0, 0, 0, 0},{190,294,200,302},{140,230,164,278},{ 0, 0, 0, 0}}, // M_Assassin2
|
||||||
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{252,195,273,252}}, // M_Atlas
|
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{252,195,273,252}}, // M_Atlas
|
||||||
{{ 60,108,104,250},{138,108,180,250},{ 40, 40, 74, 84},{168, 40,218, 88},{140, 28,168,104},{ 76, 28,102,104},{ 98, 6,146,138},{ 0, 0, 0, 0},{116, 16,124, 24},{112, 78,128, 94},{ 0, 0, 0, 0}}, // M_Avatar
|
{{180,135,285,342},{ 60,135,165,342},{234, 84,291,132},{ 54, 84,111,132},{114, 27,150,126},{195, 27,231,126},{156, 21,189,135},{ 0, 0, 0, 0},{165, 3,180, 18},{297,129,378,168},{ 0, 0, 0, 0}}, // M_Avatar
|
||||||
{{186,156,237,336},{ 96,156,147,336},{237, 24,294,168},{ 57, 24, 93,162},{ 99, 39,150,129},{186, 39,234,129},{312, 48,375,207},{ 0, 0, 0, 0},{159, 24,177, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Awesome
|
{{186,156,237,336},{ 96,156,147,336},{237, 24,294,168},{ 57, 24, 93,162},{ 99, 39,150,129},{186, 39,234,129},{312, 48,375,207},{ 0, 0, 0, 0},{159, 24,177, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Awesome
|
||||||
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{252,195,273,252}}, // M_Battlemaster
|
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{252,195,273,252}}, // M_Battlemaster
|
||||||
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{ 0, 0, 0, 0}}, // M_BattlemasterIIc
|
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{ 0, 0, 0, 0}}, // M_BattlemasterIIc
|
||||||
{{ 76,170,152,302},{184,170,262,302},{ 12,106,126,174},{212,106,326,174},{176, 86,226,174},{110, 82,160,174},{140, 96,198,224},{ 0, 0, 0, 0},{164,122,174,134},{142, 38,194, 98},{ 0, 0, 0, 0}}, // M_Behemoth
|
{{186,177,243,375},{102,177,159,375},{249, 27,324,162},{ 18, 18,102,162},{111, 51,147,141},{201, 51,237,141},{153, 18,192,174},{ 0, 0, 0, 0},{210, 30,231, 39},{ 21,213, 75,330},{ 0, 0, 0, 0}}, // M_Behemoth
|
||||||
{{ 76,170,152,302},{184,170,262,302},{ 12,106,126,174},{212,106,326,174},{176, 86,226,174},{110, 82,160,174},{140, 96,198,224},{ 0, 0, 0, 0},{164,122,174,134},{142, 38,194, 98},{ 0, 0, 0, 0}}, // M_Behemothii
|
{{186,177,243,375},{102,177,159,375},{249, 27,324,162},{ 18, 18,102,162},{111, 51,147,141},{201, 51,237,141},{153, 18,192,174},{ 0, 0, 0, 0},{210, 30,231, 39},{ 21,213, 75,330},{ 0, 0, 0, 0}}, // M_Behemothii
|
||||||
{{ 32, 82,140,294},{188, 82,294,294},{ 6, 12, 88,134},{236, 12,318,134},{176, 18,234,132},{ 92, 18,244, 36},{152, 6,172,132},{ 0, 0, 0, 0},{154, 38,168, 42},{110,112,142,138},{184,112,216,138}}, // M_Blackhawk
|
{{177,189,267,378},{ 69,189,159,378},{240, 78,288,171},{ 48, 78, 96,171},{102, 39,165,141},{171, 39,234,141},{309, 60,375,177},{ 0, 0, 0, 0},{156, 24,180, 33},{243, 18,300, 72},{ 36, 18, 93, 72}}, // M_Blackhawk
|
||||||
{{186,177,243,375},{102,177,159,375},{249, 27,324,162},{ 18, 18,102,162},{111, 51,147,141},{201, 51,237,141},{153, 18,192,174},{ 0, 0, 0, 0},{210, 30,231, 39},{ 21,213, 75,330},{ 0, 0, 0, 0}}, // M_Blackknight
|
{{186,177,243,375},{102,177,159,375},{249, 27,324,162},{ 18, 18,102,162},{111, 51,147,141},{201, 51,237,141},{153, 18,192,174},{ 0, 0, 0, 0},{210, 30,231, 39},{ 21,213, 75,330},{ 0, 0, 0, 0}}, // M_Blackknight
|
||||||
{{256,122,336,334},{ 8,122, 88,334},{234, 24,282,100},{ 62, 14,108, 90},{108,162,152,220},{194,162,238,220},{118, 2,226,152},{ 0, 0, 0, 0},{164,208,180,222},{194,238,218,290},{126,238,152,290}}, // M_Blacklanner
|
{{256,122,336,334},{ 8,122, 88,334},{234, 24,282,100},{ 62, 14,108, 90},{108,162,152,220},{194,162,238,220},{118, 2,226,152},{ 0, 0, 0, 0},{164,208,180,222},{194,238,218,290},{126,238,152,290}}, // M_Blacklanner
|
||||||
{{262,160,324,336},{ 18,160, 80,336},{284, 74,328,148},{ 14, 74, 58,148},{ 62, 2,150,156},{150,204,238,326},{172, 10,248,190},{ 0, 0, 0, 0},{282, 36,300, 52},{102,200,130,236},{100,288,128,326}}, // M_Brigand
|
{{262,160,324,336},{ 18,160, 80,336},{284, 74,328,148},{ 14, 74, 58,148},{ 62, 2,150,156},{150,204,238,326},{172, 10,248,190},{ 0, 0, 0, 0},{282, 36,300, 52},{102,200,130,236},{100,288,128,326}}, // M_Brigand
|
||||||
@@ -30,9 +30,9 @@ float texuv2[65][11][4]={
|
|||||||
// {{250,174,300,336},{ 40,174, 90,336},{280, 2,322,110},{ 16, 2, 58,110},{ 62, 60,104,136},{234, 60,276,136},{110, 62,230,198},{ 0, 0, 0, 0},{156, 24,182, 34},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Dasher
|
// {{250,174,300,336},{ 40,174, 90,336},{280, 2,322,110},{ 16, 2, 58,110},{ 62, 60,104,136},{234, 60,276,136},{110, 62,230,198},{ 0, 0, 0, 0},{156, 24,182, 34},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Dasher
|
||||||
{{191,142,265,337},{ 76,142,150,337},{266, 58,328,142},{ 12, 58, 75,141},{ 93, 56,150,129},{190, 56,246,129},{152, 60,188,198},{ 0, 0, 0, 0},{166, 42,177, 49},{184, 2,245, 55},{ 96, 2,157, 55}}, // M_Deimos
|
{{191,142,265,337},{ 76,142,150,337},{266, 58,328,142},{ 12, 58, 75,141},{ 93, 56,150,129},{190, 56,246,129},{152, 60,188,198},{ 0, 0, 0, 0},{166, 42,177, 49},{184, 2,245, 55},{ 96, 2,157, 55}}, // M_Deimos
|
||||||
{{237,147,300,345},{ 84,147,147,345},{324, 78,372,147},{ 12, 72, 66,135},{ 81, 33,147,111},{237, 33,300,111},{162, 42,222,186},{ 0, 0, 0, 0},{177, 15,207, 30},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Dragon
|
{{237,147,300,345},{ 84,147,147,345},{324, 78,372,147},{ 12, 72, 66,135},{ 81, 33,147,111},{237, 33,300,111},{162, 42,222,186},{ 0, 0, 0, 0},{177, 15,207, 30},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Dragon
|
||||||
{{ 86,142,162,326},{178,142,254,326},{ 24, 22, 68,134},{272, 22,316,134},{188, 14,270,136},{ 68, 14,150,136},{124, 16,214,202},{ 0, 0, 0, 0},{162, 90,178,100},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Fafnir - Skippy
|
{{250,140,332,336},{ 90,140,170,336},{260, 10,306,128},{110, 10,156,128},{ 2, 2, 88,140},{ 2,180, 86,318},{180,130,234,334},{ 0, 0, 0, 0},{200, 50,216, 60},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Fafnir - Skippy
|
||||||
{{ 52,102,136,314},{182,102,270,314},{ 96, 60,102, 78},{216, 62,224, 80},{174, 14,224, 84},{ 92, 14,146, 82},{134, 22,186,154},{ 0, 0, 0, 0},{144, 44,174, 60},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Flea - Skippy
|
{{210,110,296,336},{ 10,110, 96,336},{220, 20,226, 40},{100, 20,106, 42},{ 20, 20, 74, 94},{260, 20,314, 94},{140, 20,194,178},{ 0, 0, 0, 0},{130,200,160,216},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Flea - Skippy
|
||||||
{{ 88,156,142,318},{170,156,226,318},{ 68, 52,108,144},{206, 52,250,144},{170, 32,212,138},{102, 32,144,138},{120, 4,196,196},{ 0, 0, 0, 0},{148, 58,168, 66},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Gladiator
|
{{270,160,328,330},{ 10,160, 68,330},{280, 10,328,108},{ 10, 10,108, 50},{ 70, 10,106,120},{230, 10,262,120},{130, 10,210,216},{ 0, 0, 0, 0},{160,260,184,268},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Gladiator
|
||||||
{{210,164,286,334},{ 56,164,132,334},{278, 18,314,152},{ 24, 18, 66,144},{ 82, 32,124,132},{218, 28,262,136},{142, 16,200,190},{ 0, 0, 0, 0},{158,214,184,228},{160,254,190,280},{ 0, 0, 0, 0}}, // M_Grizzly
|
{{210,164,286,334},{ 56,164,132,334},{278, 18,314,152},{ 24, 18, 66,144},{ 82, 32,124,132},{218, 28,262,136},{142, 16,200,190},{ 0, 0, 0, 0},{158,214,184,228},{160,254,190,280},{ 0, 0, 0, 0}}, // M_Grizzly
|
||||||
{{237,174,312,348},{ 60,174,135,348},{294, 57,342,165},{ 24, 57, 72,165},{ 81, 75,123,165},{240, 69,285,165},{153, 48,222,222},{ 0, 0, 0, 0},{174, 27,201, 33},{102, 24,141, 60},{ 0, 0, 0, 0}}, // M_Hauptmann
|
{{237,174,312,348},{ 60,174,135,348},{294, 57,342,165},{ 24, 57, 72,165},{ 81, 75,123,165},{240, 69,285,165},{153, 48,222,222},{ 0, 0, 0, 0},{174, 27,201, 33},{102, 24,141, 60},{ 0, 0, 0, 0}}, // M_Hauptmann
|
||||||
{{165,144,252,318},{ 69,144,156,318},{291, 90,342,141},{ 24, 90, 75,141},{ 93, 39,141,138},{231, 42,279,141},{282,174,327,291},{ 0, 0, 0, 0},{150, 18,171, 27},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Hellhound
|
{{165,144,252,318},{ 69,144,156,318},{291, 90,342,141},{ 24, 90, 75,141},{ 93, 39,141,138},{231, 42,279,141},{282,174,327,291},{ 0, 0, 0, 0},{150, 18,171, 27},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Hellhound
|
||||||
@@ -40,9 +40,9 @@ float texuv2[65][11][4]={
|
|||||||
{{255,180,315,372},{ 72,183,132,375},{312, 69,369,144},{ 9, 63, 69,147},{ 75, 27,156,138},{225, 24,300,135},{165, 15,216,198},{ 0, 0, 0, 0},{237, 9,270, 18},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Highlander
|
{{255,180,315,372},{ 72,183,132,375},{312, 69,369,144},{ 9, 63, 69,147},{ 75, 27,156,138},{225, 24,300,135},{165, 15,216,198},{ 0, 0, 0, 0},{237, 9,270, 18},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Highlander
|
||||||
{{270,136,330,332},{ 10,136, 68,332},{240, 28,302,114},{ 38, 28, 92,114},{114, 12,218,116},{178,218,218,282},{148,128,192,182},{ 0, 0, 0, 0},{190,294,200,302},{140,230,164,278},{154,192,186,208}}, // M_HollanderII
|
{{270,136,330,332},{ 10,136, 68,332},{240, 28,302,114},{ 38, 28, 92,114},{114, 12,218,116},{178,218,218,282},{148,128,192,182},{ 0, 0, 0, 0},{190,294,200,302},{140,230,164,278},{154,192,186,208}}, // M_HollanderII
|
||||||
{{210,165,276,336},{ 69,165,135,336},{327, 48,372,141},{ 6, 48, 51,141},{ 18,165, 54,228},{276, 15,312,147},{135, 27,204,198},{ 0, 0, 0, 0},{165, 9,183, 15},{ 66, 27,114, 90},{ 0, 0, 0, 0}}, // M_Hunchback
|
{{210,165,276,336},{ 69,165,135,336},{327, 48,372,141},{ 6, 48, 51,141},{ 18,165, 54,228},{276, 15,312,147},{135, 27,204,198},{ 0, 0, 0, 0},{165, 9,183, 15},{ 66, 27,114, 90},{ 0, 0, 0, 0}}, // M_Hunchback
|
||||||
{{ 80,152,154,314},{166,152,238,314},{ 36, 50,102,136},{218, 50,286,134},{180, 24,238,138},{ 82, 24,142,138},{114, 6,208,190},{ 0, 0, 0, 0},{146,118,168,124},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Kodiak - GhostHawk
|
{{230,160,310,336},{ 22,160,102,336},{266, 62,336,156},{ 4, 62, 74,156},{ 86, 16,152, 88},{188, 16,254,138},{116,174,220,316},{ 0, 0, 0, 0},{276, 0,340, 60},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Kodiak - GhostHawk
|
||||||
{{192,156,243,342},{ 96,156,150,342},{231, 69,285,156},{ 60, 69,108,156},{114, 54,149,146},{195, 39,225,141},{150, 48,192,192},{ 0, 0, 0, 0},{162, 30,177, 42},{108, 21,146, 50},{ 0, 0, 0, 0}}, // M_Loki
|
{{192,156,243,342},{ 96,156,150,342},{231, 69,285,156},{ 60, 69,108,156},{114, 54,149,146},{195, 39,225,141},{150, 48,192,192},{ 0, 0, 0, 0},{162, 30,177, 42},{108, 21,146, 50},{ 0, 0, 0, 0}}, // M_Loki
|
||||||
{{ 88,120,146,300},{172,120,230,300},{ 4, 38, 70,110},{248, 38,314,108},{186, 30,248,114},{ 72, 30,136,116},{134, 20,184,114},{ 0, 0, 0, 0},{152, 62,168, 68},{132,116,188,166},{ 0, 0, 0, 0}}, // M_Longbow - GhostHawk
|
{{270,138,332,332},{ 10,138, 72,332},{186,138,260,216},{ 82,138,158,216},{ 32, 12,100,104},{236, 12,304,104},{142, 18,198,122},{ 0, 0, 0, 0},{162,316,176,326},{134,238,206,292},{ 0, 0, 0, 0}}, // M_Longbow - GhostHawk
|
||||||
{{177,189,267,378},{ 69,189,159,378},{240, 78,288,171},{ 48, 78, 96,171},{102, 39,165,141},{171, 39,234,141},{309, 60,375,177},{ 0, 0, 0, 0},{156, 24,180, 33},{243, 18,300, 72},{ 36, 18, 93, 72}}, // M_Madcat
|
{{177,189,267,378},{ 69,189,159,378},{240, 78,288,171},{ 48, 78, 96,171},{102, 39,165,141},{171, 39,234,141},{309, 60,375,177},{ 0, 0, 0, 0},{156, 24,180, 33},{243, 18,300, 72},{ 36, 18, 93, 72}}, // M_Madcat
|
||||||
{{201,159,294,333},{ 48,159,141,333},{225,102,285,153},{ 57,102,117,153},{120, 45,168,150},{174, 45,222,150},{141,198,201,327},{ 0, 0, 0, 0},{159, 27,183, 39},{ 57, 12,108, 75},{234, 12,285, 75}}, // M_Madcat_MKII
|
{{201,159,294,333},{ 48,159,141,333},{225,102,285,153},{ 57,102,117,153},{120, 45,168,150},{174, 45,222,150},{141,198,201,327},{ 0, 0, 0, 0},{159, 27,183, 39},{ 57, 12,108, 75},{234, 12,285, 75}}, // M_Madcat_MKII
|
||||||
{{225,153,360,342},{ 24,153,159,342},{297, 30,378,129},{ 6, 30, 87,129},{123, 45,165,147},{219, 45,261,147},{168, 45,216,198},{ 0, 0, 0, 0},{174, 18,210, 30},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Masakari
|
{{225,153,360,342},{ 24,153,159,342},{297, 30,378,129},{ 6, 30, 87,129},{123, 45,165,147},{219, 45,261,147},{168, 45,216,198},{ 0, 0, 0, 0},{174, 18,210, 30},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Masakari
|
||||||
@@ -65,7 +65,7 @@ float texuv2[65][11][4]={
|
|||||||
{{207,156,288,342},{ 51,156,132,342},{264, 30,327,123},{ 18, 30, 75,147},{ 90, 27,138,147},{207, 27,249,147},{138, 33,207,141},{ 0, 0, 0, 0},{159, 6,183, 18},{138,144,201,216},{ 0, 0, 0, 0}}, // M_Uziel
|
{{207,156,288,342},{ 51,156,132,342},{264, 30,327,123},{ 18, 30, 75,147},{ 90, 27,138,147},{207, 27,249,147},{138, 33,207,141},{ 0, 0, 0, 0},{159, 6,183, 18},{138,144,201,216},{ 0, 0, 0, 0}}, // M_Uziel
|
||||||
{{218,138,280,334},{ 20,138, 82,334},{270, 8,328,134},{ 10, 8, 70,114},{ 88, 66,130,156},{172, 66,210,156},{124,166,176,304},{ 0, 0, 0, 0},{130, 4,210, 52},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Victor - GhostHawk
|
{{218,138,280,334},{ 20,138, 82,334},{270, 8,328,134},{ 10, 8, 70,114},{ 88, 66,130,156},{172, 66,210,156},{124,166,176,304},{ 0, 0, 0, 0},{130, 4,210, 52},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Victor - GhostHawk
|
||||||
{{180,135,285,342},{ 60,135,165,342},{234, 84,291,132},{ 54, 84,111,132},{114, 27,150,126},{195, 27,231,126},{156, 21,189,135},{ 0, 0, 0, 0},{165, 3,180, 18},{297,129,378,168},{ 0, 0, 0, 0}}, // M_Vulture
|
{{180,135,285,342},{ 60,135,165,342},{234, 84,291,132},{ 54, 84,111,132},{114, 27,150,126},{195, 27,231,126},{156, 21,189,135},{ 0, 0, 0, 0},{165, 3,180, 18},{297,129,378,168},{ 0, 0, 0, 0}}, // M_Vulture
|
||||||
{{ 78,134,116,256},{142,134,180,256},{ 52, 46, 90,126},{168, 44,208,126},{146, 42,166,112},{ 90, 42,110,112},{110, 28,184,156},{ 0, 0, 0, 0},{118, 56,138, 64},{ 56, 4, 90, 48},{172, 24,202, 48}}, // M_Warhammer
|
{{177,189,267,378},{ 69,189,159,378},{240, 78,288,171},{ 48, 78, 96,171},{102, 39,165,141},{171, 39,234,141},{309, 60,375,177},{ 0, 0, 0, 0},{156, 24,180, 33},{243, 18,300, 72},{ 36, 18, 93, 72}}, // M_Warhammer
|
||||||
{{198,165,237,348},{102,165,141,348},{270, 42,309,150},{ 24, 45, 75,159},{ 93, 63,123,141},{216, 63,246,141},{138, 24,198,213},{ 0, 0, 0, 0},{216, 42,240, 48},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Wolfhound
|
{{198,165,237,348},{102,165,141,348},{270, 42,309,150},{ 24, 45, 75,159},{ 93, 63,123,141},{216, 63,246,141},{138, 24,198,213},{ 0, 0, 0, 0},{216, 42,240, 48},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Wolfhound
|
||||||
{{250,152,312,328},{ 26,152, 88,328},{186,234,228,294},{112,234,150,282},{ 20, 12, 96,116},{244, 12,318,116},{128, 12,210,190},{ 0, 0, 0, 0},{158,206,182,218},{ 0, 0, 0, 0},{ 0, 0, 0, 0}} // M_Zeus
|
{{250,152,312,328},{ 26,152, 88,328},{186,234,228,294},{112,234,150,282},{ 20, 12, 96,116},{244, 12,318,116},{128, 12,210,190},{ 0, 0, 0, 0},{158,206,182,218},{ 0, 0, 0, 0},{ 0, 0, 0, 0}} // M_Zeus
|
||||||
};
|
};
|
||||||
@@ -73,20 +73,20 @@ float texuv2[65][11][4]={
|
|||||||
// MSL ADD MECH
|
// MSL ADD MECH
|
||||||
// MFD
|
// MFD
|
||||||
int offset2[65][11][2]={
|
int offset2[65][11][2]={
|
||||||
{{ 0,148},{260,148},{ 6, 40},{260, 40},{212, 80},{100, 80},{146, 12},{ 0, 0},{162,236},{ 0, 0},{ 0, 0}}, // M_Annihilator
|
{{186,151},{ 96,151},{234, 19},{ 60, 19},{ 99, 34},{186, 34},{138, 43},{ 0, 0},{159, 55},{ 0, 0},{ 0, 0}}, // M_Annihilator
|
||||||
{{186,153},{ 99,153},{252,102},{ 51,102},{ 66, 21},{195, 21},{153, 33},{ 0, 0},{165, 51},{ 0, 0},{ 0, 0}}, // M_Archer
|
{{186,153},{ 99,153},{252,102},{ 51,102},{ 66, 21},{195, 21},{153, 33},{ 0, 0},{165, 51},{ 0, 0},{ 0, 0}}, // M_Archer
|
||||||
{{210,156},{ 50,156},{224, 92},{ 34, 92},{ 82, 68},{198, 68},{128, 40},{ 0, 0},{154, 46},{198, 14},{ 58, 14}}, // M_Arctic Wolf
|
{{210,156},{ 50,156},{224, 92},{ 34, 92},{ 82, 68},{198, 68},{128, 40},{ 0, 0},{154, 46},{198, 14},{ 58, 14}}, // M_Arctic Wolf
|
||||||
{{184,148},{ 86,148},{248, 62},{ 12, 62},{ 94, 56},{182, 56},{132, 62},{ 0, 0},{160, 70},{140,128},{122, 8}}, // M_Ares
|
{{184,148},{ 86,148},{248, 62},{ 12, 62},{ 94, 56},{182, 56},{132, 62},{ 0, 0},{160, 70},{140,128},{122, 8}}, // M_Ares
|
||||||
{{ 4,138},{216,138},{ 12, 14},{242, 14},{174,200},{140,200},{126, 14},{ 0, 0},{156,294},{ 0, 0},{ 0, 0}}, // M_Argus
|
{{172,130},{ 26,130},{222, 14},{ 26, 18},{110, 26},{188, 18},{134, 2},{ 0, 0},{150, 40},{ 0, 0},{ 0, 0}}, // M_Argus
|
||||||
{{ 6,148},{282,148},{ 6, 10},{266, 10},{206, 22},{ 98, 22},{144,180},{ 0, 0},{158,140},{148, 10},{ 0, 0}}, // M_Assassin2
|
{{190,126},{ 90,126},{220, 38},{ 68, 38},{114, 12},{178, 8},{148,118},{ 0, 0},{190, 24},{140, 20},{ 0, 0}}, // M_Assassin2
|
||||||
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{207,140}}, // M_Atlas
|
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{207,140}}, // M_Atlas
|
||||||
{{ 12,174},{198,174},{ 12, 42},{198, 42},{158, 42},{ 60, 42},{ 96, 42},{ 0, 0},{120,202},{116,238},{ 0, 0}}, // M_Avatar
|
{{180,135},{ 60,135},{234, 84},{ 54, 84},{114, 27},{195, 27},{156, 21},{ 0, 0},{165, 12},{132,129},{ 0, 0}}, // M_Avatar
|
||||||
{{186,151},{ 96,151},{234, 19},{ 60, 19},{ 99, 34},{186, 34},{138, 43},{ 0, 0},{159, 55},{ 0, 0},{ 0, 0}}, // M_Awesome
|
{{186,151},{ 96,151},{234, 19},{ 60, 19},{ 99, 34},{186, 34},{138, 43},{ 0, 0},{159, 55},{ 0, 0},{ 0, 0}}, // M_Awesome
|
||||||
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{207,140}}, // M_Battlemaster
|
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{207,140}}, // M_Battlemaster
|
||||||
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{ 0, 0}}, // M_BattlemasterIIc
|
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{ 0, 0}}, // M_BattlemasterIIc
|
||||||
{{ 6,172},{246,172},{ 6, 8},{281, 8},{226, 82},{ 72, 82},{138,172},{ 0, 0},{164,122},{142, 8},{ 0, 0}}, // M_Behemoth
|
{{186,142},{102,142},{234, 22},{ 27, 13},{117, 46},{192, 46},{153, 13},{ 0, 0},{162, 25},{ 24, 13},{ 0, 0}}, // M_Behemoth
|
||||||
{{ 6,172},{246,172},{ 6, 8},{281, 8},{226, 82},{ 72, 82},{138,172},{ 0, 0},{164,122},{142, 8},{ 0, 0}}, // M_Behemothii
|
{{186,142},{102,142},{234, 22},{ 27, 13},{117, 46},{192, 46},{153, 13},{ 0, 0},{162, 25},{ 24, 13},{ 0, 0}}, // M_Behemothii
|
||||||
{{ 8,128},{228,128},{ 8, 0},{252, 0},{188, 0},{ 0, 96},{160, 0},{ 0, 0},{164,146},{132,168},{176,168}}, // M_Black Hawk
|
{{174,147},{ 72,147},{240, 78},{ 48, 78},{102, 39},{171, 39},{135, 60},{ 0, 0},{156, 69},{216, 18},{ 63, 18}}, // M_Black Hawk
|
||||||
{{186,142},{102,142},{234, 22},{ 27, 13},{117, 46},{192, 46},{153, 13},{ 0, 0},{162, 25},{ 24, 13},{ 0, 0}}, // M_Black Knight
|
{{186,142},{102,142},{234, 22},{ 27, 13},{117, 46},{192, 46},{153, 13},{ 0, 0},{162, 25},{ 24, 13},{ 0, 0}}, // M_Black Knight
|
||||||
{{196,128},{ 68,128},{234, 30},{ 62, 20},{108, 18},{194, 18},{118, 8},{ 0, 0},{164, 24},{194, 44},{126, 44}}, // M_Black Lanner
|
{{196,128},{ 68,128},{234, 30},{ 62, 20},{108, 18},{194, 18},{118, 8},{ 0, 0},{164, 24},{194, 44},{126, 44}}, // M_Black Lanner
|
||||||
{{182,166},{ 98,166},{244, 80},{ 54, 80},{ 82, 8},{170, 40},{142, 16},{ 0, 0},{182, 42},{112,126},{200,124}}, // M_Brigand
|
{{182,166},{ 98,166},{244, 80},{ 54, 80},{ 82, 8},{170, 40},{142, 16},{ 0, 0},{182, 42},{112,126},{200,124}}, // M_Brigand
|
||||||
@@ -101,9 +101,9 @@ int offset2[65][11][2]={
|
|||||||
// {{190,180},{100,180},{230, 8},{ 66, 8},{102, 66},{194, 66},{110, 68},{ 0, 0},{156,100},{ 0, 0},{ 0, 0}}, // M_Dasher
|
// {{190,180},{100,180},{230, 8},{ 66, 8},{102, 66},{194, 66},{110, 68},{ 0, 0},{156,100},{ 0, 0},{ 0, 0}}, // M_Dasher
|
||||||
{{191,144},{ 76,144},{242, 60},{ 35, 60},{ 93, 58},{190, 58},{152, 62},{ 0, 0},{165, 77},{184, 7},{ 96, 7}}, // M_Deimos
|
{{191,144},{ 76,144},{242, 60},{ 35, 60},{ 93, 58},{190, 58},{152, 62},{ 0, 0},{165, 77},{184, 7},{ 96, 7}}, // M_Deimos
|
||||||
{{198,134},{ 99,134},{234, 65},{ 63, 59},{ 87, 20},{207, 20},{150, 29},{ 0, 0},{165, 44},{ 0, 0},{ 0, 0}}, // M_Dragon
|
{{198,134},{ 99,134},{234, 65},{ 63, 59},{ 87, 20},{207, 20},{150, 29},{ 0, 0},{165, 44},{ 0, 0},{ 0, 0}}, // M_Dragon
|
||||||
{{ 8,142},{256,142},{ 8, 2},{288, 2},{206, 14},{ 50, 14},{126,140},{ 0, 0},{162, 90},{ 0, 0},{ 0, 0}}, // M_Fafnir - Skippy
|
{{177,141},{ 77,141},{278, 10},{ 10, 10},{ 60, 2},{191, 2},{141, 3},{ 0, 0},{159, 83},{ 0, 0},{ 0, 0}}, // M_Fafnir - Skippy
|
||||||
{{ 8,120},{244,120},{ 24, 62},{306, 66},{218, 14},{ 66, 14},{134, 22},{ 0, 0},{146,210},{ 0, 0},{ 0, 0}}, // M_Flea - Skippy
|
{{198,112},{ 56,112},{230, 62},{104, 62},{100, 18},{186, 18},{144, 6},{ 0, 0},{154, 48},{ 0, 0},{ 0, 0}}, // M_Flea - Skippy
|
||||||
{{ 20,174},{232,174},{ 4, 52},{278, 52},{218, 32},{ 60, 32},{120, 4},{ 0, 0},{148, 58},{ 0, 0},{ 0, 0}}, // M_Gladiator - Skippy
|
{{182,166},{ 95,166},{221, 54},{ 72, 54},{107, 31},{194, 31},{128, 2},{ 0, 0},{156, 58},{ 0, 0},{ 0, 0}}, // M_Gladiator - Skippy
|
||||||
{{180,170},{ 86,170},{238, 44},{ 64, 44},{102, 38},{198, 34},{142, 22},{ 0, 0},{158, 90},{210, 10},{ 0, 0}}, // M_Grizzly
|
{{180,170},{ 86,170},{238, 44},{ 64, 44},{102, 38},{198, 34},{142, 22},{ 0, 0},{158, 90},{210, 10},{ 0, 0}}, // M_Grizzly
|
||||||
{{192,155},{ 69,155},{240, 56},{ 51, 56},{102, 59},{192, 53},{135, 29},{ 0, 0},{156, 53},{102, 20},{ 0, 0}}, // M_Hauptmann
|
{{192,155},{ 69,155},{240, 56},{ 51, 56},{102, 59},{192, 53},{135, 29},{ 0, 0},{156, 53},{102, 20},{ 0, 0}}, // M_Hauptmann
|
||||||
{{165,144},{ 69,144},{228, 90},{ 42, 90},{ 93, 42},{180, 42},{138, 66},{ 0, 0},{150,114},{ 0, 0},{ 0, 0}}, // M_Hellhound
|
{{165,144},{ 69,144},{228, 90},{ 42, 90},{ 93, 42},{180, 42},{138, 66},{ 0, 0},{150,114},{ 0, 0},{ 0, 0}}, // M_Hellhound
|
||||||
@@ -111,9 +111,9 @@ int offset2[65][11][2]={
|
|||||||
{{183,150},{ 96,150},{237, 75},{ 39, 72},{ 66, 33},{192, 33},{144, 12},{ 0, 0},{153, 27},{ 0, 0},{ 0, 0}}, // M_Highlander
|
{{183,150},{ 96,150},{237, 75},{ 39, 72},{ 66, 33},{192, 33},{144, 12},{ 0, 0},{153, 27},{ 0, 0},{ 0, 0}}, // M_Highlander
|
||||||
{{190,126},{ 90,126},{220, 38},{ 68, 38},{114, 12},{178, 8},{148,118},{ 0, 0},{190, 24},{140, 20},{154, 92}}, // M_HollnaderII
|
{{190,126},{ 90,126},{220, 38},{ 68, 38},{114, 12},{178, 8},{148,118},{ 0, 0},{190, 24},{140, 20},{154, 92}}, // M_HollnaderII
|
||||||
{{180,160},{ 93,160},{231, 55},{ 63, 55},{108, 91},{195, 22},{135, 22},{ 0, 0},{165, 34},{105, 22},{ 0, 0}}, // M_Hunchback
|
{{180,160},{ 93,160},{231, 55},{ 63, 55},{108, 91},{195, 22},{135, 22},{ 0, 0},{165, 34},{105, 22},{ 0, 0}}, // M_Hunchback
|
||||||
{{ 2,176},{264,176},{ 10, 60},{264, 62},{198, 22},{ 82, 22},{124,154},{ 0, 0},{160, 18},{ 0, 0},{ 0, 0}}, // M_Kodiak - GhostHawk
|
{{178,162},{ 84,162},{236, 52},{ 36, 52},{ 86, 22},{188, 22},{118, 62},{ 0, 0},{138, 2},{ 0, 0},{ 0, 0}}, // M_Kodiak - GhostHawk
|
||||||
{{192,151},{ 96,151},{231, 64},{ 60, 64},{114, 49},{195, 34},{150, 43},{ 0, 0},{162, 55},{108, 16},{ 0, 0}}, // M_Loki
|
{{192,151},{ 96,151},{231, 64},{ 60, 64},{114, 49},{195, 34},{150, 43},{ 0, 0},{162, 55},{108, 16},{ 0, 0}}, // M_Loki
|
||||||
{{ 4,152},{272,152},{ 6, 38},{248, 38},{192,152},{ 72,152},{134, 20},{ 0, 0},{154,146},{132,268},{ 0, 0}}, // M_Longbow - GhostHawk
|
{{186,128},{ 94,128},{166, 36},{ 0, 36},{ 76, 32},{198, 30},{142, 18},{ 0, 0},{164, 62},{134,122},{ 0, 0}}, // M_Longbow - GhostHawk
|
||||||
{{174,147},{ 72,147},{240, 78},{ 48, 78},{102, 39},{171, 39},{135, 60},{ 0, 0},{156, 69},{216, 18},{ 63, 18}}, // M_Madcat
|
{{174,147},{ 72,147},{240, 78},{ 48, 78},{102, 39},{171, 39},{135, 60},{ 0, 0},{156, 69},{216, 18},{ 63, 18}}, // M_Madcat
|
||||||
{{201,162},{ 48,162},{225,105},{ 57,105},{120, 48},{174, 48},{141, 81},{ 0, 0},{159, 93},{ 72, 15},{219, 15}}, // M_Madcat_MKII
|
{{201,162},{ 48,162},{225,105},{ 57,105},{120, 48},{174, 48},{141, 81},{ 0, 0},{159, 93},{ 72, 15},{219, 15}}, // M_Madcat_MKII
|
||||||
{{186,143},{ 21,143},{234, 77},{ 27, 77},{102, 35},{198, 35},{147, 35},{ 0, 0},{153, 86},{ 0, 0},{ 0, 0}}, // M_Masakari
|
{{186,143},{ 21,143},{234, 77},{ 27, 77},{102, 35},{198, 35},{147, 35},{ 0, 0},{153, 86},{ 0, 0},{ 0, 0}}, // M_Masakari
|
||||||
@@ -136,27 +136,27 @@ int offset2[65][11][2]={
|
|||||||
{{207,146},{ 51,146},{243, 59},{ 39, 59},{ 90, 17},{207, 17},{138, 23},{ 0, 0},{159, 95},{138,134},{ 0, 0}}, // M_Uziel
|
{{207,146},{ 51,146},{243, 59},{ 39, 59},{ 90, 17},{207, 17},{138, 23},{ 0, 0},{159, 95},{138,134},{ 0, 0}}, // M_Uziel
|
||||||
{{185,140},{ 98,140},{226, 34},{ 56, 34},{116, 52},{186, 52},{146, 52},{ 0, 0},{130, 4},{ 0, 0},{ 0, 0}}, // M_Victor - GhostHawk
|
{{185,140},{ 98,140},{226, 34},{ 56, 34},{116, 52},{186, 52},{146, 52},{ 0, 0},{130, 4},{ 0, 0},{ 0, 0}}, // M_Victor - GhostHawk
|
||||||
{{180,135},{ 60,135},{234, 84},{ 54, 84},{114, 27},{195, 27},{156, 21},{ 0, 0},{165, 12},{132,129},{ 0, 0}}, // M_Vulture
|
{{180,135},{ 60,135},{234, 84},{ 54, 84},{114, 27},{195, 27},{156, 21},{ 0, 0},{165, 12},{132,129},{ 0, 0}}, // M_Vulture
|
||||||
{{ 8,210},{238,210},{ 6, 46},{238, 46},{186, 42},{ 58, 42},{ 92, 28},{ 0, 0},{134,226},{ 76,220},{178,222}}, // M_Warhammer
|
{{174,147},{ 72,147},{240, 78},{ 48, 78},{102, 39},{171, 39},{135, 60},{ 0, 0},{156, 69},{216, 18},{ 63, 18}}, // M_Warhammer
|
||||||
{{198,155},{102,155},{219, 32},{ 69, 35},{123, 53},{186, 53},{138, 14},{ 0, 0},{156, 32},{ 0, 0},{ 0, 0}}, // M_Wolfhound
|
{{198,155},{102,155},{219, 32},{ 69, 35},{123, 53},{186, 53},{138, 14},{ 0, 0},{156, 32},{ 0, 0},{ 0, 0}}, // M_Wolfhound
|
||||||
{{180,152},{ 96,152},{226,104},{ 72,104},{ 70, 32},{194, 32},{128, 12},{ 0, 0},{158, 56},{ 0, 0},{ 0, 0}} // M_Zeus
|
{{180,152},{ 96,152},{226,104},{ 72,104},{ 70, 32},{194, 32},{128, 12},{ 0, 0},{158, 56},{ 0, 0},{ 0, 0}} // M_Zeus
|
||||||
};
|
};
|
||||||
// LL RL LA RA RT LT CT CTR HD S1 S2
|
// LL RL LA RA RT LT CT CTR HD S1 S2
|
||||||
// 5.03 Secondary Damage Display
|
// 5.03 Secondary Damage Display
|
||||||
float texuv3[65][11][4]={
|
float texuv3[65][11][4]={
|
||||||
{{ 34,186,134,416},{164,186,264,416},{ 4, 78,100, 96},{198, 78,296,196},{158, 66,198,240},{100, 68,140,242},{120, 2,176,242},{ 0, 0, 0, 0},{138, 26,160, 36},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Annihilator
|
{{332,280,400,502},{ 94,280,164,504},{422, 14,500,214},{ 14, 12, 76,194},{ 96, 40,166,184},{332, 40,406,184},{206, 48,282,252},{ 0, 0, 0, 0},{236,300,254,310},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Annihilator
|
||||||
{{404,268,484,496},{ 22,268,102,496},{426,114,484,208},{ 22,116, 82,208},{ 92, 20,224,192},{292, 22,424,192},{230, 44,286,252},{ 0, 0, 0, 0},{240,308,276,348},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Archer
|
{{404,268,484,496},{ 22,268,102,496},{426,114,484,208},{ 22,116, 82,208},{ 92, 20,224,192},{292, 22,424,192},{230, 44,286,252},{ 0, 0, 0, 0},{240,308,276,348},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Archer
|
||||||
{{356,260,456,490},{ 30,260,132,488},{354,188,454,252},{ 32,188,132,252},{ 62,104,138,180},{358, 94,434,180},{200, 90,308,300},{ 0, 0, 0, 0},{234, 36,262, 56},{360, 8,464, 80},{ 32, 8,136, 80}}, // M_Arctic Wolf
|
{{356,260,456,490},{ 30,260,132,488},{354,188,454,252},{ 32,188,132,252},{ 62,104,138,180},{358, 94,434,180},{200, 90,308,300},{ 0, 0, 0, 0},{234, 36,262, 56},{360, 8,464, 80},{ 32, 8,136, 80}}, // M_Arctic Wolf
|
||||||
{{402,240,486,472},{ 34,240,118,472},{396,108,502,170},{ 6,108,112,170},{130,100,206,200},{312,100,388,200},{220,106,308,260},{ 0, 0, 0, 0},{250,364,278,378},{230,304,298,344},{206, 14,322, 82}}, // M_Ares
|
{{402,240,486,472},{ 34,240,118,472},{396,108,502,170},{ 6,108,112,170},{130,100,206,200},{312,100,388,200},{220,106,308,260},{ 0, 0, 0, 0},{250,364,278,378},{230,304,298,344},{206, 14,322, 82}}, // M_Ares
|
||||||
{{300,200,448,448},{ 20,200,170,448},{380, 20,490,146},{ 20, 20,124,116},{140, 20,166,100},{300, 20,342,110},{180, 20,292,242},{ 0, 0, 0, 0},{250,300,276,306},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Argus - Skippy
|
{{300,200,448,448},{ 20,200,170,448},{380, 20,490,146},{ 20, 20,124,116},{140, 20,166,100},{300, 20,342,110},{180, 20,292,242},{ 0, 0, 0, 0},{250,300,276,306},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Argus - Skippy
|
||||||
{{114,170,178,406},{232,170,294,406},{ 60, 48,144,184},{264, 48,348,184},{218, 18,268,140},{142, 18,190,140},{174, 36,234,140},{ 0, 0, 0, 0},{192, 78,218, 98},{178, 2,230, 48},{ 0, 0, 0, 0}}, // M_Assassin2
|
{{402,240,474,484},{ 24,240, 98,484},{394, 50,462,156},{ 28, 50,100,156},{186, 18,316,146},{334, 14,386, 98},{218,214,292,288},{ 0, 0, 0, 0},{348,132,366,146},{126, 30,160, 92},{ 0, 0, 0, 0}}, // M_Assassin2
|
||||||
{{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{436,218,464,282}}, // M_Atlas
|
{{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{436,218,464,282}}, // M_Atlas
|
||||||
{{ 98,174,164,400},{222,174,288,400},{ 62, 64,118,136},{266, 64,348,138},{220, 44,268,168},{118, 44,166,168},{152, 10,232,220},{ 0, 0, 0, 0},{184, 24,202, 40},{178,124,208,154},{ 0, 0, 0, 0}}, // M_Avatar
|
{{356,274,494,504},{ 12,274,152,502},{446, 98,494,164},{ 12, 98, 60,164},{100, 24,174,162},{344, 24,416,162},{218, 4,310,222},{ 0, 0, 0, 0},{252,286,276,296},{220,358,306,396},{ 0, 0, 0, 0}}, // M_Avatar
|
||||||
{{332,280,400,502},{ 94,280,164,504},{422, 14,500,214},{ 14, 12, 76,194},{ 96, 40,166,184},{332, 40,406,184},{206, 48,282,252},{ 0, 0, 0, 0},{236,300,254,310},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Awesome
|
{{332,280,400,502},{ 94,280,164,504},{422, 14,500,214},{ 14, 12, 76,194},{ 96, 40,166,184},{332, 40,406,184},{206, 48,282,252},{ 0, 0, 0, 0},{236,300,254,310},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Awesome
|
||||||
{{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{436,218,464,282}}, // M_Battlemaster
|
{{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{436,218,464,282}}, // M_Battlemaster
|
||||||
{{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{ 0, 0, 0, 0}}, // M_BattlemasterIIc
|
{{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{ 0, 0, 0, 0}}, // M_BattlemasterIIc
|
||||||
{{ 84,206,184,374},{222,206,322,374},{ 2,124,150,210},{260,124,404,210},{214, 94,278,210},{130, 94,194,210},{166,110,242,274},{ 0, 0, 0, 0},{198,144,210,158},{170, 36,236,112},{ 0, 0, 0, 0}}, // M_Behemoth
|
{{400,258,472,478},{ 42,258,112,478},{372, 58,456,204},{ 72, 96,128,212},{150,100,190,188},{314,100,354,188},{208, 54,296,252},{ 0, 0, 0, 0},{234, 12,270, 24},{234,282,298,452},{ 0, 0, 0, 0}}, // M_Behemoth
|
||||||
{{ 84,206,184,374},{222,206,322,374},{ 2,124,150,210},{260,124,404,210},{214, 94,278,210},{130, 94,194,210},{166,110,242,274},{ 0, 0, 0, 0},{198,144,210,158},{170, 36,236,112},{ 0, 0, 0, 0}}, // M_Behemothii
|
{{400,258,472,478},{ 42,258,112,478},{372, 58,456,204},{ 72, 96,128,212},{150,100,190,188},{314,100,354,188},{208, 54,296,252},{ 0, 0, 0, 0},{234, 12,270, 24},{234,282,298,452},{ 0, 0, 0, 0}}, // M_Behemothii
|
||||||
{{ 40,118,178,390},{238,118,376,390},{ 8, 28,114,182},{296, 28,404,180},{220, 38,497,182},{114, 38,192,182},{188, 22,222,184},{ 0, 0, 0, 0},{192, 58,218, 78},{134,156,178,190},{230,156,272,190}}, // M_Black Hawk
|
{{368,252,490,494},{ 16,252,138,494},{416, 96,490,214},{ 6, 96, 82,214},{112, 52,194,182},{314, 52,396,182},{202, 80,304,226},{ 0, 0, 0, 0},{238,276,268,286},{416, 22,498, 90},{ 8, 22, 90, 90}}, // M_Black Hawk
|
||||||
{{400,258,472,478},{ 42,258,112,478},{372, 58,456,204},{ 72, 96,128,212},{150,100,190,188},{314,100,354,188},{208, 54,296,252},{ 0, 0, 0, 0},{234, 12,270, 24},{234,282,298,452},{ 0, 0, 0, 0}}, // M_Black Knight
|
{{400,258,472,478},{ 42,258,112,478},{372, 58,456,204},{ 72, 96,128,212},{150,100,190,188},{314,100,354,188},{208, 54,296,252},{ 0, 0, 0, 0},{234, 12,270, 24},{234,282,298,452},{ 0, 0, 0, 0}}, // M_Black Knight
|
||||||
{{376,226,472,482},{ 24,226,118,482},{412, 48,468,142},{ 36, 36, 92,128},{110, 34,162,104},{332, 32,386,104},{184, 24,312,202},{ 0, 0, 0, 0},{238,250,258,270},{330,126,364,196},{132,126,166,196}}, // M_Black Lanner
|
{{376,226,472,482},{ 24,226,118,482},{412, 48,468,142},{ 36, 36, 92,128},{110, 34,162,104},{332, 32,386,104},{184, 24,312,202},{ 0, 0, 0, 0},{238,250,258,270},{330,126,364,196},{132,126,166,196}}, // M_Black Lanner
|
||||||
{{390,264,464,474},{ 48,264,122,474},{444, 90,496,188},{ 24, 92, 78,188},{ 90, 12,196,200},{324, 50,430,200},{218, 22,312,240},{ 0, 0, 0, 0},{248,312,272,334},{166,228,200,278},{320,228,354,278}}, // M_Brigand
|
{{390,264,464,474},{ 48,264,122,474},{444, 90,496,188},{ 24, 92, 78,188},{ 90, 12,196,200},{324, 50,430,200},{218, 22,312,240},{ 0, 0, 0, 0},{248,312,272,334},{166,228,200,278},{320,228,354,278}}, // M_Brigand
|
||||||
@@ -177,7 +177,7 @@ float texuv3[65][11][4]={
|
|||||||
{{378,276,468,482},{ 44,276,134,482},{398, 86,442,248},{ 68, 86,118,238},{140, 78,196,202},{316, 74,372,204},{222, 60,290,270},{ 0, 0, 0, 0},{232,306,282,340},{332, 26,368, 56},{ 0, 0, 0, 0}}, // M_Grizzly
|
{{378,276,468,482},{ 44,276,134,482},{398, 86,442,248},{ 68, 86,118,238},{140, 78,196,202},{316, 74,372,204},{222, 60,290,270},{ 0, 0, 0, 0},{232,306,282,340},{332, 26,368, 56},{ 0, 0, 0, 0}}, // M_Grizzly
|
||||||
{{378,266,472,496},{ 28,266,122,496},{432, 46,492,190},{ 18, 46, 80,192},{118, 42,174,154},{340, 42,394,154},{196, 14,316,238},{ 0, 0, 0, 0},{234,306,278,328},{172,294,222,342},{ 0, 0, 0, 0}}, // M_Hauptmann
|
{{378,266,472,496},{ 28,266,122,496},{432, 46,492,190},{ 18, 46, 80,192},{118, 42,174,154},{340, 42,394,154},{196, 14,316,238},{ 0, 0, 0, 0},{234,306,278,328},{172,294,222,342},{ 0, 0, 0, 0}}, // M_Hauptmann
|
||||||
{{372,242,494,494},{ 14,242,136,494},{418, 78,482,150},{ 14, 78, 78,150},{108, 6,184,148},{322, 6,398,148},{220, 44,288,208},{ 0, 0, 0, 0},{238,292,268,320},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Hellhound
|
{{372,242,494,494},{ 14,242,136,494},{418, 78,482,150},{ 14, 78, 78,150},{108, 6,184,148},{322, 6,398,148},{220, 44,288,208},{ 0, 0, 0, 0},{238,292,268,320},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Hellhound
|
||||||
{{116,182,180,408},{232,182,294,408},{ 70, 98,138,202},{272, 98,342,202},{202, 96,274,166},{142, 80,204, 96},{136, 96,240,228},{ 0, 0, 0, 0},{156, 84,190, 92},{160, 2,222, 98},{ 78, 42,142,108}}, // M_Hellspawn - Skippy
|
{{400,260,462,482},{ 20,260, 82,482},{260, 20,324,118},{ 20,120, 88,218},{100,260,332,352},{280,260,348,342},{180,260,252,312},{ 0, 0, 0, 0},{120, 20,162, 28},{ 20, 20, 82, 80},{180, 20,232,108}}, // M_Hellspawn - Skippy
|
||||||
{{358,262,432,494},{ 62,262,136,494},{412, 74,488,170},{ 10, 74, 82,182},{ 90, 28,188,150},{296, 28,394,150},{206, 4,278,226},{ 0, 0, 0, 0},{228,320,260,330},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Highlander
|
{{358,262,432,494},{ 62,262,136,494},{412, 74,488,170},{ 10, 74, 82,182},{ 90, 28,188,150},{296, 28,394,150},{206, 4,278,226},{ 0, 0, 0, 0},{228,320,260,330},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Highlander
|
||||||
{{402,240,474,484},{ 24,240, 98,484},{394, 50,462,156},{ 28, 50,100,156},{186, 18,316,146},{334, 14,386, 98},{218,214,292,288},{ 0, 0, 0, 0},{348,132,366,146},{126, 30,160, 92},{232,162,278,192}}, // M_HollanderII
|
{{402,240,474,484},{ 24,240, 98,484},{394, 50,462,156},{ 28, 50,100,156},{186, 18,316,146},{334, 14,386, 98},{218,214,292,288},{ 0, 0, 0, 0},{348,132,366,146},{126, 30,160, 92},{232,162,278,192}}, // M_HollanderII
|
||||||
{{400,262,482,486},{ 16,262, 98,486},{396, 86,450,210},{ 60, 86,116,210},{138, 70,186,218},{322, 46,372,218},{214, 46,294,266},{ 0, 0, 0, 0},{240, 14,268, 34},{230,296,282,354},{ 0, 0, 0, 0}}, // M_Hunchback
|
{{400,262,482,486},{ 16,262, 98,486},{396, 86,450,210},{ 60, 86,116,210},{138, 70,186,218},{322, 46,372,218},{214, 46,294,266},{ 0, 0, 0, 0},{240, 14,268, 34},{230,296,282,354},{ 0, 0, 0, 0}}, // M_Hunchback
|
||||||
@@ -206,26 +206,26 @@ float texuv3[65][11][4]={
|
|||||||
{{400,292,498,498},{ 10,292,108,498},{378, 20,496, 98},{ 12, 20,130,100},{126,158,192,300},{314,158,380,300},{206,168,302,376},{ 0, 0, 0, 0},{234,108,272,122},{230, 32,276, 78},{ 22,136, 50,166}}, // M_Uziel
|
{{400,292,498,498},{ 10,292,108,498},{378, 20,496, 98},{ 12, 20,130,100},{126,158,192,300},{314,158,380,300},{206,168,302,376},{ 0, 0, 0, 0},{234,108,272,122},{230, 32,276, 78},{ 22,136, 50,166}}, // M_Uziel
|
||||||
{{350,256,425,472},{ 76,236,150,472},{410, 46,484,200},{ 30, 46,104,174},{146, 82,198,192},{310, 82,362,192},{220,218,284,384},{ 0, 0, 0, 0},{206, 6,304, 64},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Victor - GhostHawk
|
{{350,256,425,472},{ 76,236,150,472},{410, 46,484,200},{ 30, 46,104,174},{146, 82,198,192},{310, 82,362,192},{220,218,284,384},{ 0, 0, 0, 0},{206, 6,304, 64},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Victor - GhostHawk
|
||||||
{{356,274,494,504},{ 12,274,152,502},{446, 98,494,164},{ 12, 98, 60,164},{100, 24,174,162},{344, 24,416,162},{218, 4,310,222},{ 0, 0, 0, 0},{252,286,276,296},{220,358,306,396},{ 0, 0, 0, 0}}, // M_Vulture
|
{{356,274,494,504},{ 12,274,152,502},{446, 98,494,164},{ 12, 98, 60,164},{100, 24,174,162},{344, 24,416,162},{218, 4,310,222},{ 0, 0, 0, 0},{252,286,276,296},{220,358,306,396},{ 0, 0, 0, 0}}, // M_Vulture
|
||||||
{{126,214,186,408},{228,214,286,408},{ 84, 72,146,202},{268, 72,332,204},{234, 68,270,182},{144, 68,180,178},{148, 46,264,246},{ 0, 0, 0, 0},{190, 90,226,106},{ 92, 8,146, 78},{276, 38,322, 80}}, // M_Warhammer
|
{{368,252,490,494},{ 16,252,138,494},{416, 96,490,214},{ 6, 96, 82,214},{112, 52,194,182},{314, 52,396,182},{202, 80,304,226},{ 0, 0, 0, 0},{238,276,268,286},{416, 22,498, 90},{ 8, 22, 90, 90}}, // M_Warhammer
|
||||||
{{326,262,368,486},{142,262,182,486},{380, 72,438,196},{ 72, 72,138,208},{166, 96,200,218},{320, 96,352,216},{214, 48,304,278},{ 0, 0, 0, 0},{240, 10,278, 30},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Wolfhound
|
{{326,262,368,486},{142,262,182,486},{380, 72,438,196},{ 72, 72,138,208},{166, 96,200,218},{320, 96,352,216},{214, 48,304,278},{ 0, 0, 0, 0},{240, 10,278, 30},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Wolfhound
|
||||||
{{400,262,476,484},{ 34,262,110,484},{284,306,338,378},{182,302,230,362},{ 72, 34,170,166},{340, 34,440,166},{204, 6,306,230},{ 0, 0, 0, 0},{240,250,270,270},{ 0, 0, 0, 0},{ 0, 0, 0, 0}} // M_Zeus
|
{{400,262,476,484},{ 34,262,110,484},{284,306,338,378},{182,302,230,362},{ 72, 34,170,166},{340, 34,440,166},{204, 6,306,230},{ 0, 0, 0, 0},{240,250,270,270},{ 0, 0, 0, 0},{ 0, 0, 0, 0}} // M_Zeus
|
||||||
};
|
};
|
||||||
// LL RL LA RA RT LT CT CTR HD S1 S2
|
// LL RL LA RA RT LT CT CTR HD S1 S2
|
||||||
int offset3[65][11][2]={
|
int offset3[65][11][2]={
|
||||||
{{ 8,270},{398,270},{ 30, 24},{400, 28},{322,120},{146,118},{226, 54},{ 0, 0},{244,338},{ 0, 0},{ 0, 0}}, // M_Annihilator
|
{{210,184},{102,182},{274, 4},{ 42, 2},{102, 30},{208, 30},{152, 38},{ 0, 0},{182, 68},{ 0, 0},{ 0, 0}}, // M_Annihilator
|
||||||
{{224,178},{112,178},{306,114},{ 52,116},{ 62, 0},{222, 2},{180, 24},{ 0, 0},{190, 38},{ 0, 0},{ 0, 0}}, // M_Archer
|
{{224,178},{112,178},{306,114},{ 52,116},{ 62, 0},{222, 2},{180, 24},{ 0, 0},{190, 38},{ 0, 0},{ 0, 0}}, // M_Archer
|
||||||
{{256,182},{ 50,182},{274,100},{ 32,100},{ 92, 66},{238, 66},{150, 32},{ 0, 0},{184, 38},{240, 0},{ 62, 0}}, // M_Arctic Wolf
|
{{256,182},{ 50,182},{274,100},{ 32,100},{ 92, 66},{238, 66},{150, 32},{ 0, 0},{184, 38},{240, 0},{ 62, 0}}, // M_Arctic Wolf
|
||||||
{{222,170},{104,170},{296, 68},{ 6, 70},{110, 60},{222, 60},{160, 66},{ 0, 0},{190, 74},{170,144},{146, 4}}, // M_Ares
|
{{222,170},{104,170},{296, 68},{ 6, 70},{110, 60},{222, 60},{160, 66},{ 0, 0},{190, 74},{170,144},{146, 4}}, // M_Ares
|
||||||
{{208,158},{ 32,158},{268, 18}, {32, 24},{136, 32},{226, 22},{140, 4},{ 0, 0},{182, 48},{ 0, 0},{ 0, 0}}, // M_Argus - Skippy
|
{{208,158},{ 32,158},{268, 18}, {32, 24},{136, 32},{226, 22},{140, 4},{ 0, 0},{182, 48},{ 0, 0},{ 0, 0}}, // M_Argus - Skippy
|
||||||
{{ 8,220},{336,220},{ 8, 48},{314, 48},{244, 48},{120, 48},{178,206},{ 0, 0},{192, 78},{178, 3},{ 0, 0}}, // M_Assassin2
|
{{232,150},{104,150},{264, 40},{ 78, 40},{136, 8},{214, 4},{168,134},{ 0, 0},{228, 22},{166, 20},{ 0, 0}}, // M_Assassin2
|
||||||
{{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{256,162}}, // M_Atlas
|
{{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{256,162}}, // M_Atlas
|
||||||
{{ 50,258},{384,258},{ 24, 38},{408, 38},{324, 38},{104, 38},{198, 38},{ 0, 0},{230,356},{224,302},{ 0, 0}}, // M_Avatar
|
{{236,174},{ 32,174},{296, 98},{ 62, 98},{110, 24},{224, 24},{158, 4},{ 0, 0},{192, 6},{160,138},{ 0, 0}}, // M_Avatar
|
||||||
{{210,184},{102,182},{274, 4},{ 42, 2},{102, 30},{208, 30},{152, 38},{ 0, 0},{182, 68},{ 0, 0},{ 0, 0}}, // M_Awesome
|
{{210,184},{102,182},{274, 4},{ 42, 2},{102, 30},{208, 30},{152, 38},{ 0, 0},{182, 68},{ 0, 0},{ 0, 0}}, // M_Awesome
|
||||||
{{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{256,162}}, // M_Battlemaster
|
{{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{256,162}}, // M_Battlemaster
|
||||||
{{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{ 0, 0}}, // M_BattlemasterIIc
|
{{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{ 0, 0}}, // M_BattlemasterIIc
|
||||||
{{ 8,236},{348,236},{ 8, 26},{302, 26},{294,130},{108,130},{202,242},{ 0, 0},{230,174},{202, 28},{ 0, 0}}, // M_Behemoth
|
{{220,188},{132,188},{282, 38},{ 82, 76},{130, 80},{254, 80},{168, 34},{ 0, 0},{194, 52},{ 44, 2},{ 0, 0}}, // M_Behemoth
|
||||||
{{ 8,236},{348,236},{ 8, 26},{302, 26},{294,130},{108,130},{202,242},{ 0, 0},{230,174},{202, 28},{ 0, 0}}, // M_Behemothii
|
{{220,188},{132,188},{282, 38},{ 82, 76},{130, 80},{254, 80},{168, 34},{ 0, 0},{194, 52},{ 44, 2},{ 0, 0}}, // M_Behemothii
|
||||||
{{ 8,228},{362,228},{ 8, 28},{392, 30},{ 85, 56},{136, 56},{234, 28},{ 0, 0},{242,250},{170,250},{296,250}}, // M_Black Hawk
|
{{208,162},{ 76,162},{286, 76},{ 46, 76},{122, 32},{204, 32},{152, 60},{ 0, 0},{188, 66},{256, 2},{ 68, 2}}, // M_Black Hawk
|
||||||
{{220,188},{132,188},{282, 38},{ 82, 76},{130, 80},{254, 80},{168, 34},{ 0, 0},{194, 52},{ 44, 2},{ 0, 0}}, // M_Black Knight
|
{{220,188},{132,188},{282, 38},{ 82, 76},{130, 80},{254, 80},{168, 34},{ 0, 0},{194, 52},{ 44, 2},{ 0, 0}}, // M_Black Knight
|
||||||
{{236,146},{ 84,146},{282, 28},{ 76, 16},{130, 14},{232, 12},{144, 4},{ 0, 0},{198, 20},{230, 46},{152, 46}}, // M_Black Lanner
|
{{236,146},{ 84,146},{282, 28},{ 76, 16},{130, 14},{232, 12},{144, 4},{ 0, 0},{198, 20},{230, 46},{152, 46}}, // M_Black Lanner
|
||||||
{{220,194},{118,194},{294, 80},{ 64, 82},{100, 2},{204, 40},{168, 12},{ 0, 0},{218, 42},{136,138},{240,138}}, // M_Brigand
|
{{220,194},{118,194},{294, 80},{ 64, 82},{100, 2},{204, 40},{168, 12},{ 0, 0},{218, 42},{136,138},{240,138}}, // M_Brigand
|
||||||
@@ -246,7 +246,7 @@ int offset3[65][11][2]={
|
|||||||
{{218,196},{104,196},{288, 46},{ 78, 46},{120, 38},{236, 34},{172, 20},{ 0, 0},{182, 86},{252, 6},{ 0, 0}}, // M_Grizzly
|
{{218,196},{104,196},{288, 46},{ 78, 46},{120, 38},{236, 34},{172, 20},{ 0, 0},{182, 86},{252, 6},{ 0, 0}}, // M_Grizzly
|
||||||
{{238,176},{ 78,176},{302, 46},{ 48, 46},{108, 42},{250, 42},{146, 14},{ 0, 0},{184, 36},{122, 4},{ 0, 0}}, // M_Hauptmann
|
{{238,176},{ 78,176},{302, 46},{ 48, 46},{108, 42},{250, 42},{146, 14},{ 0, 0},{184, 36},{122, 4},{ 0, 0}}, // M_Hauptmann
|
||||||
{{212,152},{ 74,152},{308, 78},{ 34, 78},{ 98, 6},{232, 6},{170, 44},{ 0, 0},{188,102},{ 0, 0},{ 0, 0}}, // M_Hellhound
|
{{212,152},{ 74,152},{308, 78},{ 34, 78},{ 98, 6},{232, 6},{170, 44},{ 0, 0},{188,102},{ 0, 0},{ 0, 0}}, // M_Hellhound
|
||||||
{{ 10,226},{282,226},{ 10, 98},{334, 96},{236, 96},{140, 66},{104, 98},{ 0, 0},{152, 50},{106,294},{ 12, 18}}, // M_Hellspawn - Skippy
|
{{238,184},{122,184},{280,103},{ 76,103},{143, 78},{212, 82},{175,165},{ 0, 0},{158, 85},{ 85, 42},{167, 5}}, // M_Hellspawn - Skippy
|
||||||
{{218,172},{112,172},{282, 74},{ 50, 74},{ 80, 28},{226, 28},{166, 4},{ 0, 0},{188, 30},{ 0, 0},{ 0, 0}}, // M_Highlander
|
{{218,172},{112,172},{282, 74},{ 50, 74},{ 80, 28},{226, 28},{166, 4},{ 0, 0},{188, 30},{ 0, 0},{ 0, 0}}, // M_Highlander
|
||||||
{{232,150},{104,150},{264, 40},{ 78, 40},{136, 8},{214, 4},{168,134},{ 0, 0},{228, 22},{166, 20},{182,102}}, // M_HollanderII
|
{{232,150},{104,150},{264, 40},{ 78, 40},{136, 8},{214, 4},{168,134},{ 0, 0},{228, 22},{166, 20},{182,102}}, // M_HollanderII
|
||||||
{{220,182},{106,182},{286, 46},{ 70, 46},{118, 30},{242, 6},{164, 6},{ 0, 0},{190, 24},{130, 6},{ 0, 0}}, // M_Hunchback
|
{{220,182},{106,182},{286, 46},{ 70, 46},{118, 30},{242, 6},{164, 6},{ 0, 0},{190, 24},{130, 6},{ 0, 0}}, // M_Hunchback
|
||||||
@@ -275,7 +275,7 @@ int offset3[65][11][2]={
|
|||||||
{{240,172},{ 70,172},{288, 70},{ 2, 70},{106, 28},{234, 28},{156, 38},{ 0, 0},{184,128},{180, 42},{ 12,146}}, // M_Uziel
|
{{240,172},{ 70,172},{288, 70},{ 2, 70},{106, 28},{234, 28},{156, 38},{ 0, 0},{184,128},{180, 42},{ 12,146}}, // M_Uziel
|
||||||
{{220,170},{118,170},{270, 40},{ 68, 40},{140, 62},{220, 62},{176, 62},{ 0, 0},{158, 4},{ 0, 0},{ 0, 0}}, // M_Victor - GhostHawk
|
{{220,170},{118,170},{270, 40},{ 68, 40},{140, 62},{220, 62},{176, 62},{ 0, 0},{158, 4},{ 0, 0},{ 0, 0}}, // M_Victor - GhostHawk
|
||||||
{{236,174},{ 32,174},{296, 98},{ 62, 98},{110, 24},{224, 24},{158, 4},{ 0, 0},{192, 6},{160,138},{ 0, 0}}, // M_Vulture
|
{{236,174},{ 32,174},{296, 98},{ 62, 98},{110, 24},{224, 24},{158, 4},{ 0, 0},{192, 6},{160,138},{ 0, 0}}, // M_Vulture
|
||||||
{{ 14,310},{290,310},{ 14, 16},{306, 16},{290,172},{ 90,160},{148, 46},{ 0, 0},{188,284},{108,352},{206,366}}, // M_Warhammer
|
{{208,162},{ 76,162},{286, 76},{ 46, 76},{122, 32},{204, 32},{152, 60},{ 0, 0},{188, 66},{256, 2},{ 68, 2}}, // M_Warhammer
|
||||||
{{254,182},{140,182},{258, 32},{110, 32},{164, 56},{238, 56},{172, 8},{ 0, 0},{198, 30},{ 0, 0},{ 0, 0}}, // M_Wolfhound
|
{{254,182},{140,182},{258, 32},{110, 32},{164, 56},{238, 56},{172, 8},{ 0, 0},{198, 30},{ 0, 0},{ 0, 0}}, // M_Wolfhound
|
||||||
{{220,182},{114,182},{274,126},{ 82,122},{ 82, 34},{230, 34},{154, 6},{ 0, 0},{190, 60},{ 0, 0},{ 0, 0}} // M_Zeus
|
{{220,182},{114,182},{274,126},{ 82,122},{ 82, 34},{230, 34},{154, 6},{ 0, 0},{190, 60},{ 0, 0},{ 0, 0}} // M_Zeus
|
||||||
};
|
};
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
//D3DCOLOR_XXXX macros are defined in d3d8types.h and will not be redefined here.
|
//D3DCOLOR_XXXX정위한다.(d3d8types.h에 정의되어 있으므로. 정의되어있지 않을것이다.
|
||||||
#ifndef D3DCOLOR_ARGB
|
#ifndef D3DCOLOR_ARGB
|
||||||
|
|
||||||
#define D3DCOLOR_ARGB(a,r,g,b) (D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
|
#define D3DCOLOR_ARGB(a,r,g,b) (D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
|
||||||
@@ -44,10 +44,10 @@ enum AUX1STATE
|
|||||||
#define AUX1_TEAM_MESSAGE 2
|
#define AUX1_TEAM_MESSAGE 2
|
||||||
#define AUX1_FREE_MESSAGE 3
|
#define AUX1_FREE_MESSAGE 3
|
||||||
|
|
||||||
//Create one instance per device per font type (typeface, size, bold, italic).
|
//각 디바이스마다.., 각 폰트 종류(typeface,크기,굴기,기울기)가 달라질때 마다 하나씩 생성시켜 사용하면 된다.
|
||||||
class CHSHFont
|
class CHSHFont
|
||||||
{
|
{
|
||||||
//Used temporarily; no need per instance, so declared static.
|
//일시적으로 사용되고.. 각 instance마다 사용되어질 필요가 없으므로 static으로 하였다.
|
||||||
static D3DTLVERTEX m_pVB[300];
|
static D3DTLVERTEX m_pVB[300];
|
||||||
|
|
||||||
LPDIRECT3DDEVICE7 m_pd3dDevice;
|
LPDIRECT3DDEVICE7 m_pd3dDevice;
|
||||||
@@ -59,7 +59,7 @@ class CHSHFont
|
|||||||
DWORD m_dwSavedStateBlock;
|
DWORD m_dwSavedStateBlock;
|
||||||
DWORD m_dwDrawTextStateBlock;
|
DWORD m_dwDrawTextStateBlock;
|
||||||
|
|
||||||
DWORD m_dwMaxWidth;//Width of the widest single character..
|
DWORD m_dwMaxWidth;//문자 하나중 가장 큰것..
|
||||||
public:
|
public:
|
||||||
CHSHFont();
|
CHSHFont();
|
||||||
~CHSHFont();
|
~CHSHFont();
|
||||||
@@ -80,16 +80,15 @@ public:
|
|||||||
CHSH_Device* m_pOtherHSHD;
|
CHSH_Device* m_pOtherHSHD;
|
||||||
public:
|
public:
|
||||||
LPDIRECTDRAW7 pDD;
|
LPDIRECTDRAW7 pDD;
|
||||||
LPDIRECTDRAWSURFACE7 pDDSFront; //Required for Flip..
|
LPDIRECTDRAWSURFACE7 pDDSFront; //Flip을 하기위해서 필요..
|
||||||
LPDIRECTDRAWSURFACE7 pDDSBack; //Required for Drawing.
|
LPDIRECTDRAWSURFACE7 pDDSBack; //Drawing하기 위해서 필요.
|
||||||
LPDIRECTDRAWSURFACE7 pDDSTarget; //The actual rendering texture.
|
LPDIRECTDRAWSURFACE7 pDDSTarget; //실제 그리는 텍스쳐 이다.
|
||||||
LPDIRECTDRAWSURFACE7 pDDSTexture; //The actual rendering texture.
|
LPDIRECTDRAWSURFACE7 pDDSTexture; //실제 그리는 텍스쳐 이다.
|
||||||
LPDIRECT3DDEVICE7 pD3DDevice;
|
LPDIRECT3DDEVICE7 pD3DDevice;
|
||||||
CHSHFont pFont[4];
|
CHSHFont pFont[4];
|
||||||
SIZE size_back;
|
SIZE size_back;
|
||||||
SIZE size_target;
|
SIZE size_target;
|
||||||
float tw,th;//texture width,height
|
float tw,th;//texture width,height
|
||||||
int m_nDrawCalls; // [mrdiag] draws issued since the last BeginScene
|
|
||||||
CHSH_Device();
|
CHSH_Device();
|
||||||
|
|
||||||
bool InitFirst(int devicenum,DWORD resx,DWORD resy, CHSH_Device* pOtherHSHD = NULL);
|
bool InitFirst(int devicenum,DWORD resx,DWORD resy, CHSH_Device* pOtherHSHD = NULL);
|
||||||
@@ -142,7 +141,7 @@ public:
|
|||||||
bool InitFirst();
|
bool InitFirst();
|
||||||
bool InitSecond();
|
bool InitSecond();
|
||||||
LPDIRECTDRAWSURFACE7 pDDSBackground; //one attatched image sruface
|
LPDIRECTDRAWSURFACE7 pDDSBackground; //one attatched image sruface
|
||||||
LPDIRECTDRAWSURFACE7 pDDSRadarDamageTexture;//Mech damage texture..
|
LPDIRECTDRAWSURFACE7 pDDSRadarDamageTexture;//메크 데미지 텍스쳐..
|
||||||
// MSL 5.03 Mechview
|
// MSL 5.03 Mechview
|
||||||
LPDIRECTDRAWSURFACE7 pDDSMechViewBkgnd;
|
LPDIRECTDRAWSURFACE7 pDDSMechViewBkgnd;
|
||||||
LPDIRECTDRAWSURFACE7 pDDSMechViewBeagle;
|
LPDIRECTDRAWSURFACE7 pDDSMechViewBeagle;
|
||||||
@@ -152,7 +151,7 @@ public:
|
|||||||
LPDIRECTDRAWSURFACE7 pDDSMechViewLightamp;
|
LPDIRECTDRAWSURFACE7 pDDSMechViewLightamp;
|
||||||
LPDIRECTDRAWSURFACE7 m_pDDSMechView; //m x n - tiled 3D MechView images
|
LPDIRECTDRAWSURFACE7 m_pDDSMechView; //m x n - tiled 3D MechView images
|
||||||
|
|
||||||
virtual bool BeginScene(); //Rotates and outputs texture; pre-renders background image...
|
virtual bool BeginScene(); //texture를 ratate시켜서 출력하기 위한 루틴이 포함된다.. background이미지를.. 미리 출력한다...
|
||||||
virtual bool EndScene();
|
virtual bool EndScene();
|
||||||
virtual bool Release();
|
virtual bool Release();
|
||||||
bool LoadRadarDamageTexture(const char *mechtexturename);
|
bool LoadRadarDamageTexture(const char *mechtexturename);
|
||||||
@@ -160,33 +159,25 @@ public:
|
|||||||
bool MapDrawn;
|
bool MapDrawn;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Mode 4 (split dual 640x480): the right-hand MFD lives on its own DirectDraw object,
|
|
||||||
// so CMFD_Device keeps a typed pointer to it.
|
|
||||||
class CMFDRight_Device;
|
|
||||||
|
|
||||||
class CMFD_Device:public CHSH_Device
|
class CMFD_Device:public CHSH_Device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//CHSHFont SmallFont;
|
//CHSHFont SmallFont;
|
||||||
LPDIRECTDRAWSURFACE7 pDDSMechTexture;//Texture for storing 3D mech image...
|
LPDIRECTDRAWSURFACE7 pDDSMechTexture;//3D메크 이미지 저장하기 위한 텍스쳐...
|
||||||
LPDIRECTDRAWSURFACE7 pDDSDamageTexture;//Mech damage texture..
|
LPDIRECTDRAWSURFACE7 pDDSDamageTexture;//메크 데미지 텍스쳐..
|
||||||
// MSL 5.03 Target Damage Display
|
// MSL 5.03 Target Damage Display
|
||||||
LPDIRECTDRAWSURFACE7 pDDSTargetTexture;//Target damage texture..
|
LPDIRECTDRAWSURFACE7 pDDSTargetTexture;//메크 데미지 텍스쳐..
|
||||||
|
|
||||||
DWORD ch; //current channel....
|
DWORD ch; //current channel....
|
||||||
CMFDRight_Device* m_pRightDevice; // mode 4: right 640x480 device (NULL in modes 1-3)
|
|
||||||
bool m_bSwappedToRight; // mode 4: true while our members point at the right device
|
|
||||||
public:
|
public:
|
||||||
CMFD_Device();
|
CMFD_Device();
|
||||||
~CMFD_Device();
|
~CMFD_Device();
|
||||||
bool InitFirst();
|
bool InitFirst();
|
||||||
bool InitSecond();
|
bool InitSecond();
|
||||||
bool BeginChannel(DWORD channel);// Select channel 0-4.
|
bool BeginChannel(DWORD channel);// 0~4번의 채널을 정할 수 있게된다.
|
||||||
bool EndChannel();
|
bool EndChannel();
|
||||||
void SwapRightState(); // mode 4: exchange data members with the right device
|
virtual bool BeginScene(); //normal한 beginscene/endscene를 한다.
|
||||||
virtual bool BeginScene(); //Performs normal BeginScene/EndScene.
|
virtual bool EndScene(); //flip을 한다.
|
||||||
bool BeginSceneRight(); // mode 4: clear+grid on right device at sh_step==1
|
|
||||||
virtual bool EndScene(); //Performs the Flip.
|
|
||||||
virtual bool Release();
|
virtual bool Release();
|
||||||
bool LoadDamageTexture(const char *mechtexturename);
|
bool LoadDamageTexture(const char *mechtexturename);
|
||||||
// MSL 5.03 Target Damage Display
|
// MSL 5.03 Target Damage Display
|
||||||
@@ -198,27 +189,6 @@ public:
|
|||||||
bool DrawMFDDefaultBackAux1(int state);
|
bool DrawMFDDefaultBackAux1(int state);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Mode 4 (split dual 640x480): right-side MFD device on its own 640x480 monitor.
|
|
||||||
// It owns a SEPARATE IDirectDraw7 and IDirect3DDevice7 (a DirectDraw device is bound to
|
|
||||||
// one monitor), therefore it must also own a complete, independent copy of the MFD
|
|
||||||
// texture set: a surface belongs to the IDirectDraw7 that created it, not to the GPU,
|
|
||||||
// so surfaces can NOT be shared between the two devices even on the same card.
|
|
||||||
class CMFDRight_Device : public CHSH_Device
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
LPDIRECTDRAWSURFACE7 pDDSMechTexture;
|
|
||||||
LPDIRECTDRAWSURFACE7 pDDSDamageTexture;
|
|
||||||
LPDIRECTDRAWSURFACE7 pDDSTargetTexture;
|
|
||||||
public:
|
|
||||||
CMFDRight_Device()
|
|
||||||
: pDDSMechTexture(0), pDDSDamageTexture(0), pDDSTargetTexture(0) {}
|
|
||||||
bool InitFirst();
|
|
||||||
bool InitSecond();
|
|
||||||
virtual bool BeginScene() { return true; }
|
|
||||||
virtual bool EndScene() { return true; }
|
|
||||||
virtual bool Release();
|
|
||||||
};
|
|
||||||
|
|
||||||
class CMR_Device:public CHSH_Device
|
class CMR_Device:public CHSH_Device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -229,10 +199,10 @@ public:
|
|||||||
bool InitFirst();
|
bool InitFirst();
|
||||||
bool InitSecond();
|
bool InitSecond();
|
||||||
LPDIRECTDRAWSURFACE7 pDDSBackground; //one attatched image sruface
|
LPDIRECTDRAWSURFACE7 pDDSBackground; //one attatched image sruface
|
||||||
LPDIRECTDRAWSURFACE7 pDDSMapTexture; //Texture for scrollable map image..
|
LPDIRECTDRAWSURFACE7 pDDSMapTexture; //스크롤되는 맵 이미지를 위한 텍스쳐..
|
||||||
LPDIRECTDRAWSURFACE7 pDDSMRTargetTexture;//Mission Review target texture..
|
LPDIRECTDRAWSURFACE7 pDDSMRTargetTexture;//메크 데미지 텍스쳐..
|
||||||
bool LoadMRTargetTexture(const char *mechtexturename);
|
bool LoadMRTargetTexture(const char *mechtexturename);
|
||||||
virtual bool BeginScene(); //Rotates and outputs texture; pre-renders background image...
|
virtual bool BeginScene(); //texture를 ratate시켜서 출력하기 위한 루틴이 포함된다.. background이미지를.. 미리 출력한다...
|
||||||
virtual bool EndScene();
|
virtual bool EndScene();
|
||||||
virtual bool Release();
|
virtual bool Release();
|
||||||
};
|
};
|
||||||
@@ -242,7 +212,6 @@ void HSH_DirectDrawRelease2();
|
|||||||
|
|
||||||
extern CRadar_Device radar_device;
|
extern CRadar_Device radar_device;
|
||||||
extern CMFD_Device mfd_device;
|
extern CMFD_Device mfd_device;
|
||||||
extern CMFDRight_Device mfd_device_right;
|
|
||||||
extern CMR_Device mr_device;
|
extern CMR_Device mr_device;
|
||||||
extern bool use_shgui;
|
extern bool use_shgui;
|
||||||
extern int sh_step;
|
extern int sh_step;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ INTERNET_STATUS_STATE_CHANGE
|
|||||||
INTERNET_STATE_DISCONNECTED_BY_USER
|
INTERNET_STATE_DISCONNECTED_BY_USER
|
||||||
Disconnected by user request.
|
Disconnected by user request.
|
||||||
INTERNET_STATE_IDLE
|
INTERNET_STATE_IDLE
|
||||||
No network requests are being made by the Win32® Internet functions.
|
No network requests are being made by the Win32® Internet functions.
|
||||||
INTERNET_STATE_BUSY
|
INTERNET_STATE_BUSY
|
||||||
Network requests are being made by the Win32 Internet functions.
|
Network requests are being made by the Win32 Internet functions.
|
||||||
INTERNET_STATUS_USER_INPUT_REQUIRED
|
INTERNET_STATUS_USER_INPUT_REQUIRED
|
||||||
|
|||||||
@@ -1077,7 +1077,7 @@ int CStrArray::GetTotalLength() const
|
|||||||
int nTotalLength;
|
int nTotalLength;
|
||||||
int i, nSize = GetSize();
|
int i, nSize = GetSize();
|
||||||
|
|
||||||
nTotalLength = nSize; // nSize null terminators '\0'
|
nTotalLength = nSize; // nSize개의 '\0'
|
||||||
for(i = 0; i < nSize; i++) {
|
for(i = 0; i < nSize; i++) {
|
||||||
nTotalLength += strlen(GetAt(i));
|
nTotalLength += strlen(GetAt(i));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -514,7 +514,7 @@ void CSOC_Server::OnSendFile()
|
|||||||
BYTE bCode;
|
BYTE bCode;
|
||||||
if (Disassemble("B", &bCode)) {
|
if (Disassemble("B", &bCode)) {
|
||||||
ASSERT((bCode == 0) || (bCode == 3));
|
ASSERT((bCode == 0) || (bCode == 3));
|
||||||
// Receiving from Game to console...
|
// 받아가시오 from Game to console...
|
||||||
SYSTEMTIME* pSysTime;
|
SYSTEMTIME* pSysTime;
|
||||||
WORD wSysTimeSize;
|
WORD wSysTimeSize;
|
||||||
GUID* pGUID;
|
GUID* pGUID;
|
||||||
@@ -530,7 +530,7 @@ void CSOC_Server::OnSendFile()
|
|||||||
pSF = g_pCTCLManager->m_SFM_Recv.Find(*pGUID, nType);
|
pSF = g_pCTCLManager->m_SFM_Recv.Find(*pGUID, nType);
|
||||||
if (pSF) {
|
if (pSF) {
|
||||||
if (bCode == 3) {
|
if (bCode == 3) {
|
||||||
// Did we receive confirmation the mission review server got the mission review?
|
// 미션리뷰 서버가 mission review 받았다는 것을 받았느냐?
|
||||||
pSF->m_bProcessed = true;
|
pSF->m_bProcessed = true;
|
||||||
g_pCTCLManager->m_SFM_Recv.Cut(pSF);
|
g_pCTCLManager->m_SFM_Recv.Cut(pSF);
|
||||||
g_pCTCLManager->m_SFM_Done.AddTail(pSF);
|
g_pCTCLManager->m_SFM_Done.AddTail(pSF);
|
||||||
@@ -907,7 +907,7 @@ void CSOC_Client::OnSendFile()
|
|||||||
BYTE bCode;
|
BYTE bCode;
|
||||||
if (Disassemble("B", &bCode)) {
|
if (Disassemble("B", &bCode)) {
|
||||||
ASSERT((bCode == 1) || (bCode == 2));
|
ASSERT((bCode == 1) || (bCode == 2));
|
||||||
// Received from console to Game...
|
// 받았오 from console to Game...
|
||||||
SYSTEMTIME* pSysTime;
|
SYSTEMTIME* pSysTime;
|
||||||
WORD wSysTimeSize;
|
WORD wSysTimeSize;
|
||||||
GUID* pGUID;
|
GUID* pGUID;
|
||||||
@@ -1425,21 +1425,21 @@ void CCTCLManager::Run()
|
|||||||
#endif // !defined(CTCL_LAUNCHER)
|
#endif // !defined(CTCL_LAUNCHER)
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
Code executed for both client and server.
|
클라이언트나 서버의 경우 실행되는 코드이다.
|
||||||
|
|
||||||
*Possible states:
|
*있을수 있는 상태들
|
||||||
Before server/client role is determined: waiting for commands
|
서버/클라이언트가 결정되기전.. 명령 대기상태
|
||||||
(Commands such as exit/start-server/start-client may arrive.)
|
(종료/서버시작/클라이언트 시작등의 명령이 올수 있다.)
|
||||||
|
|
||||||
Running as server, waiting for server mech configuration data
|
서버로 실행되어 서버 메크 설정에 대한 데이타를 기다리는 상태
|
||||||
(State after CreateSession has been called.)
|
(CreateSession가 실행된 상태이다.)
|
||||||
Running as server, waiting for Bot information
|
서버로 실행되어 Bot들에 대한 정보를 기다리는 상태
|
||||||
(Client joining happens automatically between client and server.)
|
(클라이언트의 참여는 클라이언트와 서버간에 자동으로 이루어진다.)
|
||||||
Running as server, waiting for Launch
|
서버로 실행되어 Launch를 기다리는 상태
|
||||||
|
|
||||||
==>Client has no waiting state as data is transferred immediately on startup.
|
==>클라이언트는 실행즉시 데이타들이 전달되므로 대기상태가 없다.
|
||||||
|
|
||||||
==>Define each state and implement the appropriate handling for each.
|
==>각각의 상태를 정의하고 각 상태에 맞는 처리를 해주면 된다.
|
||||||
switch(state){
|
switch(state){
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@@ -1521,8 +1521,8 @@ void CCTCLManager::DoMech4Comm()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
//Send command to prepare for execution as server/client.
|
//서버/클라이언트로서 실행준비하도록 명령을 전달한다.
|
||||||
//Also transmit all parameters required to run the server.
|
//또한 서버를 실행하는데 필요한 모든 파라미터도 함께 전달한다.
|
||||||
for(i = 0; i < g_nPlayerInfos; i++) {
|
for(i = 0; i < g_nPlayerInfos; i++) {
|
||||||
SPlayerInfo& pi = g_aPlayerInfos[i];
|
SPlayerInfo& pi = g_aPlayerInfos[i];
|
||||||
if (!pi.m_bBot) {
|
if (!pi.m_bBot) {
|
||||||
@@ -1549,12 +1549,12 @@ void CCTCLManager::DoMech4Comm()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == g_nPlayerInfos) {
|
if (i == g_nPlayerInfos) {
|
||||||
// Bundle and send all Bot information together.
|
// Bot들에 대한 정보를 모두 한데 묶어서 보낸다.
|
||||||
CPacket pak(&SVR.GetGameSOC());
|
CPacket pak(&SVR.GetGameSOC());
|
||||||
|
|
||||||
pak.Assemble("B", C_BOTS);
|
pak.Assemble("B", C_BOTS);
|
||||||
for(i = 0; i < g_nPlayerInfos; i++) {
|
for(i = 0; i < g_nPlayerInfos; i++) {
|
||||||
if (i != g_nServer) { // Originally bots only; now everyone except the server...
|
if (i != g_nServer) { // 원래 Bot만 지금은 서버를 제외한 전부...
|
||||||
SPlayerInfo& pi = g_aPlayerInfos[i];
|
SPlayerInfo& pi = g_aPlayerInfos[i];
|
||||||
pak.Assemble("BnsDWwsnn", pi.m_bBot, pi.m_nLevelOrTesla, pi.m_szName, pi.m_nMechIndex, pi.m_fileID, pi.m_recordID, pi.m_szMech, pi.m_nTeamOrSkin, pi.m_nDecal);
|
pak.Assemble("BnsDWwsnn", pi.m_bBot, pi.m_nLevelOrTesla, pi.m_szName, pi.m_nMechIndex, pi.m_fileID, pi.m_recordID, pi.m_szMech, pi.m_nTeamOrSkin, pi.m_nDecal);
|
||||||
}
|
}
|
||||||
@@ -1565,10 +1565,10 @@ void CCTCLManager::DoMech4Comm()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
// Once the game is successfully created, set Mech info for server and all clients...
|
// 게임이 성공적으로 만들어지면 서버와 클라이언트들의 Mech에 대한 정보들을 Set한다...
|
||||||
if (SOCGame.m_nGameReturn == _EGR_OkCreateSession) {
|
if (SOCGame.m_nGameReturn == _EGR_OkCreateSession) {
|
||||||
for(i = 0; i < g_nPlayerInfos; i++) {
|
for(i = 0; i < g_nPlayerInfos; i++) {
|
||||||
if (i != g_nServer) { // Server has already entered SetMech...
|
if (i != g_nServer) { // 서버는 이미 SetMech에 진입한 상태...
|
||||||
SPlayerInfo& pi = g_aPlayerInfos[i];
|
SPlayerInfo& pi = g_aPlayerInfos[i];
|
||||||
if (!pi.m_bBot) {
|
if (!pi.m_bBot) {
|
||||||
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
|
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
|
||||||
@@ -1581,8 +1581,8 @@ void CCTCLManager::DoMech4Comm()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
//Wait for all clients to join the server. <==This response comes from the server.
|
//모든 클라이언드들이 서버에 참여하기를 기다린다.<==이 응답은 서버로 부터 얻을 수 있다.
|
||||||
//Once all clients have joined, instruct the server to Launch the game.
|
//참여가 모두 끝났으면, 서버로 하여금 게임을 Launch시키도록 한다.
|
||||||
if (SOCGame.m_nGameReturn == _EGR_OkLaunchReady) {
|
if (SOCGame.m_nGameReturn == _EGR_OkLaunchReady) {
|
||||||
g_nMech4Comm = 9;
|
g_nMech4Comm = 9;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public:
|
|||||||
const char* m_pcsz;
|
const char* m_pcsz;
|
||||||
|
|
||||||
int m_nLauncherConnection; // 0: no connection, +1: connection, -1: connecting
|
int m_nLauncherConnection; // 0: no connection, +1: connection, -1: connecting
|
||||||
int m_nConnection2; // Connection to game or camera ship per m_bCameraShip, 0: no connection, +1: connected, -1: connecting
|
int m_nConnection2; // m_bCameraShip값에 따라 게임 혹은 카메라 쉽과의 접속을 의미, 0: no connection, +1: connection, -1: connecting
|
||||||
int m_nApplType;
|
int m_nApplType;
|
||||||
int m_nApplState;
|
int m_nApplState;
|
||||||
int m_nGameState;
|
int m_nGameState;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ int GetDayEnd(int nYear, int nMonth)
|
|||||||
|
|
||||||
long GetTotalSeconds(int nYear, int nMonth, int nDay)
|
long GetTotalSeconds(int nYear, int nMonth, int nDay)
|
||||||
{
|
{
|
||||||
// Seconds elapsed since 00:00:00 on the date nYear/nMonth/nDay...
|
// nYear, nMonth, nDay날의 0시 0분 0초를 0으로 한 초단위 수...
|
||||||
ASSERT(nYear >= 1970);
|
ASSERT(nYear >= 1970);
|
||||||
ASSERT((1 <= nMonth) && (nMonth <= 12));
|
ASSERT((1 <= nMonth) && (nMonth <= 12));
|
||||||
ASSERT(1 <= nDay);
|
ASSERT(1 <= nDay);
|
||||||
@@ -57,13 +57,13 @@ long GetTotalSeconds(int nYear, int nMonth, int nDay)
|
|||||||
if (IsLeapYear(nStart)) {
|
if (IsLeapYear(nStart)) {
|
||||||
nDays++;
|
nDays++;
|
||||||
}
|
}
|
||||||
lTotal += nDays * 24 * 60 * 60; // 24 hours * 60 min * 60 sec
|
lTotal += nDays * 24 * 60 * 60; // 24시간 60분 60초
|
||||||
}
|
}
|
||||||
for(nStart = 1; nStart < nMonth; nStart++) {
|
for(nStart = 1; nStart < nMonth; nStart++) {
|
||||||
int nDayEnd = GetDayEnd(nYear, nStart);
|
int nDayEnd = GetDayEnd(nYear, nStart);
|
||||||
lTotal += nDayEnd * 24 * 60 * 60; // 24 hours * 60 min * 60 sec
|
lTotal += nDayEnd * 24 * 60 * 60; // 24시간 60분 60초
|
||||||
}
|
}
|
||||||
lTotal += (nDay - 1) * 24 * 60 * 60; // 24 hours * 60 min * 60 sec
|
lTotal += (nDay - 1) * 24 * 60 * 60; // 24시간 60분 60초
|
||||||
|
|
||||||
return lTotal;
|
return lTotal;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class CTimeDate
|
|||||||
public:
|
public:
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
// Bit Fields declared first are at the low-bit end.
|
// Bit Field는 앞쪽에 지정된 것이 LowBit이다.
|
||||||
DWORD m_xDay: 5; // 2^0, 2^5-1
|
DWORD m_xDay: 5; // 2^0, 2^5-1
|
||||||
DWORD m_xMonth: 4; // 2^5, 2^4-1
|
DWORD m_xMonth: 4; // 2^5, 2^4-1
|
||||||
DWORD m_xYear: TIMEDATE_YEAR_BITS; // from 1900-2155 // 2^9, 2^8-1
|
DWORD m_xYear: TIMEDATE_YEAR_BITS; // from 1900-2155 // 2^9, 2^8-1
|
||||||
|
|||||||
@@ -1375,7 +1375,7 @@ void CSockAddr::SetTarget(const char* pcszAddr)
|
|||||||
{
|
{
|
||||||
if (pcszAddr) {
|
if (pcszAddr) {
|
||||||
sin_addr.s_addr = inet_addr(pcszAddr);
|
sin_addr.s_addr = inet_addr(pcszAddr);
|
||||||
if (sin_addr.s_addr == INADDR_ANY) { // 0.0.0.0, HOST/Network Addr irrelevant
|
if (sin_addr.s_addr == INADDR_ANY) { // 0.0.0.0이기 때문에 HOST/Network Addr무관
|
||||||
hostent* pHN = gethostbyname(pcszAddr);
|
hostent* pHN = gethostbyname(pcszAddr);
|
||||||
if (pHN) {
|
if (pHN) {
|
||||||
sin_addr.s_addr = *(u_long*)pHN->h_addr;
|
sin_addr.s_addr = *(u_long*)pHN->h_addr;
|
||||||
@@ -3667,7 +3667,7 @@ CSOCListen* CSOCManager::DoListen(int nPort, PFN_CreateSOCClient pfnCSC, DWORD d
|
|||||||
pSOCListen = new CSOCListen(nPort);
|
pSOCListen = new CSOCListen(nPort);
|
||||||
pSOCListen->SetCSCParam(pfnCSC, dwCSCParam1, dwCSCParam2);
|
pSOCListen->SetCSCParam(pfnCSC, dwCSCParam1, dwCSCParam2);
|
||||||
if (!DoListen(pSOCListen, nPort)) {
|
if (!DoListen(pSOCListen, nPort)) {
|
||||||
// Case of Listen on the same port twice?...
|
// 같은 포트를 2번 Listen 하는 경우?...
|
||||||
pSOCListen = NULL;
|
pSOCListen = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ extern char SERVERID[];
|
|||||||
#endif // !MAX_PACKET
|
#endif // !MAX_PACKET
|
||||||
#ifndef MAX_FTPBUF
|
#ifndef MAX_FTPBUF
|
||||||
#define MAX_FTPBUF 1024
|
#define MAX_FTPBUF 1024
|
||||||
// MAX_FTPBUF must be smaller than MAX_PACKET?
|
// MAX_FTPBUF는 MAX_PACKET보다 반드시 작아야 한다?
|
||||||
// 9+size==sizeof(bCmd) + sizeof(FTID) + sizeof(size) + size
|
// 9+size==sizeof(bCmd) + sizeof(FTID) + sizeof(size) + size
|
||||||
#endif // !MAX_FTPBUF
|
#endif // !MAX_FTPBUF
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ private:
|
|||||||
|
|
||||||
#define ESTRF_USER_START 100
|
#define ESTRF_USER_START 100
|
||||||
|
|
||||||
#define ESTRF_PASSWORDCHANGED 110 // Password changed while logged in
|
#define ESTRF_PASSWORDCHANGED 110 // 로그인하고 있는 동안에 패스워드가 바뀜
|
||||||
|
|
||||||
void Randomize();
|
void Randomize();
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ union UPacketValue
|
|||||||
|
|
||||||
class CDAPacket : public SOCBase_Class
|
class CDAPacket : public SOCBase_Class
|
||||||
{
|
{
|
||||||
// Variable parameters in the tail portion after processing the packet header...
|
// Packet의 앞 부분을 처리하고 난 뒷 부분의 가변 파라미터...
|
||||||
public:
|
public:
|
||||||
BYTE m_bCmd;
|
BYTE m_bCmd;
|
||||||
BYTE m_bReserved;
|
BYTE m_bReserved;
|
||||||
@@ -361,8 +361,8 @@ public:
|
|||||||
#define C_ROOM_MAKE 232
|
#define C_ROOM_MAKE 232
|
||||||
// s - name, s - password
|
// s - name, s - password
|
||||||
#define C_ROOM_JOIN 233
|
#define C_ROOM_JOIN 233
|
||||||
// d - number (leaving a Room = -1), s - password
|
// d - number(Room을 떠나는 것은 -1), s - password
|
||||||
#define S_ROOM_JOIN 233 // Result of C_ROOM_MAKE/C_ROOM_JOIN...
|
#define S_ROOM_JOIN 233 // C_ROOM_MAKE/C_ROOM_JOIN의 결과...
|
||||||
// b - code(CSCODE_OK or error code), d - number
|
// b - code(CSCODE_OK or error code), d - number
|
||||||
#define C_ROOM_UPDS 234 // CSCODE_... + @
|
#define C_ROOM_UPDS 234 // CSCODE_... + @
|
||||||
|
|
||||||
@@ -384,13 +384,13 @@ public:
|
|||||||
#define S_FTP 254 //... see ftp.txt
|
#define S_FTP 254 //... see ftp.txt
|
||||||
#define X_KEEPALIVE 255 // no parameters, should be ignored...
|
#define X_KEEPALIVE 255 // no parameters, should be ignored...
|
||||||
|
|
||||||
#define TX_SYSTEM 0 // System message...
|
#define TX_SYSTEM 0 // 시스템 메시지...
|
||||||
#define TX_NORMAL 1 // Regular chat text
|
#define TX_NORMAL 1 // 일반 채팅 텍스트
|
||||||
#define TX_WARNING 2 // Warning
|
#define TX_WARNING 2 // 경고
|
||||||
#define TX_ERROR 3 // Error
|
#define TX_ERROR 3 // 오류
|
||||||
#define TX_FATAL 4 // Fatal error
|
#define TX_FATAL 4 // 치명적인 오류
|
||||||
#define TX_INFO 5 // Information result (e.g. user info)...
|
#define TX_INFO 5 // 사용자 정보 등의 Information Result...
|
||||||
#define TX_SAY 6 // Whisper
|
#define TX_SAY 6 // 귓속말
|
||||||
#define TX_LOCAL 7 // local echo....
|
#define TX_LOCAL 7 // local echo....
|
||||||
#define TX_UNKNOWN 0xffff // unknown...
|
#define TX_UNKNOWN 0xffff // unknown...
|
||||||
|
|
||||||
@@ -493,7 +493,7 @@ CPacket
|
|||||||
protected:
|
protected:
|
||||||
CSOC* m_pSOC;
|
CSOC* m_pSOC;
|
||||||
private:
|
private:
|
||||||
// The block within must be contiguous...
|
// 이 안의 블럭은 반드시 연속해야 한다...
|
||||||
WORD m_wLen;
|
WORD m_wLen;
|
||||||
BYTE m_ba[MAX_PACKET];
|
BYTE m_ba[MAX_PACKET];
|
||||||
//
|
//
|
||||||
@@ -587,7 +587,7 @@ end of variable PACKET_MAP definitions...
|
|||||||
class CFileTransfer : public TDBLNK(CFileTransfer*)
|
class CFileTransfer : public TDBLNK(CFileTransfer*)
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Information received from server... - or information to relay to client...
|
// 서버로 부터 받은 정보... - 혹은 클라이언트에게 전해줄 정보...
|
||||||
BOOL m_bClientSite;
|
BOOL m_bClientSite;
|
||||||
DWORD m_dwFTID;
|
DWORD m_dwFTID;
|
||||||
DWORD m_dwGUARD;
|
DWORD m_dwGUARD;
|
||||||
@@ -680,18 +680,18 @@ protected:
|
|||||||
// time out to Drop...
|
// time out to Drop...
|
||||||
DWORD m_dwKARcvTimeOut;
|
DWORD m_dwKARcvTimeOut;
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
// Window handle typically used during Login process
|
// 보통 Login과정에 쓰이는 윈도우 핸들
|
||||||
HWND m_hWndOwner;
|
HWND m_hWndOwner;
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
// For auto NULL assignment of socket pointer typically used as a global variable
|
// 보통 글로벌 변수로 쓰이는 소켓포인터에 대한 자동 NULL Assign을 위하여
|
||||||
PSOC* m_ppSOC;
|
PSOC* m_ppSOC;
|
||||||
// ID used in user program to identify a socket
|
// 소켓을 구분하기 위하여 사용자 프로그램에서 쓰이는 아이디
|
||||||
// Mainly for servers: assigns a unique ID each time a client connects
|
// 주로 서버의 경우에는 클라이언트가 접속할 때마다 고유 아이디를 부여하여 사용
|
||||||
// Used to distinguish each connection when a client connects to multiple servers (Star topology)
|
// 하나의 Client가 다수의 서버에 접속할 때(주로 Star형) 각각의 접속을 구분할 때 사용
|
||||||
// When a client connects to only one server: used to check if client is connecting or already connected
|
// 클라이언트가 하나의 서버에만 접속하는 경우 클라이언트가 서버에 접속 중인지 혹은 접속했는지를 판단할 때
|
||||||
// Use CSOCManager::FindSOC(CSOC_SERVER_ID==default)->GetConnectionState().
|
// CSOCManager::FindSOC(CSOC_SERVER_ID==default)->GetConnectionState()를 사용.
|
||||||
// Must include limits.h.
|
// limits.h를 include해야함.
|
||||||
// Default values at CSOC creation: CSOCServer==CSOC_SERVER_ID(INT_MIN), CSOCClient==CSOC_CLIENT_ID(0), CSOCListen==CSOC_LISTEN_ID(-1)
|
// CSOC생성시의 기본값: CSOCServer == CSOC_SERVER_ID(=INT_MIN), CSOCClient == CSOC_CLIENT_ID(=0), CSOCListen == CSOC_LISTEN_ID(=-1)
|
||||||
union {
|
union {
|
||||||
int m_nID;
|
int m_nID;
|
||||||
UINT m_uID;
|
UINT m_uID;
|
||||||
@@ -725,8 +725,8 @@ protected:
|
|||||||
DWORD m_xGracefulRemote: 1;
|
DWORD m_xGracefulRemote: 1;
|
||||||
DWORD m_xAbortyLocal: 1;
|
DWORD m_xAbortyLocal: 1;
|
||||||
DWORD m_xAbortyRemote: 1;
|
DWORD m_xAbortyRemote: 1;
|
||||||
DWORD m_xLoginStarted: 1; // Must be set directly by the caller.
|
DWORD m_xLoginStarted: 1; // 사용자가 직접 값을 Setting해야 한다.
|
||||||
DWORD m_xLoginOK: 1; // Must be set directly by the caller.
|
DWORD m_xLoginOK: 1; // 사용자가 직접 값을 Setting해야 한다.
|
||||||
} m_DW;
|
} m_DW;
|
||||||
DWORD m_dwVarFlags;
|
DWORD m_dwVarFlags;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ inline BOOL AssertDialog(const char* pcszExpr, const char* pcszfile, int nLine)
|
|||||||
{
|
{
|
||||||
char szBuf[MAX_PATH * 2];
|
char szBuf[MAX_PATH * 2];
|
||||||
|
|
||||||
sprintf(szBuf, "ASSERT!!! in \"%s\" at line %d\n\nDo you want to debug?", pcszfile, nLine);
|
sprintf(szBuf, "\"%s\" 파일의 %d줄에서 ASSERT!!!\n\n디버깅을 하시겠습니까?", pcszfile, nLine);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
return ::MessageBox(NULL, szBuf, pcszExpr, MB_YESNO) == IDYES;
|
return ::MessageBox(NULL, szBuf, pcszExpr, MB_YESNO) == IDYES;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ inline BOOL AssertDialog(const char* pcszExpr, const char* pcszfile, int nLine)
|
|||||||
{
|
{
|
||||||
char szBuf[MAX_PATH * 2];
|
char szBuf[MAX_PATH * 2];
|
||||||
|
|
||||||
sprintf(szBuf, "ASSERT!!! in \"%s\" at line %d\n\nDo you want to debug?", pcszfile, nLine);
|
sprintf(szBuf, "\"%s\" 파일의 %d줄에서 ASSERT!!!\n\n디버깅을 하시겠습니까?", pcszfile, nLine);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
return ::MessageBox(NULL, szBuf, pcszExpr, MB_YESNO) == IDYES;
|
return ::MessageBox(NULL, szBuf, pcszExpr, MB_YESNO) == IDYES;
|
||||||
|
|||||||
@@ -76,18 +76,18 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
//· code for changing sort order or priority levels
|
//· code for changing sort order or priority levels
|
||||||
//· new sort order
|
//· new sort order
|
||||||
//· new priority level
|
//· new priority level
|
||||||
//· priority set to remove
|
//· priority set to remove
|
||||||
//· priority set to add
|
//· priority set to add
|
||||||
} AdjustCommandData;
|
} AdjustCommandData;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
//· command area from which to remove command
|
//· command area from which to remove command
|
||||||
//· command id of command to remove
|
//· command id of command to remove
|
||||||
//· other info to pick what command to remove
|
//· other info to pick what command to remove
|
||||||
} RemoveCommandData;
|
} RemoveCommandData;
|
||||||
|
|
||||||
union CommandUnion
|
union CommandUnion
|
||||||
|
|||||||
@@ -104,8 +104,8 @@ void CRIOMAIN::UpdateJoystickY (DIJOYSTATE &js)
|
|||||||
|
|
||||||
lJ = JoystickY_Center - g_JoystickY;
|
lJ = JoystickY_Center - g_JoystickY;
|
||||||
|
|
||||||
// High sensitivity
|
// 고감도
|
||||||
// Calculate from the moment of exiting the Dead Zone as 0
|
// Dead Zone 에서 벗어난 시점을 0으로 계산한다
|
||||||
if (lJ > 0) {
|
if (lJ > 0) {
|
||||||
lJ -= DEADZONE_JOYSTICK;
|
lJ -= DEADZONE_JOYSTICK;
|
||||||
} else if (lJ < 0) {
|
} else if (lJ < 0) {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ LONG g_LeftPedalLast = 0;
|
|||||||
LONG g_RightPedalLast = 0;
|
LONG g_RightPedalLast = 0;
|
||||||
BOOL g_StartGame = FALSE;
|
BOOL g_StartGame = FALSE;
|
||||||
|
|
||||||
static int g_nOpenComState = 0; // hyun
|
static int g_nOpenComState = 0; // 鉉
|
||||||
|
|
||||||
DWORD g_dwLastAnalogUpdate = 0;
|
DWORD g_dwLastAnalogUpdate = 0;
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ DWORD g_dwLastAnalogUpdate = 0;
|
|||||||
#define RESTART_CHAR 0xFE
|
#define RESTART_CHAR 0xFE
|
||||||
#define IDLE_CHAR 0xFF
|
#define IDLE_CHAR 0xFF
|
||||||
|
|
||||||
//Use it like a member variable.
|
//member 변수처럼 활용할것.
|
||||||
static HANDLE g_hCom = INVALID_HANDLE_VALUE;
|
static HANDLE g_hCom = INVALID_HANDLE_VALUE;
|
||||||
static OVERLAPPED wos;
|
static OVERLAPPED wos;
|
||||||
static OVERLAPPED ros;
|
static OVERLAPPED ros;
|
||||||
@@ -108,7 +108,6 @@ int g_nRIOPacketCountB = (sizeof(g_baRIOLengthsB) / sizeof(g_baRIOLengthsB[0]));
|
|||||||
|
|
||||||
int g_nRIOType = 0; // 0: old(original) type, 1: new type
|
int g_nRIOType = 0; // 0: old(original) type, 1: new type
|
||||||
DWORD g_dwRIOBaud = 0; // [tbaud] 0: default by RIO type; else COM1 baud forced by -tbaud (high-speed replica of the original RIO board, protocol unchanged)
|
DWORD g_dwRIOBaud = 0; // [tbaud] 0: default by RIO type; else COM1 baud forced by -tbaud (high-speed replica of the original RIO board, protocol unchanged)
|
||||||
DWORD g_dwRIOPollTimeout = 50; // [tbaud] WaitForMultipleObjects timeout (ms); computed from baud rate before the receive loop starts
|
|
||||||
int g_nEjectButton = 61; // 61: original, 31: new type
|
int g_nEjectButton = 61; // 61: original, 31: new type
|
||||||
BYTE* g_pbRIOLengths = NULL;
|
BYTE* g_pbRIOLengths = NULL;
|
||||||
int g_nRIOPacketCount = 0;
|
int g_nRIOPacketCount = 0;
|
||||||
@@ -319,7 +318,7 @@ void RequestVersion();
|
|||||||
void RequestAnalogUpdate(BYTE bFreq = 3);
|
void RequestAnalogUpdate(BYTE bFreq = 3);
|
||||||
|
|
||||||
// start - for new RIO Board only...
|
// start - for new RIO Board only...
|
||||||
//Received packets are handled in different threads.. a critical section is needed..
|
//received packet은 각각 다른 스레드에서 처리하므로.. ciritical section이 필요하다..
|
||||||
BYTE received_buffer[128][16];
|
BYTE received_buffer[128][16];
|
||||||
int received_packet=0;//packets count in the received_buffer.
|
int received_packet=0;//packets count in the received_buffer.
|
||||||
DWORD received_serial=0;
|
DWORD received_serial=0;
|
||||||
@@ -570,7 +569,7 @@ BOOL SetupConnection(HANDLE hCom)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Original processing routine..
|
원래 처리 루틴..
|
||||||
NPTTYINFO npTTYInfo=0 ;
|
NPTTYINFO npTTYInfo=0 ;
|
||||||
BYTE bset1 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0) ;
|
BYTE bset1 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0) ;
|
||||||
BYTE bset2 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0) ;
|
BYTE bset2 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0) ;
|
||||||
@@ -604,7 +603,7 @@ BOOL SetupConnection(HANDLE hCom)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Unhandled items.. handled using GetCommState default values.
|
//처리되지 않는 항목들.. GetCommState의 기본값으로 처리한다.
|
||||||
DWORD fDsrSensitivity:1; // DSR sensitivity
|
DWORD fDsrSensitivity:1; // DSR sensitivity
|
||||||
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
|
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
|
||||||
DWORD fErrorChar: 1; // enable error replacement
|
DWORD fErrorChar: 1; // enable error replacement
|
||||||
@@ -648,7 +647,7 @@ HANDLE OpenConnection(int port)
|
|||||||
g_hLampEvent = CreateEvent(0,FALSE,0,0);
|
g_hLampEvent = CreateEvent(0,FALSE,0,0);
|
||||||
g_hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)CommWatchProc, NULL, CREATE_SUSPENDED, &g_dwThreadID);
|
g_hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)CommWatchProc, NULL, CREATE_SUSPENDED, &g_dwThreadID);
|
||||||
if (g_hCommWatchThread) {
|
if (g_hCommWatchThread) {
|
||||||
//Thread was created successfully.
|
//Thread까지 정상적으로 생성되었다.
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
//All OK
|
//All OK
|
||||||
//Exit Point <======
|
//Exit Point <======
|
||||||
@@ -745,11 +744,11 @@ retry:
|
|||||||
for(int i=0;i<(int)dwLength;i++){
|
for(int i=0;i<(int)dwLength;i++){
|
||||||
int ch=(BYTE)lpszBlock[i];
|
int ch=(BYTE)lpszBlock[i];
|
||||||
|
|
||||||
//Loop for the number of received characters.
|
//받은 문자만큼 루프를 돈다.
|
||||||
//Currently.. no packet is being received.. can receive any control character.
|
//현재.. 받고 있는 packet이 없고.. 어떤 control문자라도 올 수 있는 상태이다.
|
||||||
|
|
||||||
if(packetbyteremain!=0){
|
if(packetbyteremain!=0){
|
||||||
//Character corresponding to a packet has arrived.. receive the remaining characters.
|
//패킷에 해당하는 문자가 도착했다.. 나머지 문자들을 받는다.
|
||||||
if (ch & 0x80) {
|
if (ch & 0x80) {
|
||||||
packetbyteremain=0;
|
packetbyteremain=0;
|
||||||
chinpacket=0;
|
chinpacket=0;
|
||||||
@@ -759,7 +758,7 @@ retry:
|
|||||||
packetbytes[chinpacket] = ch;
|
packetbytes[chinpacket] = ch;
|
||||||
chinpacket++;
|
chinpacket++;
|
||||||
if (packetbyteremain == 0) {
|
if (packetbyteremain == 0) {
|
||||||
//A packet has been completed and arrived.. respond immediately.
|
//하나의 패킷이 완성되었다. 도착했다.. 즉시 반응한다.
|
||||||
chinpacket--; // exclude check byte
|
chinpacket--; // exclude check byte
|
||||||
int packettype=packetbytes[0];
|
int packettype=packetbytes[0];
|
||||||
BYTE bCheckByte = 0;
|
BYTE bCheckByte = 0;
|
||||||
@@ -838,21 +837,21 @@ retry:
|
|||||||
packettype++;
|
packettype++;
|
||||||
packettype--;
|
packettype--;
|
||||||
#endif // _DEBUG
|
#endif // _DEBUG
|
||||||
case rio_Ack2:
|
case rio_Ack2://◆◆◆◆◆◆◆◆◆◆
|
||||||
if (g_nRIOType != 0) {
|
if (g_nRIOType != 0) {
|
||||||
BYTE id=packetbytes[1];
|
BYTE id=packetbytes[1];
|
||||||
int popped_index=PopPacket(id);
|
int popped_index=PopPacket(id);
|
||||||
ack_timeout=GetTickCount()+30;
|
ack_timeout=GetTickCount()+30;
|
||||||
if(popped_index==0){
|
if(popped_index==0){
|
||||||
//This is the very first one... Normal case.
|
//맨처음것... 정상적인 경우이다.
|
||||||
}else if(popped_index>0){
|
}else if(popped_index>0){
|
||||||
//Not the very first one.
|
//맨처음것이 아닌것.
|
||||||
//Previous ones were not sent successfully, resend...
|
//이전것들이 정상적으로 보내지지 않았으므로 다시 보낸다...
|
||||||
ReSendPackets(popped_index);//By the number of incorrect ones..
|
ReSendPackets(popped_index);//잘못된 개수 만큼..
|
||||||
}else{
|
}else{
|
||||||
//Failure means an id that does not exist arrived..
|
//실패 했다는것은.. 없는 id가 왔다는 것인데..
|
||||||
//An obvious error.. but there is no particular way to handle it.
|
//명백한 에러.. 그러나 특별히 대처할 방법은 없다.
|
||||||
//Simply ignore it.
|
//그냥 무시한다.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -871,9 +870,9 @@ retry:
|
|||||||
// WriteTTYBlock(hWnd,"|",1);
|
// WriteTTYBlock(hWnd,"|",1);
|
||||||
chinpacket=0;
|
chinpacket=0;
|
||||||
|
|
||||||
//Clear the packetbytes buffer.
|
//packetbytes버퍼를 지운다.
|
||||||
} else {
|
} else {
|
||||||
//Packet characters have not all arrived yet.. do nothing.
|
//아직 패킷 문자들이 다 도착하지 않았다.. 아무것도 하지 않는다.
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@@ -890,7 +889,7 @@ retry:
|
|||||||
}//for(int i=0;i<(int)dwLength;i++)
|
}//for(int i=0;i<(int)dwLength;i++)
|
||||||
|
|
||||||
|
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
if (!fReadStat){
|
if (!fReadStat){
|
||||||
if (GetLastError() == ERROR_IO_PENDING){
|
if (GetLastError() == ERROR_IO_PENDING){
|
||||||
while(!GetOverlappedResult( g_hCom,&ros, &dwLength, TRUE )){
|
while(!GetOverlappedResult( g_hCom,&ros, &dwLength, TRUE )){
|
||||||
@@ -1001,24 +1000,12 @@ DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_dwLastAnalogUpdate = GetTickCount() + 2800;
|
g_dwLastAnalogUpdate = GetTickCount() + 2800;
|
||||||
// [tbaud] Scale the poll timeout proportionally to baud rate so faster links
|
|
||||||
// poll more frequently. Formula: clamp(ceil(480000/baud), 5, 50)
|
|
||||||
// preserves the existing 50ms at 9600 baud, floors at 5ms for high speeds.
|
|
||||||
// effectiveBaud: use -tbaud override if set, else the RIO type's default.
|
|
||||||
{
|
|
||||||
DWORD effectiveBaud = (g_dwRIOBaud != 0) ? g_dwRIOBaud
|
|
||||||
: ((g_nRIOType == 0) ? 9600UL : 115200UL);
|
|
||||||
{
|
|
||||||
DWORD t = (480000UL + effectiveBaud - 1) / effectiveBaud;
|
|
||||||
g_dwRIOPollTimeout = (t < 5UL) ? 5UL : (t > 50UL ? 50UL : t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while(1) {
|
while(1) {
|
||||||
DWORD dwEvtMask = 0;
|
DWORD dwEvtMask = 0;
|
||||||
|
|
||||||
WaitCommEvent( g_hCom, &dwEvtMask,&wcos );
|
WaitCommEvent( g_hCom, &dwEvtMask,&wcos );
|
||||||
|
|
||||||
DWORD ret=WaitForMultipleObjects(3,events,FALSE,g_dwRIOPollTimeout);
|
DWORD ret=WaitForMultipleObjects(3,events,FALSE,50/*INFINITE*/);
|
||||||
if(ret==WAIT_OBJECT_0){
|
if(ret==WAIT_OBJECT_0){
|
||||||
//An Comm Event has arrived.
|
//An Comm Event has arrived.
|
||||||
DWORD bytesread;
|
DWORD bytesread;
|
||||||
@@ -1035,10 +1022,10 @@ DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
|
|||||||
}
|
}
|
||||||
} else {*/
|
} else {*/
|
||||||
if (g_nRIOType != 0) {
|
if (g_nRIOType != 0) {
|
||||||
///When ack is received from ReadCommBlock above, update duetime.
|
///◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆위의 ReadCommBlock에서 ack를 받았을 경우 duetime을 update시킨다.
|
||||||
///CheckSentBuffer...
|
///◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆CheckSentBuffer...
|
||||||
if(GetTickCount()>ack_timeout)
|
if(GetTickCount()>ack_timeout)
|
||||||
ReSendPackets(sent_packet);//Resend everything in sent_buffer.
|
ReSendPackets(sent_packet);//sent_buffer에 있는 모든것들을 다시 보내본다.
|
||||||
}
|
}
|
||||||
/*}*/
|
/*}*/
|
||||||
}else if(ret==WAIT_OBJECT_0+1){
|
}else if(ret==WAIT_OBJECT_0+1){
|
||||||
@@ -1052,9 +1039,9 @@ DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
|
|||||||
//break;
|
//break;
|
||||||
}else if (ret==WAIT_TIMEOUT) {
|
}else if (ret==WAIT_TIMEOUT) {
|
||||||
if (g_nRIOType != 0) {
|
if (g_nRIOType != 0) {
|
||||||
///CheckSentBuffer...
|
///◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆CheckSentBuffer...
|
||||||
if(GetTickCount()>ack_timeout)
|
if(GetTickCount()>ack_timeout)
|
||||||
ReSendPackets(sent_packet);//Resend everything in sent_buffer.
|
ReSendPackets(sent_packet);//sent_buffer에 있는 모든것들을 다시 보내본다.
|
||||||
}
|
}
|
||||||
if (packetbyteremain == 0) {
|
if (packetbyteremain == 0) {
|
||||||
RequestAnalogUpdate();
|
RequestAnalogUpdate();
|
||||||
@@ -1249,8 +1236,8 @@ bool SaveReceivedPacket(const BYTE*ba,int length)
|
|||||||
|
|
||||||
bool GetSerialFromReceivedBuffer(char * ba)
|
bool GetSerialFromReceivedBuffer(char * ba)
|
||||||
{
|
{
|
||||||
//Store only ButtonPressed/Released..
|
//ButtonPressed/Released만 저장해 놓는다..
|
||||||
//Transfer all serial packets.
|
//모든 serial packet을 옮긴다.
|
||||||
if(received_packet>0){
|
if(received_packet>0){
|
||||||
if(received_buffer[0][2]==received_serial){
|
if(received_buffer[0][2]==received_serial){
|
||||||
CopyMemory(ba,received_buffer[0],16);
|
CopyMemory(ba,received_buffer[0],16);
|
||||||
@@ -1277,7 +1264,7 @@ bool QueuePacket(const BYTE *ba,int length)
|
|||||||
|
|
||||||
int PopPacket(BYTE id)
|
int PopPacket(BYTE id)
|
||||||
{
|
{
|
||||||
//lamp.. check by id..
|
//lamp는.. id가..
|
||||||
//search the packet..
|
//search the packet..
|
||||||
for(int i=0;i<sent_packet;i++){
|
for(int i=0;i<sent_packet;i++){
|
||||||
if(sent_buffer[i][3]==id){
|
if(sent_buffer[i][3]==id){
|
||||||
@@ -1440,7 +1427,7 @@ void CBUTTON_GROUP::SetTable(BOOL bFlag/* = true*/)
|
|||||||
|
|
||||||
for (int b = 0; b < MAXBUTTON_TABLE; b++) {
|
for (int b = 0; b < MAXBUTTON_TABLE; b++) {
|
||||||
s_aCtrlLamp[b] = s_aSaveLamp[b];// = s_aButtonTable[b].lamp;
|
s_aCtrlLamp[b] = s_aSaveLamp[b];// = s_aButtonTable[b].lamp;
|
||||||
// s_aButtonTable is the old value, so the initial value is Off
|
// s_aButtonTable는 Old값이므로 초기치는 Off
|
||||||
s_aButtonTable[b].lamp = LAMP_OFF;
|
s_aButtonTable[b].lamp = LAMP_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1452,7 +1439,7 @@ void CBUTTON_GROUP::SetTable(BOOL bFlag/* = true*/)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Restore all tables to original state
|
// 모든 테이블을 원래 상태로
|
||||||
for (int b = 0; b < MAXBUTTON_TABLE; b++) {
|
for (int b = 0; b < MAXBUTTON_TABLE; b++) {
|
||||||
s_aCtrlLamp[b] = s_aSaveLamp[b];
|
s_aCtrlLamp[b] = s_aSaveLamp[b];
|
||||||
}
|
}
|
||||||
@@ -1547,7 +1534,7 @@ void CBUTTON_GROUP::ResetTable(BOOL bFlag/* = true*/)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Turn off all tables
|
// 모든 테이블을 Off
|
||||||
for (int b = 0; b < MAXBUTTON_TABLE; b++) {
|
for (int b = 0; b < MAXBUTTON_TABLE; b++) {
|
||||||
switch(b)
|
switch(b)
|
||||||
{
|
{
|
||||||
@@ -2225,13 +2212,13 @@ void CRIOMAIN::UpdatePadal (DIJOYSTATE &js)
|
|||||||
|
|
||||||
Down Up
|
Down Up
|
||||||
======================
|
======================
|
||||||
<-- (+) (-) -->
|
← (+) (-) →
|
||||||
======================
|
======================
|
||||||
/^
|
↗
|
||||||
g_LeftPedalStart: INT_MAX (+)
|
g_LeftPedalStart: INT_MAX (+)
|
||||||
|
|
||||||
lP = (LONG)g_LeftPedalStart - g_LeftPedal;
|
lP = (LONG)g_LeftPedalStart - g_LeftPedal;
|
||||||
lP result value is always negative
|
lP 결과값은 무조건 음수
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LONG lP = 0;
|
LONG lP = 0;
|
||||||
@@ -2375,9 +2362,9 @@ void CRIOMAIN::UpdateThrottle (DIJOYSTATE &js)
|
|||||||
|
|
||||||
Up Down
|
Up Down
|
||||||
======================
|
======================
|
||||||
<-- (-) (+) -->
|
← (-) (+) →
|
||||||
======================
|
======================
|
||||||
/^
|
↗
|
||||||
g_ThrottleStart: INT_MIN (-)
|
g_ThrottleStart: INT_MIN (-)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -2460,11 +2447,11 @@ void CRIOMAIN::UpdateJoystick (DIJOYSTATE &js)
|
|||||||
*/
|
*/
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
/*
|
/*
|
||||||
Meaning of 80
|
80 의 의미
|
||||||
|
|
||||||
Assuming RIO returns values in range (LEFT:120 ~ RIGHT:-80)
|
RIO (LEFT :120 ~ RIGHT :-80) 까지의 수를 돌려준다고 가정하고
|
||||||
(In the LEFT case) clip values above the RIGHT maximum of 80, and the rest
|
(LEFT의경우) RIGHT 의 최대값 80 이상인 값을 잘라버리고 나머지는
|
||||||
if discarded, LEFT and RIGHT can move at the same speed
|
버릴경우 LEFT 와 RIGHT가 동일한 속도로 움직일수 있다
|
||||||
*/
|
*/
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
LONG lJ;
|
LONG lJ;
|
||||||
|
|||||||
@@ -19,16 +19,16 @@
|
|||||||
#include <MLR\MLRTexture.hpp>
|
#include <MLR\MLRTexture.hpp>
|
||||||
|
|
||||||
#include "MWObject.hpp"
|
#include "MWObject.hpp"
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddraw.h>
|
#include <ddraw.h>
|
||||||
#include <d3d.h>
|
#include <d3d.h>
|
||||||
|
|
||||||
#include <GameOS\render.hpp>
|
#include <GameOS\render.hpp>
|
||||||
#define RADAR_SCALE 2.8f
|
#define RADAR_SCALE 2.8f
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
|
|
||||||
int m_gCool; // hyun: coolant
|
int m_gCool; // 鉉
|
||||||
|
|
||||||
namespace MW4AI
|
namespace MW4AI
|
||||||
{
|
{
|
||||||
@@ -121,22 +121,22 @@ GUIRadarManager::GUIRadarManager() :
|
|||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
//
|
//
|
||||||
|
|
||||||
//sanghoon
|
//상훈
|
||||||
extern bool sh_game_started;
|
extern bool sh_game_started;
|
||||||
|
|
||||||
GUIRadarManager::~GUIRadarManager()
|
GUIRadarManager::~GUIRadarManager()
|
||||||
{
|
{
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
sh_game_started=false;
|
sh_game_started=false;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
delete m_RangeText;
|
delete m_RangeText;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawMapBoundary()
|
void DrawMapBoundary()
|
||||||
{
|
{
|
||||||
//Extracted from DrawImplementation..
|
//DrawImplementation에서 추출해왔음..
|
||||||
//Drawn only once after mission start (operation area on map does not change..)
|
//미션이 시작한 후 한번만 그리게된다.(맵상의 작전 영역은 변하지 않으므로..)
|
||||||
Scalar multx,multz;
|
Scalar multx,multz;
|
||||||
|
|
||||||
multx = 200.0f/(MW4AI::MaxX - MW4AI::MinX);
|
multx = 200.0f/(MW4AI::MaxX - MW4AI::MinX);
|
||||||
@@ -148,7 +148,7 @@ void DrawMapBoundary()
|
|||||||
int numpts = ptlist.GetLength ();
|
int numpts = ptlist.GetLength ();
|
||||||
|
|
||||||
HDC hdcBackImage;
|
HDC hdcBackImage;
|
||||||
radar_device.pDDSBackground->GetDC( &hdcBackImage);//Image for back buffer preparation..
|
radar_device.pDDSBackground->GetDC( &hdcBackImage);//백버퍼 준비용.. 이미지..
|
||||||
HPEN hpenold=(HPEN)SelectObject(hdcBackImage,CreatePen(PS_SOLID,1,RGB(255,0,0)));
|
HPEN hpenold=(HPEN)SelectObject(hdcBackImage,CreatePen(PS_SOLID,1,RGB(255,0,0)));
|
||||||
|
|
||||||
for (int i=0;i<numpts;i++){
|
for (int i=0;i<numpts;i++){
|
||||||
@@ -184,7 +184,7 @@ void DrawMapBoundary()
|
|||||||
|
|
||||||
void GUIRadarManager::Reset (void)
|
void GUIRadarManager::Reset (void)
|
||||||
{
|
{
|
||||||
//sanghoon
|
//상훈
|
||||||
|
|
||||||
MWApplication *m_App;
|
MWApplication *m_App;
|
||||||
m_App = MWApplication::GetInstance ();
|
m_App = MWApplication::GetInstance ();
|
||||||
@@ -192,19 +192,19 @@ void GUIRadarManager::Reset (void)
|
|||||||
bool networking = MWApplication::GetInstance()->networkingFlag;
|
bool networking = MWApplication::GetInstance()->networkingFlag;
|
||||||
if (!networking)
|
if (!networking)
|
||||||
m_RadarMode = 0;
|
m_RadarMode = 0;
|
||||||
//sanghoon
|
//상훈
|
||||||
if(hsh_initialized)
|
if(hsh_initialized)
|
||||||
DrawMapBoundary();
|
DrawMapBoundary();
|
||||||
}
|
}
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
/*
|
/*
|
||||||
char * radar_text[]={
|
char * radar_text[]={
|
||||||
"JUMP\nJET","SHUT\nDOWN","OVER\nRIDE","FLUSH","CROUCH","",
|
"JUMP\nJET","SHUT\nDOWN","OVER\nRIDE","FLUSH","CROUCH","",
|
||||||
"RANGE","RADAR\nMODE","LIGHT\nAMP","SEARCH\nLIGHT","AUTO\nCENTER"
|
"RANGE","RADAR\nMODE","LIGHT\nAMP","SEARCH\nLIGHT","AUTO\nCENTER"
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
//
|
//
|
||||||
@@ -246,7 +246,7 @@ if(!hsh_initialized){
|
|||||||
Check_Pointer(vehicle);
|
Check_Pointer(vehicle);
|
||||||
Check_Pointer(vehicle->GetSensor());
|
Check_Pointer(vehicle->GetSensor());
|
||||||
/*
|
/*
|
||||||
//sanghoon begin: map
|
//상훈 앞 맵
|
||||||
Scalar multx,multz;
|
Scalar multx,multz;
|
||||||
|
|
||||||
multx = 200.0f/(MW4AI::MaxX - MW4AI::MinX);
|
multx = 200.0f/(MW4AI::MaxX - MW4AI::MinX);
|
||||||
@@ -655,7 +655,7 @@ if(!hsh_initialized){
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
// Secondary Maps
|
// Secondary Maps
|
||||||
//Draw map and boundary. (Drawn once since it does not change during game.)
|
//맵과 맵 경계선을 그린다. (게임중에 변하지 않으므로 한번만 그린다.)
|
||||||
|
|
||||||
if(!radar_device.MapDrawn){
|
if(!radar_device.MapDrawn){
|
||||||
extern char AssetsDirectory1[MAX_PATH];
|
extern char AssetsDirectory1[MAX_PATH];
|
||||||
@@ -724,8 +724,8 @@ if(!hsh_initialized){
|
|||||||
Check_Pointer(vehicle->GetSensor());
|
Check_Pointer(vehicle->GetSensor());
|
||||||
|
|
||||||
|
|
||||||
///////////////////// MAP BEGIN //////////////////////
|
///////////////////// MAP 시작 //////////////////////
|
||||||
/////Torso Sweep draw.. begin
|
/////Torso Sweep그리기.. 시작
|
||||||
Scalar multx,multz;
|
Scalar multx,multz;
|
||||||
|
|
||||||
multx = 200.0f/(MW4AI::MaxX - MW4AI::MinX);
|
multx = 200.0f/(MW4AI::MaxX - MW4AI::MinX);
|
||||||
@@ -759,16 +759,16 @@ if(!hsh_initialized){
|
|||||||
radar_device.DrawQuad(-pos.x+240-1,-pos.y+508-1,-pos.x+240+2,-pos.y+508+2,0xFF0000C0);
|
radar_device.DrawQuad(-pos.x+240-1,-pos.y+508-1,-pos.x+240+2,-pos.y+508+2,0xFF0000C0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////Torso Sweep draw.. end
|
/////Torso Sweep그리기.. 끝
|
||||||
|
|
||||||
//Draw objects on map.
|
//맵상에 오브젝트들 그리기.
|
||||||
{
|
{
|
||||||
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
||||||
MWObject *hsh_current_object;
|
MWObject *hsh_current_object;
|
||||||
for(i=0;i<vehicle->GetSensor()->numberOfContacts;i++){
|
for(i=0;i<vehicle->GetSensor()->numberOfContacts;i++){
|
||||||
hsh_current_object=vehicle->GetSensor()->GetSensorData()[i]->object.GetCurrent();
|
hsh_current_object=vehicle->GetSensor()->GetSensorData()[i]->object.GetCurrent();
|
||||||
if (hsh_current_object != NULL){
|
if (hsh_current_object != NULL){
|
||||||
bool draw_contact = true;//Flag: whether to draw this object..
|
bool draw_contact = true;//해당 오브젝트를 그릴것인지..에대한 플래그..
|
||||||
|
|
||||||
// MSL 5.02 Bot on Map
|
// MSL 5.02 Bot on Map
|
||||||
if (hsh_current_object->GetAI()==NULL && (MWApplication::GetInstance()->networkingFlag == false))draw_contact = false;
|
if (hsh_current_object->GetAI()==NULL && (MWApplication::GetInstance()->networkingFlag == false))draw_contact = false;
|
||||||
@@ -833,10 +833,10 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////// MAP END //////////////////////
|
///////////////////// MAP 끝 //////////////////////
|
||||||
|
|
||||||
|
|
||||||
///////////////////// RADAR BEGIN //////////////////////
|
///////////////////// RADAR 시작 //////////////////////
|
||||||
|
|
||||||
radar_device.pD3DDevice->SetTexture(0,0);
|
radar_device.pD3DDevice->SetTexture(0,0);
|
||||||
|
|
||||||
@@ -855,7 +855,7 @@ if(!hsh_initialized){
|
|||||||
world_to_vehicle.Invert(vehicle_to_world);
|
world_to_vehicle.Invert(vehicle_to_world);
|
||||||
|
|
||||||
|
|
||||||
// Draw boundary line..
|
// 경계선 그리기..
|
||||||
|
|
||||||
Mission *miss;
|
Mission *miss;
|
||||||
miss = Mission::GetInstance ();
|
miss = Mission::GetInstance ();
|
||||||
@@ -900,7 +900,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Draw Torso View..
|
//Torso View그리기..
|
||||||
//HSH_RenderRadarTorsoView(-m_TorsoTwist);
|
//HSH_RenderRadarTorsoView(-m_TorsoTwist);
|
||||||
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
||||||
radar_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
|
radar_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
|
||||||
@@ -914,7 +914,7 @@ if(!hsh_initialized){
|
|||||||
radar_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MAGFILTER, D3DTFG_POINT );
|
radar_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MAGFILTER, D3DTFG_POINT );
|
||||||
radar_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MINFILTER, D3DTFG_POINT );
|
radar_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MINFILTER, D3DTFG_POINT );
|
||||||
|
|
||||||
//Draw Radar range.
|
//Radar범위 그리기.
|
||||||
char text[10];
|
char text[10];
|
||||||
if (radarRange != radarRangeOrg)
|
if (radarRange != radarRangeOrg)
|
||||||
sprintf (text,"NoLmt");
|
sprintf (text,"NoLmt");
|
||||||
@@ -923,11 +923,11 @@ if(!hsh_initialized){
|
|||||||
//HSH_DrawRadarNumber(345,386,text,1);
|
//HSH_DrawRadarNumber(345,386,text,1);
|
||||||
radar_device.pFont[1].DrawText(80,350,0xFFFFFFFF,text,TEXTALIGN_ORG);
|
radar_device.pFont[1].DrawText(80,350,0xFFFFFFFF,text,TEXTALIGN_ORG);
|
||||||
|
|
||||||
//Draw ActiveMode..
|
//ActiveMode그리기..
|
||||||
char* modechar=(vehicle->GetSensor ()->GetSensorMode () == Sensor::ActiveMode)?"Active":"Passive";
|
char* modechar=(vehicle->GetSensor ()->GetSensorMode () == Sensor::ActiveMode)?"Active":"Passive";
|
||||||
radar_device.pFont[1].DrawText(395,350,0xFFFFFF,modechar,TEXTALIGN_ORG);
|
radar_device.pFont[1].DrawText(395,350,0xFFFFFF,modechar,TEXTALIGN_ORG);
|
||||||
|
|
||||||
//Draw buildings.
|
//빌딩 그리기
|
||||||
MWObject *current_object;
|
MWObject *current_object;
|
||||||
for(i=0;i<vehicle->GetSensor()->numberOfBuildingContacts;i++)
|
for(i=0;i<vehicle->GetSensor()->numberOfBuildingContacts;i++)
|
||||||
{
|
{
|
||||||
@@ -993,7 +993,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw Objects.
|
//Object그리기.
|
||||||
for(i=0;i<vehicle->GetSensor()->numberOfContacts;i++){
|
for(i=0;i<vehicle->GetSensor()->numberOfContacts;i++){
|
||||||
current_object=vehicle->GetSensor()->GetSensorData()[i]->object.GetCurrent();
|
current_object=vehicle->GetSensor()->GetSensorData()[i]->object.GetCurrent();
|
||||||
if (current_object != NULL){
|
if (current_object != NULL){
|
||||||
@@ -1081,7 +1081,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw Navigation Points.
|
//Navigation Point그리기.
|
||||||
j=0;
|
j=0;
|
||||||
ChainIteratorOf<NavPoint *> iter (NavPoint::s_RevealedNavPoints);
|
ChainIteratorOf<NavPoint *> iter (NavPoint::s_RevealedNavPoints);
|
||||||
NavPoint *nav;
|
NavPoint *nav;
|
||||||
@@ -1136,7 +1136,7 @@ if(!hsh_initialized){
|
|||||||
radar_device.DrawTexture(posx2,posy2,0xFFFFFFFF,(60+id*12),0,(60+id*12)+12,12);
|
radar_device.DrawTexture(posx2,posy2,0xFFFFFFFF,(60+id*12),0,(60+id*12)+12,12);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////// RADAR END //////////////////////
|
///////////////////// RADAR 끝 //////////////////////
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1586,23 +1586,23 @@ if(!hsh_initialized){
|
|||||||
|
|
||||||
|
|
||||||
DWORD color = MakeColor (64,64,64,255);
|
DWORD color = MakeColor (64,64,64,255);
|
||||||
//Bar gauge background baseline..
|
//막대 게이지의 백그라운드.. 기준..
|
||||||
m_Textures[1]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
m_Textures[1]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
||||||
color = MakeColor (255,255,255,255);
|
color = MakeColor (255,255,255,255);
|
||||||
loc.y += size.y - targetyval;
|
loc.y += size.y - targetyval;
|
||||||
size.y = (Scalar) targetyval;
|
size.y = (Scalar) targetyval;
|
||||||
m_Textures[0]->TopLeft (m_Textures[0]->Left (),(Scalar) (m_BaseBottom - targetyval));
|
m_Textures[0]->TopLeft (m_Textures[0]->Left (),(Scalar) (m_BaseBottom - targetyval));
|
||||||
m_Textures[0]->BlendMode (gos_BlendDecal);
|
m_Textures[0]->BlendMode (gos_BlendDecal);
|
||||||
//Draw tri-color bar gauge.. (value adjusted by modifying clip size..)
|
//삼색 막대 게이지 그리기..(clipping size를 조절함으로써.. 값을 조절하는 효과를 나타낸다.)
|
||||||
|
|
||||||
m_Textures[0]->Draw (loc,size,color,HUDTexture::NO_FLIP);
|
m_Textures[0]->Draw (loc,size,color,HUDTexture::NO_FLIP);
|
||||||
color = MakeColor (0,125,0,250);
|
color = MakeColor (0,125,0,250);
|
||||||
size = Size ();
|
size = Size ();
|
||||||
loc = Location ();
|
loc = Location ();
|
||||||
//Bar gauge frame.
|
//막대 게이지의 프레임.
|
||||||
DrawFrame ((int) (loc.x-2),(int) (loc.y-2),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
DrawFrame ((int) (loc.x-2),(int) (loc.y-2),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
|
|
||||||
//Temperature text frame..
|
//온도 텍스트의 프레임..
|
||||||
DrawFrame (261,542,303,560,color);
|
DrawFrame (261,542,303,560,color);
|
||||||
m_HeatText->TopLeft (261,542);
|
m_HeatText->TopLeft (261,542);
|
||||||
m_HeatText->BottomRight (303,560);
|
m_HeatText->BottomRight (303,560);
|
||||||
@@ -1611,23 +1611,23 @@ if(!hsh_initialized){
|
|||||||
DWORD textw,texth;
|
DWORD textw,texth;
|
||||||
m_HeatText->DrawSize (textw,texth);
|
m_HeatText->DrawSize (textw,texth);
|
||||||
|
|
||||||
//Display temperature in its designated color. (Gauge is a texture, no color spec needed.)
|
//온도를 정해진 색으로 출력한다.(게이지는 텍스쳐이므로 색을 지정할 필요가 없다.)
|
||||||
m_HeatText->Draw (Point3D (282.0f - (textw/2.0f),551.0f - (texth/2.0f),0.9f));
|
m_HeatText->Draw (Point3D (282.0f - (textw/2.0f),551.0f - (texth/2.0f),0.9f));
|
||||||
DrawLine (304,549,310,549,color);
|
DrawLine (304,549,310,549,color);
|
||||||
DrawLine (309,(int) heaty,309,549,color);
|
DrawLine (309,(int) heaty,309,549,color);
|
||||||
DrawLine ((int) (loc.x-2),(int) (heaty),309,(int) (heaty),color);
|
DrawLine ((int) (loc.x-2),(int) (heaty),309,(int) (heaty),color);
|
||||||
}else if(sh_step==1){
|
}else if(sh_step==1){
|
||||||
//radar manager is not called on shutdown.. state updated additionally here.
|
//radar manager는 shutdown 시에 호출되지 않으므로.. 여기서 추가적으로 state를 업데이트 시켜준다.
|
||||||
MechWarrior4::VehicleInterface* p = MechWarrior4::VehicleInterface::GetInstance();
|
MechWarrior4::VehicleInterface* p = MechWarrior4::VehicleInterface::GetInstance();
|
||||||
p->GetGUIRadarStates(radar_device.recent_state);
|
p->GetGUIRadarStates(radar_device.recent_state);
|
||||||
|
|
||||||
int targetyval = (int) ((m_Heat * 23)/100.0f);
|
int targetyval = (int) ((m_Heat * 23)/100.0f);
|
||||||
Clamp (targetyval,0,22);
|
Clamp (targetyval,0,22);
|
||||||
//What is the range of heat??? 0~100???
|
//heat의 범위는??? 0~100???
|
||||||
|
|
||||||
//Draw current temperature only, without the target.
|
//target은 그리지 않고 현재 온도만 그린다.
|
||||||
float sizey=256;
|
float sizey=256;
|
||||||
//Draw tri-color bar gauge.. (value adjusted by modifying clip size..)
|
//삼색 막대 게이지 그리기..(clipping size를 조절함으로써.. 값을 조절하는 효과를 나타낸다.)
|
||||||
{
|
{
|
||||||
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
||||||
//backbground image
|
//backbground image
|
||||||
@@ -1642,7 +1642,7 @@ if(!hsh_initialized){
|
|||||||
radar_device.pD3DDevice->SetTexture(0,0);
|
radar_device.pD3DDevice->SetTexture(0,0);
|
||||||
radar_device.DrawFrame(54-1,630-188-3,80+1,630+3,0xFFFFFFFF);
|
radar_device.DrawFrame(54-1,630-188-3,80+1,630+3,0xFFFFFFFF);
|
||||||
}
|
}
|
||||||
//Text
|
//텍스트
|
||||||
{
|
{
|
||||||
char buf[16];
|
char buf[16];
|
||||||
// MSL 5.02 Heat Scale Header
|
// MSL 5.02 Heat Scale Header
|
||||||
@@ -1664,7 +1664,7 @@ HUDJump::HUDJump ()
|
|||||||
m_TargetJump = -1.0f;
|
m_TargetJump = -1.0f;
|
||||||
Location (Point3D (467,539,0.9f));
|
Location (Point3D (467,539,0.9f));
|
||||||
Size (Point3D (7,49,0.9f));
|
Size (Point3D (7,49,0.9f));
|
||||||
//Small 'j' character... <==actually barely visible.
|
//j라고 하는 작은 글자... <==실제로는 잘 보이지 않는다.
|
||||||
AddTexture ("hud\\hud4",0,98,200,106,207);
|
AddTexture ("hud\\hud4",0,98,200,106,207);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1703,14 +1703,14 @@ if(!hsh_initialized){
|
|||||||
size = Size ();
|
size = Size ();
|
||||||
loc = Location ();
|
loc = Location ();
|
||||||
|
|
||||||
DWORD color = MakeColor (255,255,255,250); // was originally 255,255,255,250
|
DWORD color = MakeColor (255,255,255,250); // 원래 255,255,255,250이었음
|
||||||
//Small 'j' character...
|
//j라고 하는 작은 글자...
|
||||||
m_Textures[0]->Draw (Point3D (loc.x+2,loc.y - m_Textures[0]->Size().y-2.0f,0.9f),m_Textures[0]->Size (),color);
|
m_Textures[0]->Draw (Point3D (loc.x+2,loc.y - m_Textures[0]->Size().y-2.0f,0.9f),m_Textures[0]->Size (),color);
|
||||||
int targetyval = (int) (m_Jump * size.y);
|
int targetyval = (int) (m_Jump * size.y);
|
||||||
|
|
||||||
color = MakeColor (0,125,0,250);
|
color = MakeColor (0,125,0,250);
|
||||||
|
|
||||||
//Green gauge..
|
//녹색 게이지..
|
||||||
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
if ((m_Jump != 0) && (m_Alpha != 0))
|
if ((m_Jump != 0) && (m_Alpha != 0))
|
||||||
{
|
{
|
||||||
@@ -1718,11 +1718,11 @@ if(!hsh_initialized){
|
|||||||
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
}
|
}
|
||||||
|
|
||||||
//White line at the top of gauge..
|
//게이지 맨위의 흰선..
|
||||||
color = MakeColor (255,255,255,200);
|
color = MakeColor (255,255,255,200);
|
||||||
DrawLine ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y-targetyval),color);
|
DrawLine ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y-targetyval),color);
|
||||||
|
|
||||||
//Draw border..
|
//테두리 그리기..
|
||||||
color = MakeColor (0,125,0,250);
|
color = MakeColor (0,125,0,250);
|
||||||
DrawFrame ((int) loc.x,(int) (loc.y),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
DrawFrame ((int) loc.x,(int) (loc.y),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
}else if(sh_step==1){
|
}else if(sh_step==1){
|
||||||
@@ -1736,7 +1736,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Overall almost identical to jumpjet.
|
//전반적으로 jumpjet과 거의 같다.
|
||||||
HUDCoolant::HUDCoolant ()
|
HUDCoolant::HUDCoolant ()
|
||||||
{
|
{
|
||||||
m_Alpha = 255;
|
m_Alpha = 255;
|
||||||
@@ -1745,7 +1745,7 @@ HUDCoolant::HUDCoolant ()
|
|||||||
m_Cool = 100;
|
m_Cool = 100;
|
||||||
Location (Point3D (332,539,0.9f));
|
Location (Point3D (332,539,0.9f));
|
||||||
Size (Point3D (7,49,0.9f));
|
Size (Point3D (7,49,0.9f));
|
||||||
//Small 'C' character..
|
//C라고 하는 작은 글자..
|
||||||
AddTexture ("hud\\hud4",0,88,200,96,207);
|
AddTexture ("hud\\hud4",0,88,200,96,207);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1782,7 +1782,7 @@ if(!hsh_initialized){
|
|||||||
loc = Location ();
|
loc = Location ();
|
||||||
|
|
||||||
DWORD color = MakeColor (0,125,0,250);
|
DWORD color = MakeColor (0,125,0,250);
|
||||||
//Small 'C' character..
|
//C라고 하는 작은 글자..
|
||||||
m_Textures[0]->Draw (Point3D (loc.x+2,loc.y - m_Textures[0]->Size().y-2.0f,0.9f),m_Textures[0]->Size (),color);
|
m_Textures[0]->Draw (Point3D (loc.x+2,loc.y - m_Textures[0]->Size().y-2.0f,0.9f),m_Textures[0]->Size (),color);
|
||||||
|
|
||||||
m_gCool = m_Cool;
|
m_gCool = m_Cool;
|
||||||
@@ -1790,19 +1790,19 @@ if(!hsh_initialized){
|
|||||||
Clamp (targetyval,0,(int) size.y);
|
Clamp (targetyval,0,(int) size.y);
|
||||||
|
|
||||||
color = MakeColor (0,100,255,250);
|
color = MakeColor (0,100,255,250);
|
||||||
//Draw gauge..
|
//게이지 그리기..
|
||||||
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
if ((m_Cool != 0) && (m_Alpha != 0))
|
if ((m_Cool != 0) && (m_Alpha != 0))
|
||||||
{
|
{
|
||||||
//When flushed.. draw white blinking effect...
|
//flush했을때.. 흰색으로 깜박이는 효과 그리기...
|
||||||
color = MakeColor (255,255,255,m_Alpha);
|
color = MakeColor (255,255,255,m_Alpha);
|
||||||
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
my_DrawRect ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
}
|
}
|
||||||
color = MakeColor (255,255,255,200);
|
color = MakeColor (255,255,255,200);
|
||||||
//White line above gauge..
|
//게이지 위쪽의 흰선..
|
||||||
DrawLine ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y-targetyval),color);
|
DrawLine ((int) (loc.x),(int) (loc.y+size.y-targetyval),(int) (loc.x+size.x),(int) (loc.y+size.y-targetyval),color);
|
||||||
|
|
||||||
//Frame surrounding gauge..
|
//게이지를 둘러싸는 프레임..
|
||||||
color = MakeColor (0,125,0,250);
|
color = MakeColor (0,125,0,250);
|
||||||
DrawFrame ((int) loc.x,(int) (loc.y),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
DrawFrame ((int) loc.x,(int) (loc.y),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
}else if(sh_step==1){
|
}else if(sh_step==1){
|
||||||
@@ -1817,7 +1817,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//HUD Component displaying speed...
|
//속도를 나타내는... HUD Component
|
||||||
namespace NHUDSPEED
|
namespace NHUDSPEED
|
||||||
{
|
{
|
||||||
// const int for_speed_box[12] = {0,4,8,12,16,20,24,28,32,36,40,44};
|
// const int for_speed_box[12] = {0,4,8,12,16,20,24,28,32,36,40,44};
|
||||||
@@ -1928,25 +1928,25 @@ if(!hsh_initialized){
|
|||||||
speedy = loc.y + 56 - fred;
|
speedy = loc.y + 56 - fred;
|
||||||
|
|
||||||
DWORD color = MakeColor (255,255,255,255);
|
DWORD color = MakeColor (255,255,255,255);
|
||||||
//Gauge background tick marks..
|
//게이지 백그라운드 눈금..
|
||||||
m_Textures[1]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
m_Textures[1]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
||||||
loc.y += top;
|
loc.y += top;
|
||||||
size.y = (Scalar) bottom - top;
|
size.y = (Scalar) bottom - top;
|
||||||
|
|
||||||
//Draw tri-color bar gauge.. (value adjusted by modifying clip size..)
|
//삼색 막대 게이지 그리기..(clipping size를 조절함으로써.. 값을 조절하는 효과를 나타낸다.)
|
||||||
|
|
||||||
m_Textures[0]->TopLeft (m_Textures[0]->Left (),(Scalar) (top));
|
m_Textures[0]->TopLeft (m_Textures[0]->Left (),(Scalar) (top));
|
||||||
m_Textures[0]->BottomRight (m_Textures[0]->Right (),(Scalar) (bottom));
|
m_Textures[0]->BottomRight (m_Textures[0]->Right (),(Scalar) (bottom));
|
||||||
m_Textures[0]->BlendMode (gos_BlendDecal);
|
m_Textures[0]->BlendMode (gos_BlendDecal);
|
||||||
//Colored gauge.. currently green.
|
//colored 게이지..녹색으로 되어 있다.
|
||||||
m_Textures[0]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
m_Textures[0]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
||||||
color = MakeColor (0,125,0,250);
|
color = MakeColor (0,125,0,250);
|
||||||
size = Size ();
|
size = Size ();
|
||||||
loc = Location ();
|
loc = Location ();
|
||||||
//Draw frame surrounding gauge..
|
//게이지를 둘러싸는.. 프레임 그리기..
|
||||||
DrawFrame ((int) (loc.x-2),(int) (loc.y-2),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
DrawFrame ((int) (loc.x-2),(int) (loc.y-2),(int) (loc.x+size.x),(int) (loc.y+size.y),color);
|
||||||
|
|
||||||
//Speed display frame...
|
//속도 표시하는 프레임...
|
||||||
DrawFrame (506,537,548,555,color);
|
DrawFrame (506,537,548,555,color);
|
||||||
m_SpeedText->TopLeft (506,537);
|
m_SpeedText->TopLeft (506,537);
|
||||||
m_SpeedText->BottomRight (548,555);
|
m_SpeedText->BottomRight (548,555);
|
||||||
@@ -1958,15 +1958,15 @@ if(!hsh_initialized){
|
|||||||
|
|
||||||
DWORD textw,texth;
|
DWORD textw,texth;
|
||||||
m_SpeedText->DrawSize (textw,texth);
|
m_SpeedText->DrawSize (textw,texth);
|
||||||
//Speed text.. color is green/blue depending on forward/backward direction.....
|
//속도 표시하는 텍스트.. 앞/뒤 방향에 따라서 색이 녹식/파란색.....으로 된다.
|
||||||
m_SpeedText->Draw (Point3D (527.0f - (textw/2.0f),546.0f - (texth/2.0f),0.9f));
|
m_SpeedText->Draw (Point3D (527.0f - (textw/2.0f),546.0f - (texth/2.0f),0.9f));
|
||||||
//3-segment line connecting speed frame to gauge frame..
|
//속도프레임-게이지 프레임 연결하는 3 segment라인..
|
||||||
DrawLine (498,549,506,549,color);
|
DrawLine (498,549,506,549,color);
|
||||||
DrawLine (498,(int) speedy,498,549,color);
|
DrawLine (498,(int) speedy,498,549,color);
|
||||||
DrawLine ((int) (loc.x+size.x+2),(int) (speedy),498,(int) (speedy),color);
|
DrawLine ((int) (loc.x+size.x+2),(int) (speedy),498,(int) (speedy),color);
|
||||||
}else if(sh_step==1){
|
}else if(sh_step==1){
|
||||||
//Not ideal, but draw mission time alongside speed display.
|
//적절하지는 않지만.. 미션 시간을 speed에서 같이 그린다.
|
||||||
//Draw mission timer... taken from DrawImplementation in hudtimer.cpp..
|
//미션 시간 그리기...hudtimer.cpp에 DrawImplementation에서 따온것임..
|
||||||
{
|
{
|
||||||
MWMission *mwmiss = Cast_Object (MWMission *,Mission::GetInstance ());
|
MWMission *mwmiss = Cast_Object (MWMission *,Mission::GetInstance ());
|
||||||
Verify (mwmiss);
|
Verify (mwmiss);
|
||||||
@@ -1983,7 +1983,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
|
|
||||||
float offset;
|
float offset;
|
||||||
//126,62.. speed 188.. divided 2:1..
|
//126,62.. 188의 속도.. 2:1로 나누면..
|
||||||
|
|
||||||
//backbground image
|
//backbground image
|
||||||
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
||||||
@@ -2094,8 +2094,8 @@ HUDNav::HUDNav()
|
|||||||
navPointName = new HUDText ();
|
navPointName = new HUDText ();
|
||||||
navPointRange = new HUDNumberText ();
|
navPointRange = new HUDNumberText ();
|
||||||
playerAngle = new HUDNumberText ();
|
playerAngle = new HUDNumberText ();
|
||||||
navPointRange->SetSize (HUDText::MEDIUM_SIZE); // was originally SMALL_SIZE
|
navPointRange->SetSize (HUDText::MEDIUM_SIZE); // 원래 SMALL_SIZE였음
|
||||||
playerAngle->SetSize (HUDText::MEDIUM_SIZE); // was originally SMALL_SIZE
|
playerAngle->SetSize (HUDText::MEDIUM_SIZE); // 원래 SMALL_SIZE였음
|
||||||
|
|
||||||
m_NavAlphaTime = 0;
|
m_NavAlphaTime = 0;
|
||||||
|
|
||||||
@@ -2203,14 +2203,14 @@ if(!hsh_initialized){
|
|||||||
m_Textures[10]->TopLeft ((Scalar) (m_BaseLeft + offset),m_Textures[10]->Top ());
|
m_Textures[10]->TopLeft ((Scalar) (m_BaseLeft + offset),m_Textures[10]->Top ());
|
||||||
size = m_Textures[10]->Size ();
|
size = m_Textures[10]->Size ();
|
||||||
m_Textures[10]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
m_Textures[10]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
||||||
//Main portion of aux2 ruler... (if not displayable here, use next one.)
|
//2번 aux의 줄자..의 대부분...(이걸로 표시되지 않을때.. 다음걸로 표시한다.)
|
||||||
#if 1
|
#if 1
|
||||||
loc.x += size.x;
|
loc.x += size.x;
|
||||||
loc.x-=1;
|
loc.x-=1;
|
||||||
m_Textures[13]->BottomRight ((Scalar) m_BaseLeft+offset,m_Textures[13]->Bottom ());
|
m_Textures[13]->BottomRight ((Scalar) m_BaseLeft+offset,m_Textures[13]->Bottom ());
|
||||||
size = m_Textures[13]->Size ();
|
size = m_Textures[13]->Size ();
|
||||||
m_Textures[13]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
m_Textures[13]->Draw (loc,size,color,HUDTexture::NO_FLIP,true);
|
||||||
//Short tick marks of aux2 ruler....
|
//2번 aux의 줄자의 짦은 부분....
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int heading = m_PlayerFacing;
|
int heading = m_PlayerFacing;
|
||||||
@@ -2223,7 +2223,7 @@ if(!hsh_initialized){
|
|||||||
bool draw = false;
|
bool draw = false;
|
||||||
if (dir < 0)
|
if (dir < 0)
|
||||||
dir += 360;
|
dir += 360;
|
||||||
else if (dir > 360)//sanghoon fix: original was --> "else if (dir > 360)"..
|
else if (dir > 360)//상훈 고침.. 원래는 --> "else if (dir > 360)" 였음..
|
||||||
dir -= 360;
|
dir -= 360;
|
||||||
switch (dir)
|
switch (dir)
|
||||||
{
|
{
|
||||||
@@ -2265,11 +2265,11 @@ if(!hsh_initialized){
|
|||||||
navText[textid]->DrawSize (dx,dy);
|
navText[textid]->DrawSize (dx,dy);
|
||||||
textloc.x -= dx/2;
|
textloc.x -= dx/2;
|
||||||
navText[textid]->Draw (textloc);
|
navText[textid]->Draw (textloc);
|
||||||
//Aux2 bearing display.. 340 350 N 10 20...
|
//2번 aux방위각 표시.. 340 350 N 10 20...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Aux2 mech heading angle display...
|
//2번 aux mech의 방향각도 표시...
|
||||||
color = Color ();
|
color = Color ();
|
||||||
DrawFrame (400-13,10,400+13,22,color);
|
DrawFrame (400-13,10,400+13,22,color);
|
||||||
DWORD dx,dy;
|
DWORD dx,dy;
|
||||||
@@ -2288,7 +2288,7 @@ if(!hsh_initialized){
|
|||||||
size = m_Textures[11]->Size ();
|
size = m_Textures[11]->Size ();
|
||||||
color = Color ();
|
color = Color ();
|
||||||
m_Textures[11]->Draw (Point3D (400.0f,44.0f,0.9f),size,color);
|
m_Textures[11]->Draw (Point3D (400.0f,44.0f,0.9f),size,color);
|
||||||
//Aux2 center indicator.. inverted triangle.. (very small)
|
//2번 aux 중심표시.. 역삼각형..(매우작음)
|
||||||
|
|
||||||
if (m_NavPointRange != -1)
|
if (m_NavPointRange != -1)
|
||||||
{
|
{
|
||||||
@@ -2299,9 +2299,9 @@ if(!hsh_initialized){
|
|||||||
textloc.y = 0;
|
textloc.y = 0;
|
||||||
textloc.z = 0;
|
textloc.z = 0;
|
||||||
// Draw navpoint bug or arrows
|
// Draw navpoint bug or arrows
|
||||||
//Aux2 navigation
|
//2번 aux navigation
|
||||||
//navpoint: draw circle indicating objective (when displayable in ruler)
|
//navpoint bug:... 목표를 나타내는 동그라미를 발한다.(ruler안에 표시가능할때)
|
||||||
//When unable to display in arrow ruler.. show direction with left/right arrow only.
|
//arrow ruler안에 표시가 불가능할때.. 방향만 좌/우 화살표로서 표시한다.
|
||||||
DWORD color = (m_NavAlpha << 24) + 0x00AF00;
|
DWORD color = (m_NavAlpha << 24) + 0x00AF00;
|
||||||
|
|
||||||
size = Size ();
|
size = Size ();
|
||||||
@@ -2346,7 +2346,7 @@ if(!hsh_initialized){
|
|||||||
textloc.y += 5;
|
textloc.y += 5;
|
||||||
textloc.z = 0.9f;
|
textloc.z = 0.9f;
|
||||||
}
|
}
|
||||||
//Draw the name of the point target.
|
//지점 타켓의 이름을 그린다.
|
||||||
DWORD dx,dy;
|
DWORD dx,dy;
|
||||||
navPointName->TopLeft (textloc.x-50.0f,textloc.y-2.0f);
|
navPointName->TopLeft (textloc.x-50.0f,textloc.y-2.0f);
|
||||||
navPointName->BottomRight (textloc.x+50.0f,textloc.y+20.0f);
|
navPointName->BottomRight (textloc.x+50.0f,textloc.y+20.0f);
|
||||||
@@ -2357,7 +2357,7 @@ if(!hsh_initialized){
|
|||||||
navPointName->Draw (textloc);
|
navPointName->Draw (textloc);
|
||||||
textloc.x += dx/2;
|
textloc.x += dx/2;
|
||||||
|
|
||||||
//Draw distance to point target.
|
//지점 타켓의 거리를 그린다.
|
||||||
textloc.y += 12.0f;
|
textloc.y += 12.0f;
|
||||||
navPointName->TopLeft (textloc.x-50.0f,textloc.y-2.0f);
|
navPointName->TopLeft (textloc.x-50.0f,textloc.y-2.0f);
|
||||||
navPointName->BottomRight (textloc.x+50.0f,textloc.y+20.0f);
|
navPointName->BottomRight (textloc.x+50.0f,textloc.y+20.0f);
|
||||||
@@ -2503,7 +2503,7 @@ if(!hsh_initialized){
|
|||||||
if(VehGetShutdownState()!=1)
|
if(VehGetShutdownState()!=1)
|
||||||
{
|
{
|
||||||
mfd_device.DrawTexture(120,140,0xFFFFFFFF,testoffset+1,256,testoffset+402+1,256+18);
|
mfd_device.DrawTexture(120,140,0xFFFFFFFF,testoffset+1,256,testoffset+402+1,256+18);
|
||||||
//Draw bearing above tick marks
|
//눈금위의 방위각 그리기
|
||||||
int heading = m_PlayerFacing;
|
int heading = m_PlayerFacing;
|
||||||
int ii=0;
|
int ii=0;
|
||||||
for (int i=heading-20;i<=heading+20;i++,ii++){
|
for (int i=heading-20;i<=heading+20;i++,ii++){
|
||||||
@@ -2521,7 +2521,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
|
|
||||||
mfd_device.pD3DDevice->SetTexture(0,0);
|
mfd_device.pD3DDevice->SetTexture(0,0);
|
||||||
//Draw current bearing
|
//현재 방위각 그리기
|
||||||
{
|
{
|
||||||
char text[8];
|
char text[8];
|
||||||
wsprintf(text,"%d",(int)m_PlayerFacing);
|
wsprintf(text,"%d",(int)m_PlayerFacing);
|
||||||
@@ -2530,19 +2530,19 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
mfd_device.pD3DDevice->SetTexture(0,mfd_device.pDDSTexture);
|
mfd_device.pD3DDevice->SetTexture(0,mfd_device.pDDSTexture);
|
||||||
|
|
||||||
//Draw center-indicator inverted triangle (very small)
|
//중심표시 역삼각형(매우작음) 그리기
|
||||||
mfd_device.DrawTexture(320-5,140,0xFFFFFFFF,59,30+256,70,39+256);
|
mfd_device.DrawTexture(320-5,140,0xFFFFFFFF,59,30+256,70,39+256);
|
||||||
|
|
||||||
//Draw objective.
|
//목표 그리기.
|
||||||
if (m_NavPointRange != -1){//when a target waypoint exists.
|
if (m_NavPointRange != -1){//목표 지점이 있을때.
|
||||||
int hsh_textpos=0;
|
int hsh_textpos=0;
|
||||||
//Draw objective indicator.
|
//목표 표시 그리기.
|
||||||
if ((m_NavPointFacing > -20) && (m_NavPointFacing < 20)){
|
if ((m_NavPointFacing > -20) && (m_NavPointFacing < 20)){
|
||||||
//When inside bearing range.. draw indicator.
|
//방위각 내에 있을때.. 버그를 그린다.
|
||||||
mfd_device.DrawTexture((int)(320-9-m_NavPointFacing*10),140+4,0xFFFFFFFF,87,28+256,106,47+256);
|
mfd_device.DrawTexture((int)(320-9-m_NavPointFacing*10),140+4,0xFFFFFFFF,87,28+256,106,47+256);
|
||||||
hsh_textpos=(int)(320-m_NavPointFacing*10);
|
hsh_textpos=(int)(320-m_NavPointFacing*10);
|
||||||
}else{
|
}else{
|
||||||
//When outside bearing range.. draw arrow.
|
//방위각 밖에 있을때.. 화살표를 그린다.
|
||||||
if (m_NavPointFacing <= -10){
|
if (m_NavPointFacing <= -10){
|
||||||
mfd_device.DrawTexture(520+4,140,0xFFFFFFFF,3,54+256,39,81+256);
|
mfd_device.DrawTexture(520+4,140,0xFFFFFFFF,3,54+256,39,81+256);
|
||||||
hsh_textpos=520;
|
hsh_textpos=520;
|
||||||
@@ -2552,12 +2552,12 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw objective name and distance (text).
|
//목표 이름과 거리(텍스트) 그리기.
|
||||||
mfd_device.pFont[0].DrawText(hsh_textpos,140+26,0xFFFFFFFF,m_NavPointName,TEXTALIGN_CENTER);
|
mfd_device.pFont[0].DrawText(hsh_textpos,140+26,0xFFFFFFFF,m_NavPointName,TEXTALIGN_CENTER);
|
||||||
mfd_device.pFont[0].DrawText(hsh_textpos,140+46,0xFFFFFFFF,m_NavPointRangeText,TEXTALIGN_CENTER);
|
mfd_device.pFont[0].DrawText(hsh_textpos,140+46,0xFFFFFFFF,m_NavPointRangeText,TEXTALIGN_CENTER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Must add routine to draw score info here..
|
//반드시.. scroe정보 그리는 루틴을 추가할것..
|
||||||
{
|
{
|
||||||
char score[32]={0};
|
char score[32]={0};
|
||||||
char kills[32]={0};
|
char kills[32]={0};
|
||||||
|
|||||||
@@ -51,9 +51,9 @@ namespace MechWarrior4
|
|||||||
Stuff::Scalar m_TorsoTwist;
|
Stuff::Scalar m_TorsoTwist;
|
||||||
int m_RadarMode;
|
int m_RadarMode;
|
||||||
stlport::vector<ShotEntry> m_ShotList;
|
stlport::vector<ShotEntry> m_ShotList;
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
int hsh_fdraw;
|
int hsh_fdraw;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
bool OnShotList (ObjectID who);
|
bool OnShotList (ObjectID who);
|
||||||
void ClipLine (Scalar& xpt1,Scalar& ypt1,Scalar& xpt2,Scalar& ypt2,Scalar cx,Scalar cy,Scalar rad);
|
void ClipLine (Scalar& xpt1,Scalar& ypt1,Scalar& xpt2,Scalar& ypt2,Scalar cx,Scalar cy,Scalar rad);
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
void InitComFuncs (void);
|
void InitComFuncs (void);
|
||||||
void KillComFuncs (void);
|
void KillComFuncs (void);
|
||||||
|
|
||||||
// hyun begin
|
// úè - start
|
||||||
typedef long LONG;
|
typedef long LONG;
|
||||||
typedef struct DIJOYSTATE {
|
typedef struct DIJOYSTATE {
|
||||||
LONG lX;
|
LONG lX;
|
||||||
@@ -141,7 +141,7 @@ extern void (__stdcall *g_pfnRIO_ButtonEvent)(BYTE* by);
|
|||||||
extern void __stdcall RIO_Joy(DIJOYSTATE& js);
|
extern void __stdcall RIO_Joy(DIJOYSTATE& js);
|
||||||
extern void __stdcall RIO_ButEvent(BYTE* by);
|
extern void __stdcall RIO_ButEvent(BYTE* by);
|
||||||
|
|
||||||
// hyun end
|
// úè - end
|
||||||
|
|
||||||
namespace MW4AI
|
namespace MW4AI
|
||||||
{
|
{
|
||||||
@@ -200,13 +200,13 @@ Stuff::Scalar MechWarrior4::DECRYPT (Stuff::Scalar value)
|
|||||||
void
|
void
|
||||||
MechWarrior4::InitializeClasses(Stuff::NotationFile *startup_ini)
|
MechWarrior4::InitializeClasses(Stuff::NotationFile *startup_ini)
|
||||||
{
|
{
|
||||||
// hyun begin
|
// úè - start
|
||||||
if (g_bUseOrgJoy)
|
if (g_bUseOrgJoy)
|
||||||
g_pfnRIO_Joy = NULL;
|
g_pfnRIO_Joy = NULL;
|
||||||
else
|
else
|
||||||
g_pfnRIO_Joy = RIO_Joy;
|
g_pfnRIO_Joy = RIO_Joy;
|
||||||
g_pfnRIO_ButtonEvent = RIO_ButEvent;
|
g_pfnRIO_ButtonEvent = RIO_ButEvent;
|
||||||
// hyun end
|
// úè - end
|
||||||
|
|
||||||
Verify(!g_LibraryHeap);
|
Verify(!g_LibraryHeap);
|
||||||
g_LibraryHeap = gos_CreateMemoryHeap("MechWarrior4(All)");
|
g_LibraryHeap = gos_CreateMemoryHeap("MechWarrior4(All)");
|
||||||
@@ -753,8 +753,8 @@ void
|
|||||||
gos_DestroyMemoryHeap(g_LibraryHeap);
|
gos_DestroyMemoryHeap(g_LibraryHeap);
|
||||||
g_LibraryHeap = NULL;
|
g_LibraryHeap = NULL;
|
||||||
|
|
||||||
// hyun begin
|
// úè - start
|
||||||
g_pfnRIO_ButtonEvent = NULL;
|
g_pfnRIO_ButtonEvent = NULL;
|
||||||
g_pfnRIO_Joy = NULL;
|
g_pfnRIO_Joy = NULL;
|
||||||
// hyun end
|
// úè - end
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,19 +57,6 @@
|
|||||||
|
|
||||||
#include "mechspecs.cpp"
|
#include "mechspecs.cpp"
|
||||||
|
|
||||||
// [16 pilots + 1 cameraship fix]
|
|
||||||
//
|
|
||||||
// A cameraship seat occupies a network (DirectPlay) slot but pilots no 'Mech, so slots must
|
|
||||||
// be reserved for cameraships on top of the pilot cap, and cameraships must NOT be counted
|
|
||||||
// against the 'Mech cap.
|
|
||||||
//
|
|
||||||
// The reserve has to be a CONSTANT rather than being derived from
|
|
||||||
// (CTCL_GetTeslaCountAll() - CTCL_GetTeslaCount()): the CTCL tesla table is only populated
|
|
||||||
// when CTCL_IsConsoleOrCOOP() is true (see ctcl.cpp), so on a pod - including the cameraship
|
|
||||||
// pod, which is the machine that actually creates the network session in CTCL_DoCreateGame()
|
|
||||||
// - both counters return 0 and the reserve collapsed to +0.
|
|
||||||
#define MW4_CAMERASHIP_RESERVE 4 // must be >= MAX_CAMERAS in ctcl.cpp
|
|
||||||
|
|
||||||
// MSL 5.03 Mechview
|
// MSL 5.03 Mechview
|
||||||
void __stdcall CTCL_AfterBeginScene();
|
void __stdcall CTCL_AfterBeginScene();
|
||||||
void __stdcall CTCL_UpdateMechView();
|
void __stdcall CTCL_UpdateMechView();
|
||||||
@@ -145,10 +132,6 @@ extern SCRIPTCALLBACK(CTCL_GetMissionState);
|
|||||||
extern SCRIPTCALLBACK(CTCL_DoBreak);
|
extern SCRIPTCALLBACK(CTCL_DoBreak);
|
||||||
extern SCRIPTCALLBACK(CTCL_IsGameLoaded);
|
extern SCRIPTCALLBACK(CTCL_IsGameLoaded);
|
||||||
extern SCRIPTCALLBACK(CTCL_DoReprint);
|
extern SCRIPTCALLBACK(CTCL_DoReprint);
|
||||||
extern SCRIPTCALLBACK(CTCL_LoadAutoFile);
|
|
||||||
extern SCRIPTCALLBACK(CTCL_GetAutoSlotName);
|
|
||||||
extern SCRIPTCALLBACK(CTCL_GetAutoSlotMech);
|
|
||||||
extern SCRIPTCALLBACK(CTCL_GetAutoSlotInt);
|
|
||||||
extern SCRIPTCALLBACK(CTCL_CheckPlayMovie);
|
extern SCRIPTCALLBACK(CTCL_CheckPlayMovie);
|
||||||
extern SCRIPTCALLBACK(CTCL_CheckCoinCounts);
|
extern SCRIPTCALLBACK(CTCL_CheckCoinCounts);
|
||||||
extern SCRIPTCALLBACK(CTCL_CheckUseJPD);
|
extern SCRIPTCALLBACK(CTCL_CheckUseJPD);
|
||||||
@@ -175,54 +158,6 @@ int g_nWhyPaused = 0; // 0: not paused - invitation in menu-state, 1: briefing,
|
|||||||
extern SCRIPTCALLBACK(CTCL_WhyPaused);
|
extern SCRIPTCALLBACK(CTCL_WhyPaused);
|
||||||
int g_nTimeList_Index = 3; // 3rd item in listbox...
|
int g_nTimeList_Index = 3; // 3rd item in listbox...
|
||||||
int g_nTimeList_Value = 7; // 7 minutes
|
int g_nTimeList_Value = 7; // 7 minutes
|
||||||
// [RookieMission] options.ini overrides ? defaults match the hardcoded script values
|
|
||||||
char g_szRookieMission[256] = "ScarabStronghold - Attrition";
|
|
||||||
char* g_pszRookieMission = g_szRookieMission; // pointer used for script registration
|
|
||||||
int g_nRookieGameType = 2; // Attrition index in game-type list
|
|
||||||
int g_nRookieVisibility = 0; // 0=clear
|
|
||||||
int g_nRookieWeather = 0; // 0=off
|
|
||||||
int g_nRookieTimeOfDay = 0; // 0=day
|
|
||||||
int g_nRookieTimeLimit = -1; // -1=use g_nTimeList_Value
|
|
||||||
int g_nRookieRadar = 0; // 0=novice
|
|
||||||
int g_nRookieHeat = 0; // 0=off
|
|
||||||
int g_nRookieFriendlyFire= 0;
|
|
||||||
int g_nRookieSplash = 0;
|
|
||||||
int g_nRookieUnlimitedAmmo = 1; // 1=on (be cautious)
|
|
||||||
int g_nRookieWeaponJam = 0;
|
|
||||||
int g_nRookieAdvanceMode = 0;
|
|
||||||
int g_nRookieArmorMode = 0;
|
|
||||||
// [automaticmode] options.ini ? Load File button
|
|
||||||
struct SAutoFileSlot {
|
|
||||||
char szName[64]; // pilot name
|
|
||||||
char szMech[64]; // mech display name (matched against mech[] array)
|
|
||||||
int nType; // 0=empty, 1=player, 2-9=bot difficulty level
|
|
||||||
int nTeam;
|
|
||||||
int nSkin;
|
|
||||||
int nDecal;
|
|
||||||
};
|
|
||||||
static SAutoFileSlot g_aAutoSlots[16];
|
|
||||||
static int g_nAutoSlotsCount = 0;
|
|
||||||
static int g_bAutomaticMode = 0;
|
|
||||||
static char g_szAutomaticFile[MAX_PATH] = "";
|
|
||||||
// [automaticmode] game option globals ? separate from Rookie Mission defaults to preserve Default button behavior
|
|
||||||
static char g_szAutoMission[256] = "";
|
|
||||||
static char* g_pszAutoMission = g_szAutoMission;
|
|
||||||
static int g_nAutoGameType = 2; // Attrition
|
|
||||||
static int g_nAutoVisibility = 0;
|
|
||||||
static int g_nAutoWeather = 0;
|
|
||||||
static int g_nAutoTimeOfDay = 0;
|
|
||||||
static int g_nAutoTimeLimit = -1; // -1 = server default
|
|
||||||
static int g_nAutoRadar = 0;
|
|
||||||
static int g_nAutoHeat = 0;
|
|
||||||
static int g_nAutoFriendlyFire = 0;
|
|
||||||
static int g_nAutoSplash = 0;
|
|
||||||
static int g_nAutoUnlimitedAmmo = 1;
|
|
||||||
static int g_nAutoNoReturn = 0;
|
|
||||||
static int g_nAutoWeaponJam = 0;
|
|
||||||
static int g_nAutoAdvanceMode = 0;
|
|
||||||
static int g_nAutoArmorMode = 0;
|
|
||||||
static int g_nAutoTeamAllowed = 0; // 0=FFA 1=team game; set via TeamAllowed= in [mission]
|
|
||||||
static int g_nAutoTeamCount = 2; // number of teams when TeamAllowed=1
|
|
||||||
// MSL 5.06
|
// MSL 5.06
|
||||||
int g_nMechVariant = 0;
|
int g_nMechVariant = 0;
|
||||||
int g_nMechLabOp = 0;
|
int g_nMechLabOp = 0;
|
||||||
@@ -792,55 +727,6 @@ void MW4Shell::StartUp()
|
|||||||
gosScript_RegisterCallback("CTCL_WhyPaused",&CTCL_WhyPaused,GOSVAR_INT,0,NULL);
|
gosScript_RegisterCallback("CTCL_WhyPaused",&CTCL_WhyPaused,GOSVAR_INT,0,NULL);
|
||||||
gosScript_RegisterVariable("g_nTimeList_Index", &g_nTimeList_Index, GOSVAR_INT, 0, NULL);
|
gosScript_RegisterVariable("g_nTimeList_Index", &g_nTimeList_Index, GOSVAR_INT, 0, NULL);
|
||||||
gosScript_RegisterVariable("g_nTimeList_Value", &g_nTimeList_Value, GOSVAR_INT, 0, NULL);
|
gosScript_RegisterVariable("g_nTimeList_Value", &g_nTimeList_Value, GOSVAR_INT, 0, NULL);
|
||||||
// [RookieMission] ini-driven defaults
|
|
||||||
gosScript_RegisterVariable("g_szRookieMission", &g_pszRookieMission, GOSVAR_STRING, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieGameType", &g_nRookieGameType, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieVisibility", &g_nRookieVisibility, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieWeather", &g_nRookieWeather, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieTimeOfDay", &g_nRookieTimeOfDay, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieTimeLimit", &g_nRookieTimeLimit, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieRadar", &g_nRookieRadar, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieHeat", &g_nRookieHeat, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieFriendlyFire",&g_nRookieFriendlyFire, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieSplash", &g_nRookieSplash, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieUnlimitedAmmo",&g_nRookieUnlimitedAmmo,GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieWeaponJam", &g_nRookieWeaponJam, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieAdvanceMode", &g_nRookieAdvanceMode, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nRookieArmorMode", &g_nRookieArmorMode, GOSVAR_INT, 0, NULL);
|
|
||||||
// [automaticmode] callbacks + g_bAutomaticMode variable for script visibility
|
|
||||||
gosScript_RegisterVariable("g_bAutomaticMode", &g_bAutomaticMode, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterCallback("CTCL_LoadAutoFile", &CTCL_LoadAutoFile, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterCallback("CTCL_GetAutoSlotName", &CTCL_GetAutoSlotName, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterCallback("CTCL_GetAutoSlotMech", &CTCL_GetAutoSlotMech, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterCallback("CTCL_GetAutoSlotInt", &CTCL_GetAutoSlotInt, GOSVAR_INT, 0, NULL);
|
|
||||||
{
|
|
||||||
NotationFile opts("options.ini", NotationFile::Standard, true);
|
|
||||||
Page *pAuto = opts.FindPage("automaticmode");
|
|
||||||
if (pAuto) {
|
|
||||||
pAuto->GetEntry("automaticmode", &g_bAutomaticMode);
|
|
||||||
const char *sz = NULL;
|
|
||||||
if (pAuto->GetEntry("automaticfile", &sz) && sz)
|
|
||||||
strncpy(g_szAutomaticFile, sz, sizeof(g_szAutomaticFile)-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// [automaticmode] game option variables (separate from Rookie globals)
|
|
||||||
gosScript_RegisterVariable("g_szAutoMission", &g_pszAutoMission, GOSVAR_STRING, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoGameType", &g_nAutoGameType, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoVisibility", &g_nAutoVisibility, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoWeather", &g_nAutoWeather, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoTimeOfDay", &g_nAutoTimeOfDay, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoTimeLimit", &g_nAutoTimeLimit, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoRadar", &g_nAutoRadar, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoHeat", &g_nAutoHeat, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoFriendlyFire", &g_nAutoFriendlyFire, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoSplash", &g_nAutoSplash, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoUnlimitedAmmo",&g_nAutoUnlimitedAmmo, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoNoReturn", &g_nAutoNoReturn, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoWeaponJam", &g_nAutoWeaponJam, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoAdvanceMode", &g_nAutoAdvanceMode, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoArmorMode", &g_nAutoArmorMode, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoTeamAllowed", &g_nAutoTeamAllowed, GOSVAR_INT, 0, NULL);
|
|
||||||
gosScript_RegisterVariable("g_nAutoTeamCount", &g_nAutoTeamCount, GOSVAR_INT, 0, NULL);
|
|
||||||
// MSL 5.06
|
// MSL 5.06
|
||||||
gosScript_RegisterVariable("g_nMechVariant", &g_nMechVariant, GOSVAR_INT, 0, NULL);
|
gosScript_RegisterVariable("g_nMechVariant", &g_nMechVariant, GOSVAR_INT, 0, NULL);
|
||||||
gosScript_RegisterVariable("g_nMechLabOp", &g_nMechLabOp, GOSVAR_INT, 0, NULL);
|
gosScript_RegisterVariable("g_nMechLabOp", &g_nMechLabOp, GOSVAR_INT, 0, NULL);
|
||||||
@@ -1222,45 +1108,6 @@ void MW4Shell::ShutDown()
|
|||||||
// jcem - start
|
// jcem - start
|
||||||
gosScript_UnregisterVariable("g_nTimeList_Value");
|
gosScript_UnregisterVariable("g_nTimeList_Value");
|
||||||
gosScript_UnregisterVariable("g_nTimeList_Index");
|
gosScript_UnregisterVariable("g_nTimeList_Index");
|
||||||
// [RookieMission] globals
|
|
||||||
gosScript_UnregisterVariable("g_szRookieMission");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieGameType");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieVisibility");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieWeather");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieTimeOfDay");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieTimeLimit");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieRadar");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieHeat");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieFriendlyFire");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieSplash");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieUnlimitedAmmo");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieWeaponJam");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieAdvanceMode");
|
|
||||||
gosScript_UnregisterVariable("g_nRookieArmorMode");
|
|
||||||
// [automaticmode] callbacks + variable
|
|
||||||
gosScript_UnregisterCallback("CTCL_GetAutoSlotInt");
|
|
||||||
gosScript_UnregisterCallback("CTCL_GetAutoSlotMech");
|
|
||||||
gosScript_UnregisterCallback("CTCL_GetAutoSlotName");
|
|
||||||
gosScript_UnregisterCallback("CTCL_LoadAutoFile");
|
|
||||||
gosScript_UnregisterVariable("g_bAutomaticMode");
|
|
||||||
// [automaticmode] game option variables
|
|
||||||
gosScript_UnregisterVariable("g_nAutoTeamCount");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoTeamAllowed");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoArmorMode");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoAdvanceMode");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoWeaponJam");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoNoReturn");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoUnlimitedAmmo");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoSplash");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoFriendlyFire");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoHeat");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoRadar");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoTimeLimit");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoTimeOfDay");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoWeather");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoVisibility");
|
|
||||||
gosScript_UnregisterVariable("g_nAutoGameType");
|
|
||||||
gosScript_UnregisterVariable("g_szAutoMission");
|
|
||||||
// MSL 5.06
|
// MSL 5.06
|
||||||
gosScript_UnregisterVariable("g_nBlackMech");
|
gosScript_UnregisterVariable("g_nBlackMech");
|
||||||
gosScript_UnregisterVariable("g_nMechVariant");
|
gosScript_UnregisterVariable("g_nMechVariant");
|
||||||
@@ -1981,13 +1828,7 @@ int MW4Shell::SetNetworkMissionParamater(void * instance, int numParms, void **d
|
|||||||
case PLAYER_LIMIT_PARAMETER:
|
case PLAYER_LIMIT_PARAMETER:
|
||||||
params->m_playerLimit = INTPARM(1);
|
params->m_playerLimit = INTPARM(1);
|
||||||
Min_Clamp(params->m_playerLimit, Network::GetInstance()->GetPlayerCount());
|
Min_Clamp(params->m_playerLimit, Network::GetInstance()->GetPlayerCount());
|
||||||
// [16 pilots + 1 cameraship fix] Add camera slots on top of the pilot limit so
|
|
||||||
// cameraships can still connect. Uses the constant reserve for the same reason as
|
|
||||||
// CTCL_DefaultHostSetup: the CTCL tesla counters are console-only and read 0 on a pod.
|
|
||||||
// Only applied under CTCL - a standalone (non-pod) host must keep its exact limit.
|
|
||||||
Environment.NetworkMaxPlayers = params->m_playerLimit;
|
Environment.NetworkMaxPlayers = params->m_playerLimit;
|
||||||
if (!CTCL_IsNone())
|
|
||||||
Environment.NetworkMaxPlayers += MW4_CAMERASHIP_RESERVE;
|
|
||||||
gos_NetServerCommands(gos_Commend_UpdateMaxPlayers,0);
|
gos_NetServerCommands(gos_Commend_UpdateMaxPlayers,0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -9089,24 +8930,6 @@ int MW4Shell::LoadDefaultOptions()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// [16 pilots + 1 cameraship fix]
|
|
||||||
// Number of cameraship participants in the current roster. Only meaningful on the server
|
|
||||||
// pod, which is the only machine that holds the full g_aPlayerInfos roster (filled by
|
|
||||||
// CSOC_Client::OnBOTS) and the only machine that calls AddBot in CTCL mode.
|
|
||||||
// A cameraship entry is a non-bot player with no 'Mech (m_nMechIndex == 0).
|
|
||||||
static int CTCL_CountCameraShipsInGame()
|
|
||||||
{
|
|
||||||
int count = 0;
|
|
||||||
for (int i = 0; i < g_nPlayerInfos; i++)
|
|
||||||
{
|
|
||||||
const SPlayerInfo& PI = g_aPlayerInfos[i];
|
|
||||||
if (!PI.m_bBot && (PI.m_nMechIndex == 0))
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
//
|
//
|
||||||
int _stdcall MW4Shell::AddBot(void *instance, int numParams, void* data[])
|
int _stdcall MW4Shell::AddBot(void *instance, int numParams, void* data[])
|
||||||
@@ -9123,16 +8946,6 @@ int _stdcall MW4Shell::AddBot(void *instance, int numParams, void* data[])
|
|||||||
bot_count++;
|
bot_count++;
|
||||||
}
|
}
|
||||||
player_count = Network::GetInstance()->GetPlayerCount();
|
player_count = Network::GetInstance()->GetPlayerCount();
|
||||||
// [16 pilots + 1 cameraship fix] Cameraships hold a network slot but no 'Mech slot.
|
|
||||||
// Counting them here capped pilots+cameras+bots at m_maxPlayers (16), so a full 16-'Mech
|
|
||||||
// roster plus a cameraship silently lost its last bot; g_nBOTs then never matched the
|
|
||||||
// connected lancemates and CTCL_CheckServerReady() spun forever without ever launching.
|
|
||||||
if (CTCL_IsConsoleX())
|
|
||||||
{
|
|
||||||
player_count -= CTCL_CountCameraShipsInGame();
|
|
||||||
if (player_count < 0)
|
|
||||||
player_count = 0;
|
|
||||||
}
|
|
||||||
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
||||||
if (params->m_runDedicated)
|
if (params->m_runDedicated)
|
||||||
{
|
{
|
||||||
@@ -12918,144 +12731,6 @@ int __stdcall CTCL_SetCDSP(void* instance, int args, void* data[])
|
|||||||
{
|
{
|
||||||
ASSERT(CTCL_IsConsole());
|
ASSERT(CTCL_IsConsole());
|
||||||
CTCL_DefaultHostSetup(1);
|
CTCL_DefaultHostSetup(1);
|
||||||
// Read [RookieMission] section from options.ini and populate script globals.
|
|
||||||
// Missing keys leave globals at their initialised defaults (backward-compatible).
|
|
||||||
{
|
|
||||||
NotationFile options_ini("options.ini", NotationFile::Standard, true);
|
|
||||||
Page *page = options_ini.FindPage("RookieMission");
|
|
||||||
if (page)
|
|
||||||
{
|
|
||||||
const char *sz = NULL;
|
|
||||||
if (page->GetEntry("MissionName", &sz) && sz)
|
|
||||||
{
|
|
||||||
strncpy(g_szRookieMission, sz, sizeof(g_szRookieMission) - 1);
|
|
||||||
g_szRookieMission[sizeof(g_szRookieMission) - 1] = '\0';
|
|
||||||
}
|
|
||||||
page->GetEntry("GameType", &g_nRookieGameType);
|
|
||||||
page->GetEntry("Visibility", &g_nRookieVisibility);
|
|
||||||
page->GetEntry("Weather", &g_nRookieWeather);
|
|
||||||
page->GetEntry("TimeOfDay", &g_nRookieTimeOfDay);
|
|
||||||
page->GetEntry("TimeLimit", &g_nRookieTimeLimit);
|
|
||||||
page->GetEntry("Radar", &g_nRookieRadar);
|
|
||||||
page->GetEntry("HeatOn", &g_nRookieHeat);
|
|
||||||
page->GetEntry("FriendlyFire", &g_nRookieFriendlyFire);
|
|
||||||
page->GetEntry("SplashDamage", &g_nRookieSplash);
|
|
||||||
page->GetEntry("UnlimitedAmmo", &g_nRookieUnlimitedAmmo);
|
|
||||||
page->GetEntry("WeaponJam", &g_nRookieWeaponJam);
|
|
||||||
page->GetEntry("AdvanceMode", &g_nRookieAdvanceMode);
|
|
||||||
page->GetEntry("ArmorMode", &g_nRookieArmorMode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// [automaticmode] Load File button ? reads automatic file into Rookie Mission globals + per-slot data.
|
|
||||||
// Returns 1 if the file was found and loaded, 0 otherwise. File is NOT consumed (stays on disk).
|
|
||||||
int __stdcall CTCL_LoadAutoFile(void* instance, int args, void* data[])
|
|
||||||
{
|
|
||||||
if (!g_bAutomaticMode || !g_szAutomaticFile[0])
|
|
||||||
return 0;
|
|
||||||
if (GetFileAttributes(g_szAutomaticFile) == 0xFFFFFFFF)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
NotationFile autofile(g_szAutomaticFile, NotationFile::Standard, true);
|
|
||||||
|
|
||||||
// Game options ? stored in dedicated Auto globals, NOT Rookie Mission globals,
|
|
||||||
// so the Default button continues to use the original [RookieMission] defaults.
|
|
||||||
g_szAutoMission[0] = '\0';
|
|
||||||
g_nAutoGameType = 2; g_nAutoVisibility = 0; g_nAutoWeather = 0;
|
|
||||||
g_nAutoTimeOfDay = 0; g_nAutoTimeLimit = -1; g_nAutoRadar = 0;
|
|
||||||
g_nAutoHeat = 0; g_nAutoFriendlyFire = 0; g_nAutoSplash = 0;
|
|
||||||
g_nAutoUnlimitedAmmo = 1; g_nAutoNoReturn = 0; g_nAutoWeaponJam = 0; g_nAutoAdvanceMode = 0;
|
|
||||||
g_nAutoArmorMode = 0; g_nAutoTeamAllowed = 0; g_nAutoTeamCount = 2;
|
|
||||||
|
|
||||||
Page *pMission = autofile.FindPage("mission");
|
|
||||||
if (pMission) {
|
|
||||||
const char *sz = NULL;
|
|
||||||
if (pMission->GetEntry("MissionName", &sz) && sz) {
|
|
||||||
strncpy(g_szAutoMission, sz, sizeof(g_szAutoMission)-1);
|
|
||||||
g_szAutoMission[sizeof(g_szAutoMission)-1] = '\0';
|
|
||||||
}
|
|
||||||
pMission->GetEntry("GameType", &g_nAutoGameType);
|
|
||||||
pMission->GetEntry("Visibility", &g_nAutoVisibility);
|
|
||||||
pMission->GetEntry("Weather", &g_nAutoWeather);
|
|
||||||
pMission->GetEntry("TimeOfDay", &g_nAutoTimeOfDay);
|
|
||||||
pMission->GetEntry("TimeLimit", &g_nAutoTimeLimit);
|
|
||||||
pMission->GetEntry("Radar", &g_nAutoRadar);
|
|
||||||
pMission->GetEntry("HeatOn", &g_nAutoHeat);
|
|
||||||
pMission->GetEntry("FriendlyFire", &g_nAutoFriendlyFire);
|
|
||||||
pMission->GetEntry("SplashDamage", &g_nAutoSplash);
|
|
||||||
pMission->GetEntry("UnlimitedAmmo", &g_nAutoUnlimitedAmmo);
|
|
||||||
pMission->GetEntry("NoReturn", &g_nAutoNoReturn);
|
|
||||||
pMission->GetEntry("WeaponJam", &g_nAutoWeaponJam);
|
|
||||||
pMission->GetEntry("AdvanceMode", &g_nAutoAdvanceMode);
|
|
||||||
pMission->GetEntry("ArmorMode", &g_nAutoArmorMode);
|
|
||||||
pMission->GetEntry("TeamAllowed", &g_nAutoTeamAllowed);
|
|
||||||
pMission->GetEntry("TeamCount", &g_nAutoTeamCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Per-slot data (up to 16 slots via [slot0]..[slot15] pages)
|
|
||||||
g_nAutoSlotsCount = 0;
|
|
||||||
memset(g_aAutoSlots, 0, sizeof(g_aAutoSlots));
|
|
||||||
char szPageName[16];
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
sprintf(szPageName, "slot%d", i);
|
|
||||||
Page *pSlot = autofile.FindPage(szPageName);
|
|
||||||
if (!pSlot) break;
|
|
||||||
g_nAutoSlotsCount = i + 1;
|
|
||||||
const char *sz = NULL;
|
|
||||||
if (pSlot->GetEntry("PilotName", &sz) && sz)
|
|
||||||
strncpy(g_aAutoSlots[i].szName, sz, sizeof(g_aAutoSlots[i].szName)-1);
|
|
||||||
sz = NULL;
|
|
||||||
if (pSlot->GetEntry("Mech", &sz) && sz)
|
|
||||||
strncpy(g_aAutoSlots[i].szMech, sz, sizeof(g_aAutoSlots[i].szMech)-1);
|
|
||||||
pSlot->GetEntry("Type", &g_aAutoSlots[i].nType);
|
|
||||||
pSlot->GetEntry("Team", &g_aAutoSlots[i].nTeam);
|
|
||||||
pSlot->GetEntry("Skin", &g_aAutoSlots[i].nSkin);
|
|
||||||
pSlot->GetEntry("Decal", &g_aAutoSlots[i].nDecal);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns pilot name string for slot k ? data[0]=string output buffer, data[1]=int k
|
|
||||||
int __stdcall CTCL_GetAutoSlotName(void* instance, int args, void* data[])
|
|
||||||
{
|
|
||||||
int k = INTPARM(1);
|
|
||||||
const char *sz = (k >= 0 && k < 16) ? g_aAutoSlots[k].szName : "";
|
|
||||||
if (STRPARM(0)) gos_Free(STRPARM(0));
|
|
||||||
STRPARM(0) = (char *)gos_Malloc(64);
|
|
||||||
strncpy(STRPARM(0), sz, 63);
|
|
||||||
STRPARM(0)[63] = '\0';
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns mech display name for slot k ? data[0]=string output buffer, data[1]=int k
|
|
||||||
int __stdcall CTCL_GetAutoSlotMech(void* instance, int args, void* data[])
|
|
||||||
{
|
|
||||||
int k = INTPARM(1);
|
|
||||||
const char *sz = (k >= 0 && k < 16) ? g_aAutoSlots[k].szMech : "";
|
|
||||||
if (STRPARM(0)) gos_Free(STRPARM(0));
|
|
||||||
STRPARM(0) = (char *)gos_Malloc(64);
|
|
||||||
strncpy(STRPARM(0), sz, 63);
|
|
||||||
STRPARM(0)[63] = '\0';
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns int field for slot k ? data[0]=int k, data[1]=int field (0=Type 1=Team 2=Skin 3=Decal)
|
|
||||||
// field is passed as a script literal (0/1/2/3), so use VALUEPARM not INTPARM (literals are passed
|
|
||||||
// as (void*)N directly, not as pointers; INTPARM would dereference NULL for field=0 and crash).
|
|
||||||
int __stdcall CTCL_GetAutoSlotInt(void* instance, int args, void* data[])
|
|
||||||
{
|
|
||||||
int k = INTPARM(0);
|
|
||||||
int field = VALUEPARM(1);
|
|
||||||
if (k < 0 || k >= 16) return 0;
|
|
||||||
switch (field) {
|
|
||||||
case 0: return g_aAutoSlots[k].nType;
|
|
||||||
case 1: return g_aAutoSlots[k].nTeam;
|
|
||||||
case 2: return g_aAutoSlots[k].nSkin;
|
|
||||||
case 3: return g_aAutoSlots[k].nDecal;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13305,10 +12980,10 @@ void CTCL_API CTCL_SetMissionParams()
|
|||||||
//}
|
//}
|
||||||
NetMissionParameters::MWNetMissionParameters* lparams = app->GetLocalNetParams();
|
NetMissionParameters::MWNetMissionParameters* lparams = app->GetLocalNetParams();
|
||||||
|
|
||||||
lparams->m_killLimit = 0; // no kill limit - target value
|
lparams->m_killLimit = 0; // no kill limit - 목표치
|
||||||
lparams->m_killLimitNumber = 0;
|
lparams->m_killLimitNumber = 0;
|
||||||
lparams->m_respawnLimit = 0; // apply a respawn limit?
|
lparams->m_respawnLimit = 0; // 생명제한을 둘 것인가?
|
||||||
lparams->m_respawnLimitNumber = 0; // number of lives
|
lparams->m_respawnLimitNumber = 0; // 생명수
|
||||||
//params->m_isNight = params.m_isNight;
|
//params->m_isNight = params.m_isNight;
|
||||||
lparams->m_onlyStockMech = FALSE;
|
lparams->m_onlyStockMech = FALSE;
|
||||||
lparams->m_playMissionReview = 0; // params.m_playMissionReview;
|
lparams->m_playMissionReview = 0; // params.m_playMissionReview;
|
||||||
@@ -13575,7 +13250,7 @@ void CTCL_API CTCL_CheckServerReady()
|
|||||||
int i, nOK, nCount = Network::GetInstance()->GetPlayerCount();
|
int i, nOK, nCount = Network::GetInstance()->GetPlayerCount();
|
||||||
|
|
||||||
BOOL bOK = FALSE;
|
BOOL bOK = FALSE;
|
||||||
if (nCount == (g_nTeslas + 1)) { // when all clients are connected...
|
if (nCount == (g_nTeslas + 1)) { // 모든 클라이언트가 접속이 되어 있을 때...
|
||||||
for(nOK = 0, i = 0; i < Maximum_Players; ++i) {
|
for(nOK = 0, i = 0; i < Maximum_Players; ++i) {
|
||||||
if (i != Connection::Server->GetID()) {
|
if (i != Connection::Server->GetID()) {
|
||||||
const MechWarrior4::ServedConnectionData& scd = app->servedConnectionData[i];
|
const MechWarrior4::ServedConnectionData& scd = app->servedConnectionData[i];
|
||||||
@@ -13632,19 +13307,17 @@ void CTCL_API CTCL_DefaultHostSetup(int nMode)
|
|||||||
params->m_allowdecaltransfer = 0;
|
params->m_allowdecaltransfer = 0;
|
||||||
if (g_bCOOP) {
|
if (g_bCOOP) {
|
||||||
Environment.NetworkMaxPlayers = 16;
|
Environment.NetworkMaxPlayers = 16;
|
||||||
// Reserve extra DirectPlay slots for camera seats (tracked separately from pilots in CTCL)
|
//if (CTCL_GetTeslaCount() < CTCL_GetTeslaCountAll()) {
|
||||||
// Original commented-out intent preserved and now implemented for non-COOP below
|
// any cameraship installed... so 1 more player can join
|
||||||
|
//params->m_maxPlayers = 9;
|
||||||
|
//params->m_maxBots = 8;
|
||||||
|
//} else {
|
||||||
params->m_maxPlayers = 9;
|
params->m_maxPlayers = 9;
|
||||||
params->m_maxBots = 8;
|
params->m_maxBots = 8;
|
||||||
|
//}
|
||||||
} else {
|
} else {
|
||||||
params->m_maxPlayers = 16;
|
params->m_maxPlayers = 16;
|
||||||
// [16 pilots + 1 cameraship fix] Reserve network slots for cameraship seats on top of the
|
Environment.NetworkMaxPlayers = 16;
|
||||||
// pilot cap. This runs on the cameraship pod too (via CTCL_DoCreateGame -> nMode 0), which
|
|
||||||
// is the machine that creates the session with dwMaxPlayers = Environment.NetworkMaxPlayers.
|
|
||||||
// Do NOT derive the reserve from the CTCL tesla counters here: that table is console-only,
|
|
||||||
// so on the pod they both return 0, the reserve became +0, the session was created with
|
|
||||||
// 16 slots, and the 17th connection was refused - the mission then never finished loading.
|
|
||||||
Environment.NetworkMaxPlayers = params->m_maxPlayers + MW4_CAMERASHIP_RESERVE;
|
|
||||||
params->m_maxBots = 16;
|
params->m_maxBots = 16;
|
||||||
}
|
}
|
||||||
params->m_allow3rdPerson = 1;
|
params->m_allow3rdPerson = 1;
|
||||||
@@ -15147,10 +14820,6 @@ void __stdcall CTCL_UpdateMechView()
|
|||||||
mfd_device.BeginScene();
|
mfd_device.BeginScene();
|
||||||
sh_step = 4;
|
sh_step = 4;
|
||||||
break;
|
break;
|
||||||
case 4:
|
|
||||||
// Same 7-step cadence as mode 1.
|
|
||||||
sh_step = 6;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -230,13 +230,13 @@ extern int g_nTeamOrderMode;
|
|||||||
extern bool g_bCOOP; // COin OPeration
|
extern bool g_bCOOP; // COin OPeration
|
||||||
// jcem - end
|
// jcem - end
|
||||||
|
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
extern void __stdcall RIO_StartStop (BOOL bStart);
|
extern void __stdcall RIO_StartStop (BOOL bStart);
|
||||||
void COOP_InputMode(bool bRestore);
|
void COOP_InputMode(bool bRestore);
|
||||||
extern int g_bNoPlasma;
|
extern int g_bNoPlasma;
|
||||||
extern void __stdcall PLASMA_Do(int nMode);
|
extern void __stdcall PLASMA_Do(int nMode);
|
||||||
extern void GeneralReset();
|
extern void GeneralReset();
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
|
|
||||||
extern bool __stdcall gos_NetDoneStartGame();
|
extern bool __stdcall gos_NetDoneStartGame();
|
||||||
extern bool __stdcall PrepareDefaultServerAdvertisers(void);
|
extern bool __stdcall PrepareDefaultServerAdvertisers(void);
|
||||||
@@ -1938,9 +1938,9 @@ public:
|
|||||||
void EndPos (DWORD& x,DWORD& y);
|
void EndPos (DWORD& x,DWORD& y);
|
||||||
bool Empty (void)
|
bool Empty (void)
|
||||||
{ return (m_Text[0] == 0); }
|
{ return (m_Text[0] == 0); }
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
const char *hsh_get_m_Text(){return &m_Text[0];}
|
const char *hsh_get_m_Text(){return &m_Text[0];}
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
};
|
};
|
||||||
|
|
||||||
TextBox::TextBox (const char* pcszFontName, int nFontSize/* = -11*/, bool oldmode/* = false*/)
|
TextBox::TextBox (const char* pcszFontName, int nFontSize/* = -11*/, bool oldmode/* = false*/)
|
||||||
@@ -3571,9 +3571,9 @@ void
|
|||||||
}
|
}
|
||||||
Environment.DoGameLogic = &MWApplication::DoGameLogic;
|
Environment.DoGameLogic = &MWApplication::DoGameLogic;
|
||||||
}
|
}
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
RIO_StartStop (TRUE);
|
RIO_StartStop (TRUE);
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
|
|
||||||
g_MRF.Started(); // jcem
|
g_MRF.Started(); // jcem
|
||||||
g_RSF.Started(); // jcem
|
g_RSF.Started(); // jcem
|
||||||
@@ -3696,9 +3696,9 @@ void
|
|||||||
g_RSF.Stopping(); // jcem
|
g_RSF.Stopping(); // jcem
|
||||||
|
|
||||||
ClearTOC();
|
ClearTOC();
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
RIO_StartStop (FALSE);
|
RIO_StartStop (FALSE);
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
if (CTCL_IsConsoleX()) {
|
if (CTCL_IsConsoleX()) {
|
||||||
CTCL_SetGameState(_EGS_Closing);
|
CTCL_SetGameState(_EGS_Closing);
|
||||||
}
|
}
|
||||||
@@ -3870,9 +3870,9 @@ sh_game_started = false;
|
|||||||
g_RSF.Stopping(); // jcem
|
g_RSF.Stopping(); // jcem
|
||||||
|
|
||||||
ClearTOC();
|
ClearTOC();
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
RIO_StartStop (FALSE);
|
RIO_StartStop (FALSE);
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
if (CTCL_IsConsoleX()) {
|
if (CTCL_IsConsoleX()) {
|
||||||
CTCL_SetGameState(_EGS_Closing);
|
CTCL_SetGameState(_EGS_Closing);
|
||||||
}
|
}
|
||||||
@@ -18435,7 +18435,7 @@ int __stdcall CTCL_StartCOOP(void* instance, int args, void* data[])
|
|||||||
// $$COOP: see void CSOC_Client::OnReadyStartGame()
|
// $$COOP: see void CSOC_Client::OnReadyStartGame()
|
||||||
// C_ReadyStartGame
|
// C_ReadyStartGame
|
||||||
|
|
||||||
g_nTeslas = 0; // single player game
|
g_nTeslas = 0; // 싱글 게임
|
||||||
g_nBOTs = 7;
|
g_nBOTs = 7;
|
||||||
g_nPlayerInfos = 1 + g_nBOTs + g_nTeslas;
|
g_nPlayerInfos = 1 + g_nBOTs + g_nTeslas;
|
||||||
g_bIsServer = TRUE;
|
g_bIsServer = TRUE;
|
||||||
@@ -18523,13 +18523,13 @@ int __stdcall CTCL_StartCOOP(void* instance, int args, void* data[])
|
|||||||
// MSL ADD MECH
|
// MSL ADD MECH
|
||||||
PI.m_nMechIndex = -1;
|
PI.m_nMechIndex = -1;
|
||||||
//*
|
//*
|
||||||
// See MechIndex for each mech's info
|
// 각 메크에 대한 정보는 MechIndex를 참조함
|
||||||
PI.m_fileID = 0;
|
PI.m_fileID = 0;
|
||||||
PI.m_recordID = 0;
|
PI.m_recordID = 0;
|
||||||
strcpy(PI.m_szMech, s_paMechNames[11]); // Madcat
|
strcpy(PI.m_szMech, s_paMechNames[11]); // Madcat
|
||||||
strcpy(PI.m_szMech, "$Yellow");
|
strcpy(PI.m_szMech, "$Yellow");
|
||||||
//*/
|
//*/
|
||||||
PI.m_nTeamOrSkin = 1; // red
|
PI.m_nTeamOrSkin = 1; // 빨강
|
||||||
PI.m_nDecal = 1; // nDecal;
|
PI.m_nDecal = 1; // nDecal;
|
||||||
PI.m_dwAddr = 0; // dwAddr;
|
PI.m_dwAddr = 0; // dwAddr;
|
||||||
g_nPrintOut = FALSE;
|
g_nPrintOut = FALSE;
|
||||||
@@ -18576,7 +18576,7 @@ int __stdcall CTCL_StartCOOP(void* instance, int args, void* data[])
|
|||||||
strcpy(PI.m_szName, s_pNames[aLBN[2][i - 1]]);
|
strcpy(PI.m_szName, s_pNames[aLBN[2][i - 1]]);
|
||||||
PI.m_nMechIndex = -1;
|
PI.m_nMechIndex = -1;
|
||||||
//*
|
//*
|
||||||
//See MechIndex for each mech's info
|
//각 메크에 대한 정보는 MechIndex를 참조함
|
||||||
PI.m_fileID = 0;
|
PI.m_fileID = 0;
|
||||||
PI.m_recordID = 0;
|
PI.m_recordID = 0;
|
||||||
/*if (i == 1)
|
/*if (i == 1)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#include "MW4Headers.hpp"
|
#include "MW4Headers.hpp"
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
#include "MWVideoRenderer.hpp"
|
#include "MWVideoRenderer.hpp"
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
#include "MWGUIManager.hpp"
|
#include "MWGUIManager.hpp"
|
||||||
#include "GUIWeaponManager.hpp"
|
#include "GUIWeaponManager.hpp"
|
||||||
#include "GUIRadarManager.hpp"
|
#include "GUIRadarManager.hpp"
|
||||||
@@ -1554,7 +1554,7 @@ void MWGUIManager::RenderComponents (void)
|
|||||||
(*iter)->Draw ();
|
(*iter)->Draw ();
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//sanghoon: while shutting down..
|
//상훈... 셧다운 중일때..
|
||||||
for (iter = m_Components.begin ();iter != m_Components.end ();iter++)
|
for (iter = m_Components.begin ();iter != m_Components.end ();iter++)
|
||||||
{
|
{
|
||||||
//Main hudZoom,//hudReticle,hudObjective,hudTorsoBar,hudHelp,hudScore
|
//Main hudZoom,//hudReticle,hudObjective,hudTorsoBar,hudHelp,hudScore
|
||||||
@@ -1597,11 +1597,11 @@ void MWGUIManager::RenderComponents (void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//sanghoon begin
|
//상훈-앞
|
||||||
extern CamerashipParams g_CamerashipParams;
|
extern CamerashipParams g_CamerashipParams;
|
||||||
if (CTCL_IsConsoleX() || g_CamerashipParams.m_bAllowChatDisplay)
|
if (CTCL_IsConsoleX() || g_CamerashipParams.m_bAllowChatDisplay)
|
||||||
hudChat->Draw (true);
|
hudChat->Draw (true);
|
||||||
//sanghoon end
|
//상훈-뒤
|
||||||
hudScore->Draw (true);
|
hudScore->Draw (true);
|
||||||
hudCamera->Draw(true);
|
hudCamera->Draw(true);
|
||||||
}
|
}
|
||||||
@@ -1612,7 +1612,7 @@ void MWGUIManager::RenderComponents (void)
|
|||||||
gos_PopRenderStates ();
|
gos_PopRenderStates ();
|
||||||
|
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
MWApplication* app = MWApplication::GetInstance();
|
MWApplication* app = MWApplication::GetInstance();
|
||||||
if (app->networkingFlag)
|
if (app->networkingFlag)
|
||||||
{
|
{
|
||||||
@@ -1648,7 +1648,7 @@ void MWGUIManager::RenderComponents (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
}
|
}
|
||||||
|
|
||||||
void MWGUIManager::ShowHelpArrow (bool value)
|
void MWGUIManager::ShowHelpArrow (bool value)
|
||||||
|
|||||||
@@ -590,7 +590,7 @@ namespace MechWarrior4
|
|||||||
return (m_EndMissionTimer.Running());
|
return (m_EndMissionTimer.Running());
|
||||||
}
|
}
|
||||||
|
|
||||||
//sanghoon
|
//상훈
|
||||||
Stuff::Scalar GetMissionDuration ()
|
Stuff::Scalar GetMissionDuration ()
|
||||||
{
|
{
|
||||||
if (!m_EndMissionTimer.Running ())
|
if (!m_EndMissionTimer.Running ())
|
||||||
|
|||||||
@@ -3954,7 +3954,7 @@ void
|
|||||||
g_HUDPPCLevel = 10;
|
g_HUDPPCLevel = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
//sanghoon
|
//상훈
|
||||||
//extern bool sh_isdeathmode;
|
//extern bool sh_isdeathmode;
|
||||||
//Are we ejecting?
|
//Are we ejecting?
|
||||||
if (m_NeedEject)
|
if (m_NeedEject)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
||||||
//===========================================================================//
|
//===========================================================================//
|
||||||
|
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
#include "MW4.hpp"
|
#include "MW4.hpp"
|
||||||
#include "Vehicle.hpp"
|
#include "Vehicle.hpp"
|
||||||
#include "MechAnimationState.hpp"
|
#include "MechAnimationState.hpp"
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "SpringOf.hpp"
|
#include "SpringOf.hpp"
|
||||||
#include "MechLabHeaders.h"
|
#include "MechLabHeaders.h"
|
||||||
#include <Stuff\Spline.hpp>
|
#include <Stuff\Spline.hpp>
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
|
|
||||||
|
|
||||||
#include "MW4Headers.hpp"
|
#include "MW4Headers.hpp"
|
||||||
@@ -65,9 +65,9 @@
|
|||||||
#include "EyePointManager.hpp"
|
#include "EyePointManager.hpp"
|
||||||
#include "mw4shell.hpp"
|
#include "mw4shell.hpp"
|
||||||
#include "NavPoint.hpp"
|
#include "NavPoint.hpp"
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
#include "MWVideoRenderer.hpp"
|
#include "MWVideoRenderer.hpp"
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
#include <Adept\CollisionGrid.hpp>
|
#include <Adept\CollisionGrid.hpp>
|
||||||
#include <Adept\Controls.hpp>
|
#include <Adept\Controls.hpp>
|
||||||
@@ -101,7 +101,7 @@ bool _stdcall WriteImageAfterGrab(BYTE* Image, const char* pcszFilePrefix);
|
|||||||
#include <mbstring.h>
|
#include <mbstring.h>
|
||||||
#define __mbsrchr(s,c) (char*)_mbsrchr((const unsigned char*)(s),(c))
|
#define __mbsrchr(s,c) (char*)_mbsrchr((const unsigned char*)(s),(c))
|
||||||
|
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "ctcls.h"
|
#include "ctcls.h"
|
||||||
@@ -208,7 +208,7 @@ float g_fNeedFlushLevel = 0.66;
|
|||||||
float g_fTimeMsgSender = 1.5f;
|
float g_fTimeMsgSender = 1.5f;
|
||||||
float g_fTimeScoringAtEnd = 10.0f;
|
float g_fTimeScoringAtEnd = 10.0f;
|
||||||
Mech* FindNextMechToFollowByScore(Mech* pCur); // jcem
|
Mech* FindNextMechToFollowByScore(Mech* pCur); // jcem
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
|
|
||||||
CamerashipParams g_CamerashipParams;
|
CamerashipParams g_CamerashipParams;
|
||||||
|
|
||||||
@@ -2285,7 +2285,7 @@ void
|
|||||||
if (MWGUIManager::GetInstance () && IsObserving(true))
|
if (MWGUIManager::GetInstance () && IsObserving(true))
|
||||||
{
|
{
|
||||||
Check_Object(MWGUIManager::GetInstance());
|
Check_Object(MWGUIManager::GetInstance());
|
||||||
//sanghoon
|
//상훈
|
||||||
if (!CTCL_IsConsoleX() && !g_CamerashipParams.m_bAllowChatDisplay) {
|
if (!CTCL_IsConsoleX() && !g_CamerashipParams.m_bAllowChatDisplay) {
|
||||||
HUDChat *chat;
|
HUDChat *chat;
|
||||||
chat = Cast_Object (HUDChat *,MWGUIManager::GetInstance ()->Component (MWGUIManager::HUD_CHAT));
|
chat = Cast_Object (HUDChat *,MWGUIManager::GetInstance ()->Component (MWGUIManager::HUD_CHAT));
|
||||||
@@ -3781,11 +3781,11 @@ void VehicleInterface::ApplyControls(Time till)
|
|||||||
}
|
}
|
||||||
else if (controlPacket.lookCommand == AnalogControlSave::LookBack)
|
else if (controlPacket.lookCommand == AnalogControlSave::LookBack)
|
||||||
{
|
{
|
||||||
//sanghoon
|
//상훈
|
||||||
ShowHUDIfOn(true);
|
ShowHUDIfOn(true);
|
||||||
//MWGUIManager::GetInstance()->HideHudComponent (HUD_TARGETARROW);
|
//MWGUIManager::GetInstance()->HideHudComponent (HUD_TARGETARROW);
|
||||||
//ShowHUDIfOn(false);
|
//ShowHUDIfOn(false);
|
||||||
//sanghoon
|
//상훈
|
||||||
// MSL 5.04 Rear Firing Weapons
|
// MSL 5.04 Rear Firing Weapons
|
||||||
// ShowStatic(cameraView == InMechCameraView);
|
// ShowStatic(cameraView == InMechCameraView);
|
||||||
ShowStatic(true);
|
ShowStatic(true);
|
||||||
@@ -4968,7 +4968,7 @@ void
|
|||||||
Scalar fT = gos_GetElapsedTime();
|
Scalar fT = gos_GetElapsedTime();
|
||||||
if ((fT - g_fLastScoringTimeCechk) >= CAMERASHIP_SCORING_CHECK) {
|
if ((fT - g_fLastScoringTimeCechk) >= CAMERASHIP_SCORING_CHECK) {
|
||||||
g_fLastScoringTimeCechk = fT;
|
g_fLastScoringTimeCechk = fT;
|
||||||
//sanghoon
|
//상훈
|
||||||
if (Application::GetInstance()->networkingFlag)
|
if (Application::GetInstance()->networkingFlag)
|
||||||
{
|
{
|
||||||
bool bNearEnd = false;
|
bool bNearEnd = false;
|
||||||
@@ -5378,7 +5378,7 @@ again:
|
|||||||
if ((m_curView == STATE_DEATH_SEQUENCE_START) || (m_curView == STATE_DEATH_SEQUENCE_TRANS)) {
|
if ((m_curView == STATE_DEATH_SEQUENCE_START) || (m_curView == STATE_DEATH_SEQUENCE_TRANS)) {
|
||||||
bool bStateEnded = false;
|
bool bStateEnded = false;
|
||||||
if (m_pMechDying != pMech) {
|
if (m_pMechDying != pMech) {
|
||||||
// Case where target changes while dying
|
// 죽는 도중에 타겟이 바뀐 경우
|
||||||
ClearFixedPoint();
|
ClearFixedPoint();
|
||||||
m_fTimeStateEnd = fMT + g_CamerashipParams.m_fTimeStandard;
|
m_fTimeStateEnd = fMT + g_CamerashipParams.m_fTimeStandard;
|
||||||
m_pMechDying = m_pEnemy = NULL;
|
m_pMechDying = m_pEnemy = NULL;
|
||||||
@@ -5419,7 +5419,7 @@ again:
|
|||||||
}
|
}
|
||||||
if ((m_pEnemy != m_pMechDying) && m_pEnemy->IsDestroyed()) {
|
if ((m_pEnemy != m_pMechDying) && m_pEnemy->IsDestroyed()) {
|
||||||
if (m_curView == STATE_DEATH_SEQUENCE_START) {
|
if (m_curView == STATE_DEATH_SEQUENCE_START) {
|
||||||
// Case where opponent dies while death animation is playing...
|
// 죽음을 보여주는 도중에 상대방이 죽은 경우...
|
||||||
// move to trans...
|
// move to trans...
|
||||||
bStateEnded = true;
|
bStateEnded = true;
|
||||||
}
|
}
|
||||||
@@ -7495,7 +7495,7 @@ void
|
|||||||
// MSL 5.02 Zoom
|
// MSL 5.02 Zoom
|
||||||
// m_reticuleCamera->SetPerspective(near_clip_zoom, far_clip_main + (100.0f * (horizontal_fov_main - horizontal_fov_zoom)), horizontal_fov_zoom, (height_to_width_zoom));
|
// m_reticuleCamera->SetPerspective(near_clip_zoom, far_clip_main + (100.0f * (horizontal_fov_main - horizontal_fov_zoom)), horizontal_fov_zoom, (height_to_width_zoom));
|
||||||
m_reticuleCamera->SetPerspective(near_clip_zoom, far_clip_main + (100.0f * (horizontal_fov_main - horizontal_fov_zoom)), horizontal_fov_zoom, (height_to_width_zoom*1.75));
|
m_reticuleCamera->SetPerspective(near_clip_zoom, far_clip_main + (100.0f * (horizontal_fov_main - horizontal_fov_zoom)), horizontal_fov_zoom, (height_to_width_zoom*1.75));
|
||||||
//sanghoon
|
//상훈
|
||||||
// float height=(1-g_fZoomMarginLR*2)*800 * height_to_width_zoom/600;
|
// float height=(1-g_fZoomMarginLR*2)*800 * height_to_width_zoom/600;
|
||||||
// float tb_margin=(1-height)/2;
|
// float tb_margin=(1-height)/2;
|
||||||
// m_reticuleCamera->SetViewport(1-g_fZoomMarginLR,1-tb_margin, g_fZoomMarginLR, tb_margin);
|
// m_reticuleCamera->SetViewport(1-g_fZoomMarginLR,1-tb_margin, g_fZoomMarginLR, tb_margin);
|
||||||
@@ -8121,7 +8121,7 @@ void VehicleInterface::ChainFireGroup (Stuff::Time till,ChainIteratorOf<Weapon *
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// hyun begin
|
// 鉉 - start
|
||||||
|
|
||||||
groupWeaponIterator->ReadAndNext();
|
groupWeaponIterator->ReadAndNext();
|
||||||
|
|
||||||
@@ -8135,7 +8135,7 @@ void VehicleInterface::ChainFireGroup (Stuff::Time till,ChainIteratorOf<Weapon *
|
|||||||
BOOL bWeaponGroup3 = (group3FireRequest > 0) && GetWeaponGroupID (*weapon, 3);
|
BOOL bWeaponGroup3 = (group3FireRequest > 0) && GetWeaponGroupID (*weapon, 3);
|
||||||
|
|
||||||
//
|
//
|
||||||
// hyun end
|
// 鉉 - end
|
||||||
//
|
//
|
||||||
|
|
||||||
num_weapons ++;
|
num_weapons ++;
|
||||||
@@ -8369,7 +8369,7 @@ void
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
// fireRequest > 0 (Enter Key : None Used) : hyun
|
// fireRequest > 0 (Enter Key : None Used) : 鉉
|
||||||
if(fireRequest > 0)
|
if(fireRequest > 0)
|
||||||
{
|
{
|
||||||
switch(weaponMode)
|
switch(weaponMode)
|
||||||
@@ -8521,12 +8521,12 @@ void VehicleInterface::OverrideAutoCenterToTorsoMessageHandler(Adept::ReceiverDa
|
|||||||
Verify(message->messageID == OverrideAutoCenterToTorsoMessageID);
|
Verify(message->messageID == OverrideAutoCenterToTorsoMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (28, LAMP_OFF); // hyun
|
g_pRIOMain->SetLampState (28, LAMP_OFF); // 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (28, LAMP_BRIGHT); // hyun
|
g_pRIOMain->SetLampState (28, LAMP_BRIGHT); // 鉉
|
||||||
|
|
||||||
if (perminateTorsoMode == CenterLegsToTorso)
|
if (perminateTorsoMode == CenterLegsToTorso)
|
||||||
{
|
{
|
||||||
@@ -8539,7 +8539,7 @@ void VehicleInterface::OverrideAutoCenterToTorsoMessageHandler(Adept::ReceiverDa
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (28, LAMP_DEFAULT); // hyun
|
g_pRIOMain->SetLampState (28, LAMP_DEFAULT); // 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8658,11 +8658,11 @@ void
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_pRIOMain->SetLampState (17, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (17, LAMP_BRIGHT);// 鉉
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (17, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (17, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8749,17 +8749,17 @@ void
|
|||||||
Verify(message->messageID == CrouchCommandMessageID);
|
Verify(message->messageID == CrouchCommandMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (20, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (20, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (20, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (20, LAMP_BRIGHT);// 鉉
|
||||||
// if (executionState->GetState () == ExecutionStateEngine::AutoPilotState)
|
// if (executionState->GetState () == ExecutionStateEngine::AutoPilotState)
|
||||||
executionState->RequestState(ExecutionStateEngine::AlwaysExecuteState);
|
executionState->RequestState(ExecutionStateEngine::AlwaysExecuteState);
|
||||||
QueCommand(VehicleCommand::CrouchCommand);
|
QueCommand(VehicleCommand::CrouchCommand);
|
||||||
} else {
|
} else {
|
||||||
g_pRIOMain->SetLampState (20, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (20, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -8786,10 +8786,10 @@ void
|
|||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
if (g_bJumpZoom)
|
if (g_bJumpZoom)
|
||||||
g_pRIOMain->SetLampState (16, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (16, LAMP_OFF);// 鉉
|
||||||
g_pRIOMain->SetLampState (50, LAMP_OFF);
|
g_pRIOMain->SetLampState (50, LAMP_OFF);
|
||||||
g_pRIOMain->SetLampState (33, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (33, LAMP_OFF);// 鉉
|
||||||
g_pRIOMain->SetLampState (34, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (34, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8797,7 +8797,7 @@ void
|
|||||||
{
|
{
|
||||||
if (GetJumpJetState() > 0) {
|
if (GetJumpJetState() > 0) {
|
||||||
if (g_bJumpZoom)
|
if (g_bJumpZoom)
|
||||||
g_pRIOMain->SetLampState (16, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (16, LAMP_BRIGHT);// 鉉
|
||||||
g_pRIOMain->SetLampState (33, LAMP_BRIGHT);
|
g_pRIOMain->SetLampState (33, LAMP_BRIGHT);
|
||||||
g_pRIOMain->SetLampState (34, LAMP_BRIGHT);
|
g_pRIOMain->SetLampState (34, LAMP_BRIGHT);
|
||||||
}
|
}
|
||||||
@@ -8811,10 +8811,10 @@ void
|
|||||||
if (!GetShutdownState())
|
if (!GetShutdownState())
|
||||||
if (GetJumpJetState() > 0) {
|
if (GetJumpJetState() > 0) {
|
||||||
if (g_bJumpZoom)
|
if (g_bJumpZoom)
|
||||||
g_pRIOMain->SetLampState (16, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (16, LAMP_DEFAULT);// 鉉
|
||||||
g_pRIOMain->SetLampState (50, LAMP_DEFAULT);
|
g_pRIOMain->SetLampState (50, LAMP_DEFAULT);
|
||||||
g_pRIOMain->SetLampState (33, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (33, LAMP_DEFAULT);// 鉉
|
||||||
g_pRIOMain->SetLampState (34, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (34, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9284,12 +9284,12 @@ void
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!GetShutdownState())
|
if (!GetShutdownState())
|
||||||
g_pRIOMain->SetLampState (7, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (7, LAMP_BRIGHT);// 鉉
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!GetShutdownState())
|
if (!GetShutdownState())
|
||||||
g_pRIOMain->SetLampState (7, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (7, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
@@ -9341,7 +9341,7 @@ void
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//hyun SetWeaponMode(GroupFireMode);
|
//鉉SetWeaponMode(GroupFireMode);
|
||||||
// selectedWeaponGroup = 1;
|
// selectedWeaponGroup = 1;
|
||||||
group1FireRequest ++;
|
group1FireRequest ++;
|
||||||
// fireRequest ++;
|
// fireRequest ++;
|
||||||
@@ -9379,7 +9379,7 @@ void
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//hyun SetWeaponMode(GroupFireMode);
|
//鉉SetWeaponMode(GroupFireMode);
|
||||||
// selectedWeaponGroup = 2;
|
// selectedWeaponGroup = 2;
|
||||||
group2FireRequest ++;
|
group2FireRequest ++;
|
||||||
// fireRequest ++;
|
// fireRequest ++;
|
||||||
@@ -9415,7 +9415,7 @@ void
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//hyun SetWeaponMode(GroupFireMode);
|
//鉉SetWeaponMode(GroupFireMode);
|
||||||
// selectedWeaponGroup = 3;
|
// selectedWeaponGroup = 3;
|
||||||
// fireRequest ++;
|
// fireRequest ++;
|
||||||
group3FireRequest ++;
|
group3FireRequest ++;
|
||||||
@@ -9468,7 +9468,7 @@ void
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//hyun SetWeaponMode(GroupFireMode);
|
//鉉SetWeaponMode(GroupFireMode);
|
||||||
// selectedWeaponGroup = 4;
|
// selectedWeaponGroup = 4;
|
||||||
// fireRequest ++;
|
// fireRequest ++;
|
||||||
// group4FireRequest ++;
|
// group4FireRequest ++;
|
||||||
@@ -9508,7 +9508,7 @@ void
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//hyun SetWeaponMode(GroupFireMode);
|
//鉉SetWeaponMode(GroupFireMode);
|
||||||
// selectedWeaponGroup = 5;
|
// selectedWeaponGroup = 5;
|
||||||
// fireRequest ++;
|
// fireRequest ++;
|
||||||
// group5FireRequest ++;
|
// group5FireRequest ++;
|
||||||
@@ -9554,7 +9554,7 @@ void
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//hyun SetWeaponMode(GroupFireMode);
|
//鉉SetWeaponMode(GroupFireMode);
|
||||||
//group6FireRequest ++;
|
//group6FireRequest ++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -10344,19 +10344,19 @@ void
|
|||||||
Verify(message->messageID == ToggleSearchLightMessageID);
|
Verify(message->messageID == ToggleSearchLightMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (27, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (27, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
if (g_SearchLight == TRUE)
|
if (g_SearchLight == TRUE)
|
||||||
g_pRIOMain->SetLampState (27, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (27, LAMP_BRIGHT);// 鉉
|
||||||
QueCommand(VehicleCommand::ToggleSearchLightCommand);
|
QueCommand(VehicleCommand::ToggleSearchLightCommand);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (g_SearchLight == TRUE)
|
if (g_SearchLight == TRUE)
|
||||||
g_pRIOMain->SetLampState (27, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (27, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10546,7 +10546,7 @@ void
|
|||||||
{
|
{
|
||||||
//if (!GetShutdownState())
|
//if (!GetShutdownState())
|
||||||
//if (g_bCool == TRUE) {
|
//if (g_bCool == TRUE) {
|
||||||
// g_pRIOMain->SetLampState (19, LAMP_BRIGHT);// hyun
|
// g_pRIOMain->SetLampState (19, LAMP_BRIGHT);// 鉉
|
||||||
//}
|
//}
|
||||||
|
|
||||||
isCooling ++;
|
isCooling ++;
|
||||||
@@ -10560,7 +10560,7 @@ void
|
|||||||
{
|
{
|
||||||
//if (!GetShutdownState())
|
//if (!GetShutdownState())
|
||||||
//if (g_bCool == TRUE) {
|
//if (g_bCool == TRUE) {
|
||||||
// g_pRIOMain->SetLampState (19, LAMP_DEFAULT);// hyun
|
// g_pRIOMain->SetLampState (19, LAMP_DEFAULT);// 鉉
|
||||||
//}
|
//}
|
||||||
|
|
||||||
isCooling --;
|
isCooling --;
|
||||||
@@ -10734,7 +10734,7 @@ void
|
|||||||
|
|
||||||
if (GetShutdownState())
|
if (GetShutdownState())
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (26, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (26, LAMP_OFF);// 鉉
|
||||||
g_pRIOMain->SetLampState (48, LAMP_OFF); // Light Amp Lamp MFD
|
g_pRIOMain->SetLampState (48, LAMP_OFF); // Light Amp Lamp MFD
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -10759,7 +10759,7 @@ void
|
|||||||
MWGUIManager::GetInstance()->ShowLightAmplification();
|
MWGUIManager::GetInstance()->ShowLightAmplification();
|
||||||
Mission::GetInstance()->SetLightAmpMissionLights();
|
Mission::GetInstance()->SetLightAmpMissionLights();
|
||||||
ShowZoomIfOn (false);
|
ShowZoomIfOn (false);
|
||||||
g_pRIOMain->SetLampState (26, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (26, LAMP_BRIGHT);// 鉉
|
||||||
if (!g_bJumpZoom)
|
if (!g_bJumpZoom)
|
||||||
{
|
{
|
||||||
if (g_pRIOMain->GetLampState (16) == LAMP_BRIGHT)
|
if (g_pRIOMain->GetLampState (16) == LAMP_BRIGHT)
|
||||||
@@ -10773,12 +10773,12 @@ void
|
|||||||
{
|
{
|
||||||
if(vehicle->DoesHaveLightAmp())
|
if(vehicle->DoesHaveLightAmp())
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (26, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (26, LAMP_DEFAULT);// 鉉
|
||||||
g_pRIOMain->SetLampState (48, LAMP_DEFAULT); // Light Amp Lamp MFD
|
g_pRIOMain->SetLampState (48, LAMP_DEFAULT); // Light Amp Lamp MFD
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (26, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (26, LAMP_OFF);// 鉉
|
||||||
g_pRIOMain->SetLampState (48, LAMP_OFF); // Light Amp Lamp MFD
|
g_pRIOMain->SetLampState (48, LAMP_OFF); // Light Amp Lamp MFD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10864,12 +10864,12 @@ void
|
|||||||
Verify(message->messageID == NextNavPointMessageID);
|
Verify(message->messageID == NextNavPointMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (38, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (38, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (38, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (38, LAMP_BRIGHT);// 鉉
|
||||||
m_selectedNavPoint.Remove();
|
m_selectedNavPoint.Remove();
|
||||||
NavPoint *nav_point;
|
NavPoint *nav_point;
|
||||||
if((nav_point = NavPoint::GetNextNavPoint()) != NULL)
|
if((nav_point = NavPoint::GetNextNavPoint()) != NULL)
|
||||||
@@ -10890,7 +10890,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (38, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (38, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10915,12 +10915,12 @@ void
|
|||||||
Verify(message->messageID == PreviousNavPointMessageID);
|
Verify(message->messageID == PreviousNavPointMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (37, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (37, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (37, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (37, LAMP_BRIGHT);// 鉉
|
||||||
m_selectedNavPoint.Remove();
|
m_selectedNavPoint.Remove();
|
||||||
NavPoint *nav_point;
|
NavPoint *nav_point;
|
||||||
if((nav_point = NavPoint::GetPreviousNavPoint()) != NULL)
|
if((nav_point = NavPoint::GetPreviousNavPoint()) != NULL)
|
||||||
@@ -10936,7 +10936,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (37, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (37, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10961,12 +10961,12 @@ void
|
|||||||
Verify(message->messageID == NextEnemyMessageID);
|
Verify(message->messageID == NextEnemyMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (10, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (10, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (10, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (10, LAMP_BRIGHT);// 鉉
|
||||||
Entity *next_enemy = NULL;
|
Entity *next_enemy = NULL;
|
||||||
Sensor *sensor = vehicle->GetSensor();
|
Sensor *sensor = vehicle->GetSensor();
|
||||||
if(sensor)
|
if(sensor)
|
||||||
@@ -10978,7 +10978,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (10, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (10, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11003,12 +11003,12 @@ void
|
|||||||
Verify(message->messageID == PreviousEnemyMessageID);
|
Verify(message->messageID == PreviousEnemyMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (9, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (9, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (9, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (9, LAMP_BRIGHT);// 鉉
|
||||||
Entity *next_enemy = NULL;
|
Entity *next_enemy = NULL;
|
||||||
Sensor *sensor = vehicle->GetSensor();
|
Sensor *sensor = vehicle->GetSensor();
|
||||||
if(sensor)
|
if(sensor)
|
||||||
@@ -11020,7 +11020,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (9, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (9, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11045,12 +11045,12 @@ void
|
|||||||
Verify(message->messageID == NearestEnemyMessageID);
|
Verify(message->messageID == NearestEnemyMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (11, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (11, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (11, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (11, LAMP_BRIGHT);// 鉉
|
||||||
m_interfaceTarget.Remove();
|
m_interfaceTarget.Remove();
|
||||||
m_targetCamera->SetScene(NULL);
|
m_targetCamera->SetScene(NULL);
|
||||||
Entity *entity = NULL;
|
Entity *entity = NULL;
|
||||||
@@ -11065,7 +11065,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (11, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (11, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11232,12 +11232,12 @@ void
|
|||||||
|
|
||||||
if (GetShutdownState())
|
if (GetShutdownState())
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (8, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (8, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (8, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (8, LAMP_BRIGHT);// 鉉
|
||||||
|
|
||||||
Entity *target_entity;
|
Entity *target_entity;
|
||||||
target_entity = targetQueryEntity.GetCurrent();
|
target_entity = targetQueryEntity.GetCurrent();
|
||||||
@@ -11260,7 +11260,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (8, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (8, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11285,12 +11285,12 @@ void
|
|||||||
Verify(message->messageID == NextFriendlyMessageID);
|
Verify(message->messageID == NextFriendlyMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (14, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (14, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (14, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (14, LAMP_BRIGHT);// 鉉
|
||||||
Entity *next_friendly = NULL;
|
Entity *next_friendly = NULL;
|
||||||
Sensor *sensor = vehicle->GetSensor();
|
Sensor *sensor = vehicle->GetSensor();
|
||||||
if(sensor)
|
if(sensor)
|
||||||
@@ -11303,7 +11303,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (14, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (14, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11328,12 +11328,12 @@ void
|
|||||||
Verify(message->messageID == PreviousFriendlyMessageID);
|
Verify(message->messageID == PreviousFriendlyMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (13, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (13, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (13, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (13, LAMP_BRIGHT);// 鉉
|
||||||
Entity *next_friendly = NULL;
|
Entity *next_friendly = NULL;
|
||||||
Sensor *sensor = vehicle->GetSensor();
|
Sensor *sensor = vehicle->GetSensor();
|
||||||
if(sensor)
|
if(sensor)
|
||||||
@@ -11346,7 +11346,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (13, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (13, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11371,12 +11371,12 @@ void
|
|||||||
Verify(message->messageID == NearestFriendlyMessageID);
|
Verify(message->messageID == NearestFriendlyMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (15, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (15, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (15, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (15, LAMP_BRIGHT);// 鉉
|
||||||
Entity *entity = NULL;
|
Entity *entity = NULL;
|
||||||
Sensor *sensor = vehicle->GetSensor();
|
Sensor *sensor = vehicle->GetSensor();
|
||||||
if(sensor)
|
if(sensor)
|
||||||
@@ -11388,7 +11388,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (15, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (15, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11478,7 +11478,7 @@ void VehicleInterface::OverrideShutdownMessageHandler(Adept::ReceiverDataMessage
|
|||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
//if (!GetShutdownState())
|
//if (!GetShutdownState())
|
||||||
// g_pRIOMain->SetLampState (18, LAMP_BRIGHT);// hyun
|
// g_pRIOMain->SetLampState (18, LAMP_BRIGHT);// 鉉
|
||||||
HeatManager *heat;
|
HeatManager *heat;
|
||||||
if (vehicle->IsDerivedFrom (Mech::DefaultData))
|
if (vehicle->IsDerivedFrom (Mech::DefaultData))
|
||||||
{
|
{
|
||||||
@@ -11492,7 +11492,7 @@ void VehicleInterface::OverrideShutdownMessageHandler(Adept::ReceiverDataMessage
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//if (!GetShutdownState())
|
//if (!GetShutdownState())
|
||||||
// g_pRIOMain->SetLampState (18, LAMP_DEFAULT);// hyun
|
// g_pRIOMain->SetLampState (18, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -11541,7 +11541,7 @@ void VehicleInterface::RightMFDMessageHandler (Adept::ReceiverDataMessageOf<int>
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (52, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (52, LAMP_BRIGHT);// 鉉
|
||||||
if(MWGUIManager::GetInstance())
|
if(MWGUIManager::GetInstance())
|
||||||
{
|
{
|
||||||
Check_Object(MWGUIManager::GetInstance());
|
Check_Object(MWGUIManager::GetInstance());
|
||||||
@@ -11552,7 +11552,7 @@ void VehicleInterface::RightMFDMessageHandler (Adept::ReceiverDataMessageOf<int>
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (52, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (52, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11584,12 +11584,12 @@ void VehicleInterface::LeftMFDMessageHandler (Adept::ReceiverDataMessageOf<int>
|
|||||||
Verify(message->messageID == LeftMFDMessageID);
|
Verify(message->messageID == LeftMFDMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (12, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (12, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (12, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (12, LAMP_BRIGHT);// 鉉
|
||||||
if(MWGUIManager::GetInstance())
|
if(MWGUIManager::GetInstance())
|
||||||
{
|
{
|
||||||
Check_Object(MWGUIManager::GetInstance());
|
Check_Object(MWGUIManager::GetInstance());
|
||||||
@@ -11610,7 +11610,7 @@ void VehicleInterface::LeftMFDMessageHandler (Adept::ReceiverDataMessageOf<int>
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (12, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (12, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -11632,12 +11632,12 @@ void VehicleInterface::ToggleRadarPassiveMessageHandler (Adept::ReceiverDataMess
|
|||||||
Verify(message->messageID == ToggleRadarPassiveMessageID);
|
Verify(message->messageID == ToggleRadarPassiveMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (25, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (25, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (25, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (25, LAMP_BRIGHT);// 鉉
|
||||||
if(!vehicle->vehicleShutDown)
|
if(!vehicle->vehicleShutDown)
|
||||||
{
|
{
|
||||||
if(MWGUIManager::GetInstance())
|
if(MWGUIManager::GetInstance())
|
||||||
@@ -11676,7 +11676,7 @@ void VehicleInterface::ToggleRadarPassiveMessageHandler (Adept::ReceiverDataMess
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (25, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (25, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11702,12 +11702,12 @@ void
|
|||||||
Verify(message->messageID == ToggleRadarRangeMessageID);
|
Verify(message->messageID == ToggleRadarRangeMessageID);
|
||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
g_pRIOMain->SetLampState (24, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (24, LAMP_OFF);// 鉉
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (24, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (24, LAMP_BRIGHT);// 鉉
|
||||||
if(!vehicle->vehicleShutDown)
|
if(!vehicle->vehicleShutDown)
|
||||||
{
|
{
|
||||||
if(MWGUIManager::GetInstance())
|
if(MWGUIManager::GetInstance())
|
||||||
@@ -11739,7 +11739,7 @@ void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (24, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (24, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13533,13 +13533,13 @@ void VehicleInterface::ShowObjectivesMessageHandler(Adept::ReceiverDataMessageOf
|
|||||||
{
|
{
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (36, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (36, LAMP_BRIGHT);// 鉉
|
||||||
g_bObjMode = !g_bObjMode;
|
g_bObjMode = !g_bObjMode;
|
||||||
// ObjectiveRenderer::Instance->ToggleObjective ();
|
// ObjectiveRenderer::Instance->ToggleObjective ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (36, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (36, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -13568,12 +13568,12 @@ void VehicleInterface::MuteMessageHandler(Adept::ReceiverDataMessageOf<int> *mes
|
|||||||
|
|
||||||
if(message->dataContents > 0)
|
if(message->dataContents > 0)
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (55, LAMP_BRIGHT);// hyun
|
g_pRIOMain->SetLampState (55, LAMP_BRIGHT);// 鉉
|
||||||
g_bMuteMode = !g_bMuteMode;
|
g_bMuteMode = !g_bMuteMode;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pRIOMain->SetLampState (55, LAMP_DEFAULT);// hyun
|
g_pRIOMain->SetLampState (55, LAMP_DEFAULT);// 鉉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13689,7 +13689,7 @@ void
|
|||||||
|
|
||||||
if (GetShutdownState()) {
|
if (GetShutdownState()) {
|
||||||
if (!g_bJumpZoom)
|
if (!g_bJumpZoom)
|
||||||
g_pRIOMain->SetLampState (16, LAMP_OFF);// hyun
|
g_pRIOMain->SetLampState (16, LAMP_OFF);// 鉉
|
||||||
g_pRIOMain->SetLampState (51, LAMP_OFF);
|
g_pRIOMain->SetLampState (51, LAMP_OFF);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -14489,7 +14489,7 @@ void VehicleInterface::ShowZoom (void)
|
|||||||
Check_Object(m_reticuleCamera);
|
Check_Object(m_reticuleCamera);
|
||||||
m_reticuleCamera->GetPerspective(near_clip, far_clip, horizontal_fov, height_to_width);
|
m_reticuleCamera->GetPerspective(near_clip, far_clip, horizontal_fov, height_to_width);
|
||||||
//m_reticuleCamera->SetPerspective(near_clip, far_clip, s_zoomFOV[0], height_to_width);
|
//m_reticuleCamera->SetPerspective(near_clip, far_clip, s_zoomFOV[0], height_to_width);
|
||||||
//sanghoon
|
//상훈
|
||||||
// jcem - begin
|
// jcem - begin
|
||||||
float fZoom;
|
float fZoom;
|
||||||
gosASSERT(g_fZoomFOVA >= g_fZoomFOVB);
|
gosASSERT(g_fZoomFOVA >= g_fZoomFOVB);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public:
|
|||||||
const char* m_pcsz;
|
const char* m_pcsz;
|
||||||
|
|
||||||
int m_nLauncherConnection; // 0: no connection, +1: connection, -1: connecting
|
int m_nLauncherConnection; // 0: no connection, +1: connection, -1: connecting
|
||||||
int m_nConnection2; // Connection to game or camera ship per m_bCameraShip, 0: no connection, +1: connected, -1: connecting
|
int m_nConnection2; // m_bCameraShip값에 따라 게임 혹은 카메라 쉽과의 접속을 의미, 0: no connection, +1: connection, -1: connecting
|
||||||
int m_nApplType;
|
int m_nApplType;
|
||||||
int m_nApplState;
|
int m_nApplState;
|
||||||
int m_nGameState;
|
int m_nGameState;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "MW4Headers.hpp"
|
#include "MW4Headers.hpp"
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
#include "MWMission.hpp"
|
#include "MWMission.hpp"
|
||||||
#include "VehicleInterface.hpp"
|
#include "VehicleInterface.hpp"
|
||||||
#include "Vehicle.hpp"
|
#include "Vehicle.hpp"
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
#include "mech.hpp"
|
#include "mech.hpp"
|
||||||
#include "mechlabheaders.h"
|
#include "mechlabheaders.h"
|
||||||
#include "bucket.hpp"
|
#include "bucket.hpp"
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
#include "hudcomp.hpp"
|
#include "hudcomp.hpp"
|
||||||
#include "HUDChat.hpp"
|
#include "HUDChat.hpp"
|
||||||
#include "hudcomm.hpp"
|
#include "hudcomm.hpp"
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
#include "mwapplication.hpp"
|
#include "mwapplication.hpp"
|
||||||
#include "..\missionlang\resource.h"
|
#include "..\missionlang\resource.h"
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddraw.h>
|
#include <ddraw.h>
|
||||||
#include <d3d.h>
|
#include <d3d.h>
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
extern Scalar g_fLastStartTime;
|
extern Scalar g_fLastStartTime;
|
||||||
extern Adept::ReplicatorID g_LastTarget;
|
extern Adept::ReplicatorID g_LastTarget;
|
||||||
|
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
|
|
||||||
extern "C" char* _stdcall CharPrevA(const char* lpszStart, const char* lpszCurrent);
|
extern "C" char* _stdcall CharPrevA(const char* lpszStart, const char* lpszCurrent);
|
||||||
#define CharPrev CharPrevA
|
#define CharPrev CharPrevA
|
||||||
@@ -164,7 +164,7 @@ void HUDChat::Reset (void)
|
|||||||
// KillData ();
|
// KillData ();
|
||||||
comm = Cast_Object (HUDComm *, MWGUIManager::GetInstance ()->Component (MWGUIManager::HUD_COMM));
|
comm = Cast_Object (HUDComm *, MWGUIManager::GetInstance ()->Component (MWGUIManager::HUD_COMM));
|
||||||
|
|
||||||
//Load map data for mr_device.
|
//mr_device의 맵 데이타를 로드한다.
|
||||||
if(hsh_mrdev_initialized){
|
if(hsh_mrdev_initialized){
|
||||||
extern char AssetsDirectory1[MAX_PATH];
|
extern char AssetsDirectory1[MAX_PATH];
|
||||||
const Map__GameModel *model = Map::GetInstance ()->GetGameModel ();
|
const Map__GameModel *model = Map::GetInstance ()->GetGameModel ();
|
||||||
@@ -228,12 +228,12 @@ static const float sm1_offset[][2]={
|
|||||||
{ 0*2, 0*2}, //special2
|
{ 0*2, 0*2}, //special2
|
||||||
};
|
};
|
||||||
|
|
||||||
//number: 0,1,2,3 lancemate order..
|
//number: 0,1,2,3 lancemate의 순서..
|
||||||
//part: mech part of the lancemate
|
//part: 해당 lancemate mech의 part
|
||||||
//color: color for this part
|
//color:해당 part의 color
|
||||||
void RenderAux1SmallMech(int num,int part,int color)
|
void RenderAux1SmallMech(int num,int part,int color)
|
||||||
{
|
{
|
||||||
//Draw according to each offset.
|
//각각의 offset에 따라서 그린다.
|
||||||
if(sm1_texture[part][2]!=0){
|
if(sm1_texture[part][2]!=0){
|
||||||
mfd_device.DrawTexture(
|
mfd_device.DrawTexture(
|
||||||
sm1_offset[part][0]+190+num*160,
|
sm1_offset[part][0]+190+num*160,
|
||||||
@@ -598,15 +598,15 @@ void HUDChat::DrawImplementation(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(draw_mr){
|
if(draw_mr){
|
||||||
//Draw mission review content.
|
//미션 리뷰 내용을 그린다.
|
||||||
//_______________________________________________________________________________________________________
|
//_______________________________________________________________________________________________________
|
||||||
//
|
//
|
||||||
// Mech status and messages
|
// Mech상태 및 메시지
|
||||||
//_______________________________________________________________________________________________________
|
//_______________________________________________________________________________________________________
|
||||||
if(!mr_device.map_loaded){
|
if(!mr_device.map_loaded){
|
||||||
comm = Cast_Object (HUDComm *, MWGUIManager::GetInstance ()->Component (MWGUIManager::HUD_COMM));
|
comm = Cast_Object (HUDComm *, MWGUIManager::GetInstance ()->Component (MWGUIManager::HUD_COMM));
|
||||||
|
|
||||||
//Load map data for mr_device.
|
//mr_device의 맵 데이타를 로드한다.
|
||||||
extern char AssetsDirectory1[MAX_PATH];
|
extern char AssetsDirectory1[MAX_PATH];
|
||||||
const Map__GameModel *model = Map::GetInstance ()->GetGameModel ();
|
const Map__GameModel *model = Map::GetInstance ()->GetGameModel ();
|
||||||
char temp[256];
|
char temp[256];
|
||||||
@@ -629,7 +629,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
int mech_count=0;
|
int mech_count=0;
|
||||||
PMechInfo pMechInfos = &g_aMechInfos[0];
|
PMechInfo pMechInfos = &g_aMechInfos[0];
|
||||||
{
|
{
|
||||||
//Draw the name/Kill/Death stats of other mechs.
|
//현재 다른 메크들의 이름 /Kill/Death를 그린다.
|
||||||
mech_count=MWApplication::GetInstance()->GetMechInfos(2, g_aMechInfos, g_TeamOrderOthers);
|
mech_count=MWApplication::GetInstance()->GetMechInfos(2, g_aMechInfos, g_TeamOrderOthers);
|
||||||
g_TeamOrderCount=mech_count;
|
g_TeamOrderCount=mech_count;
|
||||||
if (mech_count > 8) // jcem
|
if (mech_count > 8) // jcem
|
||||||
@@ -657,7 +657,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
|
|
||||||
|
|
||||||
mr_device.pD3DDevice->SetTexture(0,mr_device.pDDSTexture);
|
mr_device.pD3DDevice->SetTexture(0,mr_device.pDDSTexture);
|
||||||
//Draw mech Damage status.
|
//메크의 Damage 상태를 그린다.
|
||||||
for (j=0;j<11;j++){
|
for (j=0;j<11;j++){
|
||||||
if (j==7 || j==9 || j==10)
|
if (j==7 || j==9 || j==10)
|
||||||
continue;
|
continue;
|
||||||
@@ -669,7 +669,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw mech Callsign/Score/Kills/Deaths.
|
//메크의 Callsign/Score/Kills/Deaths를 그린다.
|
||||||
int nScore = 0, nKills = 0, nDeaths = 0;
|
int nScore = 0, nKills = 0, nDeaths = 0;
|
||||||
callsign=pMechInfos->m_pcszName;
|
callsign=pMechInfos->m_pcszName;
|
||||||
if (hud) {
|
if (hud) {
|
||||||
@@ -695,7 +695,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
pMechInfos++;
|
pMechInfos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw the contents of the chat window.
|
//채팅장의 내용을 그린다.
|
||||||
stlport::list<ChatData>::iterator iter;
|
stlport::list<ChatData>::iterator iter;
|
||||||
int cy=300+30;//chat_y
|
int cy=300+30;//chat_y
|
||||||
for (iter = m_Messages.begin ();iter != m_Messages.end ();iter++){
|
for (iter = m_Messages.begin ();iter != m_Messages.end ();iter++){
|
||||||
@@ -733,8 +733,8 @@ void HUDChat::DrawImplementation(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
// Secondary Maps
|
// Secondary Maps
|
||||||
//Draw map and boundary. (Drawn once since it does not change during game.)
|
//맵과 맵 경계선을 그린다. (게임중에 변하지 않으므로 한번만 그린다.)
|
||||||
//DrawMapBoundary();//Implement alternate version...
|
//DrawMapBoundary();//다른 버전 구현할 것...
|
||||||
mr_device.pD3DDevice->SetRenderState(D3DRENDERSTATE_CLIPPING ,TRUE);
|
mr_device.pD3DDevice->SetRenderState(D3DRENDERSTATE_CLIPPING ,TRUE);
|
||||||
mr_device.pD3DDevice->SetTexture(0,mr_device.pDDSMapTexture);
|
mr_device.pD3DDevice->SetTexture(0,mr_device.pDDSMapTexture);
|
||||||
mr_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
|
mr_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
|
||||||
@@ -748,7 +748,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
//MechWarrior4::VehicleInterface* p = MechWarrior4::VehicleInterface::GetInstance();
|
//MechWarrior4::VehicleInterface* p = MechWarrior4::VehicleInterface::GetInstance();
|
||||||
|
|
||||||
|
|
||||||
//In mission review, current mech is shown at center so the map scrolls.
|
//미션 리뷰에서는 현재 메크가 중심에 표시되므로 맵이 스크롤 되어 표시된다.
|
||||||
float MR_MSF=4.0f;//Mission Review - Map Scale Factor
|
float MR_MSF=4.0f;//Mission Review - Map Scale Factor
|
||||||
const float ViewSize=300.0f;//Mission Review - Map Size
|
const float ViewSize=300.0f;//Mission Review - Map Size
|
||||||
const float ViewLMargin=10;
|
const float ViewLMargin=10;
|
||||||
@@ -758,9 +758,9 @@ void HUDChat::DrawImplementation(void)
|
|||||||
|
|
||||||
D3DVIEWPORT7 viewport={ViewLMargin,ViewTMargin,ViewSize,ViewSize,0.0f,1.0f};
|
D3DVIEWPORT7 viewport={ViewLMargin,ViewTMargin,ViewSize,ViewSize,0.0f,1.0f};
|
||||||
mr_device.pD3DDevice->SetViewport(&viewport);
|
mr_device.pD3DDevice->SetViewport(&viewport);
|
||||||
///////////////////// MAP BEGIN //////////////////////
|
///////////////////// MAP 시작 //////////////////////
|
||||||
|
|
||||||
//Need to add routine to set Focus Mech.
|
//Focus Mech를 설정하는 루틴을 넣어야한다.
|
||||||
Scalar multx,multz;
|
Scalar multx,multz;
|
||||||
|
|
||||||
|
|
||||||
@@ -787,10 +787,10 @@ void HUDChat::DrawImplementation(void)
|
|||||||
|
|
||||||
mr_device.pD3DDevice->SetTexture(0,mr_device.pDDSTexture);
|
mr_device.pD3DDevice->SetTexture(0,mr_device.pDDSTexture);
|
||||||
|
|
||||||
//Draw mechs on map. Text first..
|
//맵상에 메크들들 그리기.텍스트 먼저..
|
||||||
for(i=0,pMechInfos = &g_aMechInfos[0];i<mech_count;i++,pMechInfos++){
|
for(i=0,pMechInfos = &g_aMechInfos[0];i<mech_count;i++,pMechInfos++){
|
||||||
Mech* pMech = pMechInfos->m_pMech;
|
Mech* pMech = pMechInfos->m_pMech;
|
||||||
//TODO: get mech position..
|
//메크의 위치를 구할 것..
|
||||||
|
|
||||||
Stuff::Point3D pos;
|
Stuff::Point3D pos;
|
||||||
|
|
||||||
@@ -827,10 +827,10 @@ void HUDChat::DrawImplementation(void)
|
|||||||
color,callsign,TEXTALIGN_HCENTER|TEXTALIGN_TOP);
|
color,callsign,TEXTALIGN_HCENTER|TEXTALIGN_TOP);
|
||||||
|
|
||||||
}
|
}
|
||||||
//Draw icon.
|
//아이콘 그리기.
|
||||||
for(i=0,pMechInfos = &g_aMechInfos[0];i<mech_count;i++,pMechInfos++){
|
for(i=0,pMechInfos = &g_aMechInfos[0];i<mech_count;i++,pMechInfos++){
|
||||||
Mech* pMech = pMechInfos->m_pMech;
|
Mech* pMech = pMechInfos->m_pMech;
|
||||||
//TODO: get mech position..
|
//메크의 위치를 구할 것..
|
||||||
|
|
||||||
Stuff::Point3D pos;
|
Stuff::Point3D pos;
|
||||||
|
|
||||||
@@ -886,7 +886,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
mr_device.pD3DDevice->SetViewport(&viewport2);
|
mr_device.pD3DDevice->SetViewport(&viewport2);
|
||||||
|
|
||||||
|
|
||||||
///////////////////// MAP END //////////////////////
|
///////////////////// MAP 끝 //////////////////////
|
||||||
|
|
||||||
//_______________________________________________________________________________________________________
|
//_______________________________________________________________________________________________________
|
||||||
//
|
//
|
||||||
@@ -894,7 +894,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
//_______________________________________________________________________________________________________
|
//_______________________________________________________________________________________________________
|
||||||
|
|
||||||
|
|
||||||
//Draw mission timer... taken from DrawImplementation in hudtimer.cpp..
|
//미션 시간 그리기...hudtimer.cpp에 DrawImplementation에서 따온것임..
|
||||||
MWMission *mwmiss = Cast_Object (MWMission *,Mission::GetInstance ());
|
MWMission *mwmiss = Cast_Object (MWMission *,Mission::GetInstance ());
|
||||||
Verify (mwmiss);
|
Verify (mwmiss);
|
||||||
Stuff::Scalar cur_time=mwmiss->GetMissionTime();//-mwmiss->GetMissionTime();
|
Stuff::Scalar cur_time=mwmiss->GetMissionTime();//-mwmiss->GetMissionTime();
|
||||||
@@ -923,7 +923,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
if(g_nTeamOrderMode==TEAM_MODE){
|
if(g_nTeamOrderMode==TEAM_MODE){
|
||||||
int i,j;
|
int i,j;
|
||||||
int size=3;
|
int size=3;
|
||||||
//Draw mech status.
|
//메크들의 상태를 그린다.
|
||||||
PMechInfo pMechInfos = &g_aMechInfos[1];
|
PMechInfo pMechInfos = &g_aMechInfos[1];
|
||||||
size=MWApplication::GetInstance()->GetMechInfos(0, g_aMechInfos, g_TeamOrderOthers);
|
size=MWApplication::GetInstance()->GetMechInfos(0, g_aMechInfos, g_TeamOrderOthers);
|
||||||
size--;
|
size--;
|
||||||
@@ -970,7 +970,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
pMechInfos++;
|
pMechInfos++;
|
||||||
}
|
}
|
||||||
mfd_device.DrawMFDBackText(mfd_text_comm1);
|
mfd_device.DrawMFDBackText(mfd_text_comm1);
|
||||||
//Draw the contents of the chat window.
|
//채팅장의 내용을 그린다.
|
||||||
stlport::list<ChatData>::iterator iter;
|
stlport::list<ChatData>::iterator iter;
|
||||||
int cy=240;//chat_y
|
int cy=240;//chat_y
|
||||||
for (iter = m_Messages.begin ();iter != m_Messages.end ();iter++){
|
for (iter = m_Messages.begin ();iter != m_Messages.end ();iter++){
|
||||||
@@ -996,7 +996,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}else if(g_nTeamOrderMode==FREEFORALL_MODE){
|
}else if(g_nTeamOrderMode==FREEFORALL_MODE){
|
||||||
//Draw the name/Kill/Death stats of other mechs.
|
//현재 다른 메크들의 이름 /Kill/Death를 그린다.
|
||||||
int size=0;
|
int size=0;
|
||||||
PMechInfo pMechInfos = &g_aMechInfos[1];
|
PMechInfo pMechInfos = &g_aMechInfos[1];
|
||||||
size=MWApplication::GetInstance()->GetMechInfos(2, g_aMechInfos, g_TeamOrderOthers);
|
size=MWApplication::GetInstance()->GetMechInfos(2, g_aMechInfos, g_TeamOrderOthers);
|
||||||
@@ -1006,10 +1006,10 @@ void HUDChat::DrawImplementation(void)
|
|||||||
size = 7;
|
size = 7;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
//Clear the numbers first.
|
//번호를 먼저 지운다.
|
||||||
// MSL 5.03 Comm MFD
|
// MSL 5.03 Comm MFD
|
||||||
for(i=0;i<7;i++)mfd_text_comm3[i][0]=0;
|
for(i=0;i<7;i++)mfd_text_comm3[i][0]=0;
|
||||||
//Fill in the numbers.
|
//번호를 채워 넣는다.
|
||||||
// MSL 5.03 Comm MFD
|
// MSL 5.03 Comm MFD
|
||||||
for(i=0;i<size;i++)itoa(i+1,mfd_text_comm3[i],10);
|
for(i=0;i<size;i++)itoa(i+1,mfd_text_comm3[i],10);
|
||||||
|
|
||||||
@@ -1064,8 +1064,8 @@ void HUDChat::DrawImplementation(void)
|
|||||||
if(size.cx<160){
|
if(size.cx<160){
|
||||||
mfd_device.pFont[1].DrawText((float)p2->x,(float)p2->y,0xFFFFFFFF,callsign,TEXTALIGN_ORG);
|
mfd_device.pFont[1].DrawText((float)p2->x,(float)p2->y,0xFFFFFFFF,callsign,TEXTALIGN_ORG);
|
||||||
}else{
|
}else{
|
||||||
//Even the minimum font size is exceeded...
|
//최소크기 폰트도.. 넘어선다...
|
||||||
//Split into 2 lines.
|
//2line으로 만든다.
|
||||||
char callsign2[128];
|
char callsign2[128];
|
||||||
strcpy(callsign2,callsign);
|
strcpy(callsign2,callsign);
|
||||||
int len2=strlen(callsign)/2;
|
int len2=strlen(callsign)/2;
|
||||||
@@ -1120,7 +1120,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
|
|
||||||
pMechInfos++;
|
pMechInfos++;
|
||||||
}
|
}
|
||||||
//Draw the contents of the chat window.
|
//채팅장의 내용을 그린다.
|
||||||
stlport::list<ChatData>::iterator iter;
|
stlport::list<ChatData>::iterator iter;
|
||||||
int cy=180;//chat_y
|
int cy=180;//chat_y
|
||||||
for (iter = m_Messages.begin ();iter != m_Messages.end ();iter++){
|
for (iter = m_Messages.begin ();iter != m_Messages.end ();iter++){
|
||||||
@@ -1145,7 +1145,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
iter = m_Messages.erase (iter);
|
iter = m_Messages.erase (iter);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
//Taken from MWMission.cpp
|
//MWMission.cpp에서 가져온것인
|
||||||
MWMission *mwmiss = Cast_Object (MWMission *,Mission::GetInstance ());
|
MWMission *mwmiss = Cast_Object (MWMission *,Mission::GetInstance ());
|
||||||
|
|
||||||
int death=0,kill=0;//,score
|
int death=0,kill=0;//,score
|
||||||
@@ -1167,7 +1167,7 @@ void HUDChat::DrawImplementation(void)
|
|||||||
}else if(g_nTeamOrderMode==TEAM_MESSAGE2){
|
}else if(g_nTeamOrderMode==TEAM_MESSAGE2){
|
||||||
;//do nothing
|
;//do nothing
|
||||||
}
|
}
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
mfd_device.EndChannel();
|
mfd_device.EndChannel();
|
||||||
} else {
|
} else {
|
||||||
}//hsh_initialized
|
}//hsh_initialized
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "MW4Headers.hpp"
|
#include "MW4Headers.hpp"
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
#include "MWMission.hpp"
|
#include "MWMission.hpp"
|
||||||
#include "VehicleInterface.hpp"
|
#include "VehicleInterface.hpp"
|
||||||
#include "Narc.hpp"
|
#include "Narc.hpp"
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
#include "mwguimanager.hpp"
|
#include "mwguimanager.hpp"
|
||||||
#include "MWPlayer.hpp"
|
#include "MWPlayer.hpp"
|
||||||
#include <Adept\Mission.hpp>
|
#include <Adept\Mission.hpp>
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
#include "hudcomp.hpp"
|
#include "hudcomp.hpp"
|
||||||
#include "HUDComm.hpp"
|
#include "HUDComm.hpp"
|
||||||
@@ -25,14 +25,14 @@
|
|||||||
#include "..\missionlang\resource.h"
|
#include "..\missionlang\resource.h"
|
||||||
#include "mechlabheaders.h"
|
#include "mechlabheaders.h"
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddraw.h>
|
#include <ddraw.h>
|
||||||
#include <d3d.h>
|
#include <d3d.h>
|
||||||
|
|
||||||
#include <GameOS\render.hpp>
|
#include <GameOS\render.hpp>
|
||||||
|
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
|
|
||||||
using namespace MechWarrior4;
|
using namespace MechWarrior4;
|
||||||
|
|
||||||
|
|||||||
@@ -333,7 +333,7 @@ inline DWORD DarkerColor (DWORD color)
|
|||||||
{ m_Justification = value; }
|
{ m_Justification = value; }
|
||||||
void Wrap (bool value)
|
void Wrap (bool value)
|
||||||
{ m_Wrap = value; }
|
{ m_Wrap = value; }
|
||||||
//sanghoon
|
//상훈
|
||||||
void SetAsAlt(){
|
void SetAsAlt(){
|
||||||
m_Font=altFontHandle;
|
m_Font=altFontHandle;
|
||||||
}
|
}
|
||||||
@@ -381,9 +381,9 @@ inline DWORD DarkerColor (DWORD color)
|
|||||||
virtual void EndPos (DWORD& x,DWORD& y, bool bAdjust = true);
|
virtual void EndPos (DWORD& x,DWORD& y, bool bAdjust = true);
|
||||||
bool Empty (void)
|
bool Empty (void)
|
||||||
{ return (m_Text[0] == 0); }
|
{ return (m_Text[0] == 0); }
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
char *hsh_get_m_Text(){return m_Text;}
|
char *hsh_get_m_Text(){return m_Text;}
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
};
|
};
|
||||||
|
|
||||||
class HUDNumberText : public HUDText
|
class HUDNumberText : public HUDText
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ void HUDTargetArrow::SetZoomWindow(Stuff::Scalar left,Stuff::Scalar top,Stuff::S
|
|||||||
|
|
||||||
void HUDTargetArrow::DrawImplementation(void)
|
void HUDTargetArrow::DrawImplementation(void)
|
||||||
{
|
{
|
||||||
//sanghoon - need to find where blink handling is done.
|
//상훈-깜박임 처리는 어디서 하는지 찾아 볼것.
|
||||||
Point3D loc,size;
|
Point3D loc,size;
|
||||||
DWORD color;
|
DWORD color;
|
||||||
int textx,texty,ty2;
|
int textx,texty,ty2;
|
||||||
@@ -208,7 +208,7 @@ void HUDTargetArrow::DrawImplementation(void)
|
|||||||
{
|
{
|
||||||
size = m_Textures[5]->Size ();
|
size = m_Textures[5]->Size ();
|
||||||
m_Textures[5]->Draw (Point3D (m_TargetX,m_TargetY,0.9f),size,color);
|
m_Textures[5]->Draw (Point3D (m_TargetX,m_TargetY,0.9f),size,color);
|
||||||
//Texture of four angle brackets merged into one...
|
//꺽쇠 네개가 하나로 합쳐진 텍스쳐...
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -278,7 +278,7 @@ void HUDTorsoBar::DrawImplementation(void)
|
|||||||
Scalar currentxval,currentyval;
|
Scalar currentxval,currentyval;
|
||||||
Point3D size,loc,texsize;
|
Point3D size,loc,texsize;
|
||||||
|
|
||||||
//Routine to draw the graph representing the x-axis...
|
//x축을 나타내는 그래프를 그리는 루틴...
|
||||||
//_________________________________________________________________________
|
//_________________________________________________________________________
|
||||||
size = TwistSize ();
|
size = TwistSize ();
|
||||||
texsize = m_Textures[0]->Size ();
|
texsize = m_Textures[0]->Size ();
|
||||||
@@ -289,7 +289,7 @@ void HUDTorsoBar::DrawImplementation(void)
|
|||||||
if (currentxval > 0)
|
if (currentxval > 0)
|
||||||
loc.x += 1.0f;
|
loc.x += 1.0f;
|
||||||
DWORD color = DarkerColor (Color ());
|
DWORD color = DarkerColor (Color ());
|
||||||
//Draw horizontal ruler. (arrows not included)
|
//가로 ruler를 그린다.(화살표는 들어있지 않음)
|
||||||
m_Textures[5]->Draw (loc,m_Textures[5]->Size (),color,HUDTexture::NO_FLIP,true);
|
m_Textures[5]->Draw (loc,m_Textures[5]->Size (),color,HUDTexture::NO_FLIP,true);
|
||||||
color = Color ();
|
color = Color ();
|
||||||
if (currentxval != 0)
|
if (currentxval != 0)
|
||||||
@@ -315,19 +315,19 @@ void HUDTorsoBar::DrawImplementation(void)
|
|||||||
ty= (DWORD) (loc.y+size.y+10);
|
ty= (DWORD) (loc.y+size.y+10);
|
||||||
if ((currentxval > 5) || (currentxval < -5))
|
if ((currentxval > 5) || (currentxval < -5))
|
||||||
{
|
{
|
||||||
//Shows direction indicator when torso twist is excessive..
|
//과도한 twist시에 방향표시해줌..
|
||||||
m_TwistText->Draw (Point3D ((Scalar) tx,(Scalar) ty,0.9f));
|
m_TwistText->Draw (Point3D ((Scalar) tx,(Scalar) ty,0.9f));
|
||||||
}
|
}
|
||||||
//Upper body indicator rectangle..
|
//상체표시 사각형..
|
||||||
// Changed Torso Bar from Green to Yellow
|
// Changed Torso Bar from Green to Yellow
|
||||||
// MSL 5.00
|
// MSL 5.00
|
||||||
color = MakeColor (255,255,0,250);
|
color = MakeColor (255,255,0,250);
|
||||||
my_DrawRect (min,(int) loc.y,max,(int) (loc.y+size.y),color);
|
my_DrawRect (min,(int) loc.y,max,(int) (loc.y+size.y),color);
|
||||||
|
|
||||||
color = DarkerColor (Color ());
|
color = DarkerColor (Color ());
|
||||||
//Top arrow indicating upper body direction..
|
//위쪽, 상체 방향표시 화살표..
|
||||||
m_Textures[2]->Draw (Point3D (loc.x-currentxval,loc.y-1,0.9f),texsize,color);
|
m_Textures[2]->Draw (Point3D (loc.x-currentxval,loc.y-1,0.9f),texsize,color);
|
||||||
//Bottom arrow indicating center position..
|
//아래쪽. 중심표시 화살표..
|
||||||
m_Textures[3]->Draw (Point3D (loc.x-1,loc.y+size.y+1,0.9f),texsize,color);
|
m_Textures[3]->Draw (Point3D (loc.x-1,loc.y+size.y+1,0.9f),texsize,color);
|
||||||
// DrawLine ((int) (loc.x-currentxval),(int) (loc.y-1),(int) (loc.x-currentxval),(int) (loc.y+size.y),color);
|
// DrawLine ((int) (loc.x-currentxval),(int) (loc.y-1),(int) (loc.x-currentxval),(int) (loc.y+size.y),color);
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ void HUDTorsoBar::DrawImplementation(void)
|
|||||||
// DrawLine ((int) (loc.x),(int) (loc.y-1),(int) (loc.x),(int) (loc.y+size.y),color);
|
// DrawLine ((int) (loc.x),(int) (loc.y-1),(int) (loc.x),(int) (loc.y+size.y),color);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Routine to draw graph for y-axis... <== no excessive up/down text here.
|
//y축을 나타내는 그래프를 그리는 루틴...<==여기는 과도한 상하를 나타내는 텍스트가 없다.
|
||||||
//_________________________________________________________________________
|
//_________________________________________________________________________
|
||||||
size = PitchSize ();
|
size = PitchSize ();
|
||||||
currentyval = (m_TorsoPitch*size.y)/100.0f; // 33 is the width of the bar
|
currentyval = (m_TorsoPitch*size.y)/100.0f; // 33 is the width of the bar
|
||||||
@@ -382,7 +382,7 @@ void HUDTorsoBar::DrawImplementation(void)
|
|||||||
m_Textures[1]->Draw (Point3D (loc.x+size.x,loc.y,0.9f),texsize,color);
|
m_Textures[1]->Draw (Point3D (loc.x+size.x,loc.y,0.9f),texsize,color);
|
||||||
// DrawLine ((int) (loc.x-1),(int) (loc.y),(int) (loc.x+size.x+2),(int) (loc.y),color);
|
// DrawLine ((int) (loc.x-1),(int) (loc.y),(int) (loc.x+size.x+2),(int) (loc.y),color);
|
||||||
}
|
}
|
||||||
//End.. DrawImplementation.
|
//끝.. DrawImplementation.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "mwapplication.hpp"
|
#include "mwapplication.hpp"
|
||||||
#include "..\missionlang\resource.h"
|
#include "..\missionlang\resource.h"
|
||||||
|
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddraw.h>
|
#include <ddraw.h>
|
||||||
#include <d3d.h>
|
#include <d3d.h>
|
||||||
@@ -34,7 +34,7 @@ bool g_bNextTargetMode = false;
|
|||||||
bool g_bCrossTargetMode = false;
|
bool g_bCrossTargetMode = false;
|
||||||
// MSL 5.03 Secondary Damage Display
|
// MSL 5.03 Secondary Damage Display
|
||||||
int g_nAuxilMode = 0;
|
int g_nAuxilMode = 0;
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
|
|
||||||
using namespace MechWarrior4;
|
using namespace MechWarrior4;
|
||||||
namespace HUDDAMAGE
|
namespace HUDDAMAGE
|
||||||
@@ -330,9 +330,9 @@ HUDDamage::HUDDamage()
|
|||||||
Color (MakeColor (0,175,0,150));
|
Color (MakeColor (0,175,0,150));
|
||||||
m_DamageFlashTime = 0;
|
m_DamageFlashTime = 0;
|
||||||
m_HitFlashTime = 0;
|
m_HitFlashTime = 0;
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
VehicleInterface::GetInstance()->hudDamageMode=false;
|
VehicleInterface::GetInstance()->hudDamageMode=false;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
m_ArmorMode = VehicleInterface::GetInstance()->hudDamageMode;
|
m_ArmorMode = VehicleInterface::GetInstance()->hudDamageMode;
|
||||||
for (i=0;i<MAX_HUD_DAMAGE_ZONE+1;i++)
|
for (i=0;i<MAX_HUD_DAMAGE_ZONE+1;i++)
|
||||||
{
|
{
|
||||||
@@ -410,7 +410,7 @@ void HUDDamage::Reset (void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//sanghoon
|
//상훈
|
||||||
mfd_device.LoadDamageTexture(texturename[m_MechID]);
|
mfd_device.LoadDamageTexture(texturename[m_MechID]);
|
||||||
radar_device.LoadRadarDamageTexture(texturename[m_MechID]);
|
radar_device.LoadRadarDamageTexture(texturename[m_MechID]);
|
||||||
}
|
}
|
||||||
@@ -464,7 +464,7 @@ void HUDDamage::ArmorValue (Scalar values[MAX_HUD_DAMAGE_ZONE+1],bool firstpass)
|
|||||||
m_ArmorValues[i] = values[i];
|
m_ArmorValues[i] = values[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
|
|
||||||
//nst DWORD SH_DamageColor[6]={0xFFFFFFFF,0xFFCCCCCC,0xFF999999,0xFF666666,0xFF333333,0xFF000000};
|
//nst DWORD SH_DamageColor[6]={0xFFFFFFFF,0xFFCCCCCC,0xFF999999,0xFF666666,0xFF333333,0xFF000000};
|
||||||
const DWORD SH_DamageColor[6]={0xFFFFFFFF,0xFFDDDDDD,0xFFBBBBBB,0xFF999999,0xFF777777,0xFF333333};
|
const DWORD SH_DamageColor[6]={0xFFFFFFFF,0xFFDDDDDD,0xFFBBBBBB,0xFF999999,0xFF777777,0xFF333333};
|
||||||
@@ -566,7 +566,7 @@ static RECT damage_back_frames[4]={
|
|||||||
{504,245,566,382},
|
{504,245,566,382},
|
||||||
{573,245,634,382},
|
{573,245,634,382},
|
||||||
};
|
};
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
void HUDDamage::DrawImplementation(void)
|
void HUDDamage::DrawImplementation(void)
|
||||||
{
|
{
|
||||||
@@ -632,7 +632,7 @@ void HUDDamage::DrawImplementation(void)
|
|||||||
color = Color ();
|
color = Color ();
|
||||||
for (i=0;i<10;i++)
|
for (i=0;i<10;i++)
|
||||||
{
|
{
|
||||||
//Is this where text is drawn??
|
//글자를 그리는 곳인가??
|
||||||
m_Textures[20+i]->Draw (Point3D ((Scalar) bartable[i]+1.0f,(Scalar) y,0.9f),size,MakeColor (255,255,255,255),HUDTexture::NO_FLIP,true);
|
m_Textures[20+i]->Draw (Point3D ((Scalar) bartable[i]+1.0f,(Scalar) y,0.9f),size,MakeColor (255,255,255,255),HUDTexture::NO_FLIP,true);
|
||||||
if (!(m_HitFlashCount[trans_array[i]] & 0x01))
|
if (!(m_HitFlashCount[trans_array[i]] & 0x01))
|
||||||
{
|
{
|
||||||
@@ -752,7 +752,7 @@ void HUDDamage::DrawImplementation(void)
|
|||||||
fred = 0;
|
fred = 0;
|
||||||
|
|
||||||
for (i=0;i<11;i++)
|
for (i=0;i<11;i++)
|
||||||
{//What does the number 13 mean here?
|
{//13이라는 숫자가 의미하는 것은 무엇일까?
|
||||||
#if 0
|
#if 0
|
||||||
if (i != fred)
|
if (i != fred)
|
||||||
{
|
{
|
||||||
@@ -872,7 +872,7 @@ void HUDDamage::DrawImplementation(void)
|
|||||||
mfd_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA );
|
mfd_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA );
|
||||||
mfd_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
mfd_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
||||||
|
|
||||||
//The original spacing is 13,14,14,14,14,14,14,14,16,14.
|
//원래것은..13,14,14,14,14,14,14,14,16,14의 간격을 두고 있다.
|
||||||
const hsh_bartable[11] = {26+61*0,26+61*1,26+61*2,26+61*3,26+61*4,26+61*5,26+61*6,26+61*7,522,591,540};
|
const hsh_bartable[11] = {26+61*0,26+61*1,26+61*2,26+61*3,26+61*4,26+61*5,26+61*6,26+61*7,522,591,540};
|
||||||
|
|
||||||
DWORD color=0xFFFFFFFF;
|
DWORD color=0xFFFFFFFF;
|
||||||
@@ -907,7 +907,7 @@ void HUDDamage::DrawImplementation(void)
|
|||||||
radar_device.pDDSTarget->Blt(&rc,NULL,NULL,DDBLT_COLORFILL ,&fx);
|
radar_device.pDDSTarget->Blt(&rc,NULL,NULL,DDBLT_COLORFILL ,&fx);
|
||||||
|
|
||||||
for (i=0;i<11;i++)
|
for (i=0;i<11;i++)
|
||||||
{//What does the number 13 mean here?
|
{//13이라는 숫자가 의미하는 것은 무엇일까?
|
||||||
int dv=m_DamageValues[i];
|
int dv=m_DamageValues[i];
|
||||||
DWORD color=0xFF000000;
|
DWORD color=0xFF000000;
|
||||||
if(0<=dv && dv<=5)
|
if(0<=dv && dv<=5)
|
||||||
@@ -948,7 +948,7 @@ void HUDDamage::DrawImplementation(void)
|
|||||||
{
|
{
|
||||||
if (m_ArmorValues[trans_array[i]] != -1)
|
if (m_ArmorValues[trans_array[i]] != -1)
|
||||||
{
|
{
|
||||||
hsh_x=hsh_bartable[i];//Exception at index 7.
|
hsh_x=hsh_bartable[i];//7에서는 예외이다.
|
||||||
int tr=trans_array[i];
|
int tr=trans_array[i];
|
||||||
|
|
||||||
DWORD color=(m_HitFlashCount[tr] & 0x01)? 0xFFFFFFFF : SH_DamageColor[m_DamageValues[tr]];
|
DWORD color=(m_HitFlashCount[tr] & 0x01)? 0xFFFFFFFF : SH_DamageColor[m_DamageValues[tr]];
|
||||||
@@ -999,7 +999,7 @@ void HUDDamage::DrawImplementation(void)
|
|||||||
mfd_device.LoadDamageTexture(texturename[m_MechID]);
|
mfd_device.LoadDamageTexture(texturename[m_MechID]);
|
||||||
|
|
||||||
for (i=0;i<13;i++)
|
for (i=0;i<13;i++)
|
||||||
{//What does the number 13 mean here?
|
{//13이라는 숫자가 의미하는 것은 무엇일까?
|
||||||
int dv=m_DamageValues[i];
|
int dv=m_DamageValues[i];
|
||||||
DWORD color=0xFF000000;
|
DWORD color=0xFF000000;
|
||||||
if(0<=dv && dv<=5)color=SH_DamageColor[dv];
|
if(0<=dv && dv<=5)color=SH_DamageColor[dv];
|
||||||
@@ -1249,7 +1249,7 @@ HUDTargetDamage::HUDTargetDamage() :
|
|||||||
m_TargetName->Justification (HUDText::LEFT_ALIGN);
|
m_TargetName->Justification (HUDText::LEFT_ALIGN);
|
||||||
m_TargetRangeText = new HUDNumberText ();
|
m_TargetRangeText = new HUDNumberText ();
|
||||||
m_TargetRangeText->Justification (HUDText::LEFT_ALIGN);
|
m_TargetRangeText->Justification (HUDText::LEFT_ALIGN);
|
||||||
//sanghoon
|
//상훈
|
||||||
// m_TargetRangeText->SetSize(HUDText::LARGE_SIZE);
|
// m_TargetRangeText->SetSize(HUDText::LARGE_SIZE);
|
||||||
m_TargetRangeText->SetSize(HUDText::MEDIUM_SIZE);
|
m_TargetRangeText->SetSize(HUDText::MEDIUM_SIZE);
|
||||||
m_TargetAlignment = 0;
|
m_TargetAlignment = 0;
|
||||||
@@ -1269,9 +1269,9 @@ HUDTargetDamage::HUDTargetDamage() :
|
|||||||
m_TargetMechID = 0;
|
m_TargetMechID = 0;
|
||||||
|
|
||||||
m_Weapons.clear ();
|
m_Weapons.clear ();
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
VehicleInterface::GetInstance()->hudTargetDamageMode=false;
|
VehicleInterface::GetInstance()->hudTargetDamageMode=false;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
m_ArmorMode = VehicleInterface::GetInstance()->hudTargetDamageMode;
|
m_ArmorMode = VehicleInterface::GetInstance()->hudTargetDamageMode;
|
||||||
m_LastMechMode = false;
|
m_LastMechMode = false;
|
||||||
}
|
}
|
||||||
@@ -1315,7 +1315,7 @@ void HUDTargetDamage::Reset (void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//sanghoon
|
//상훈
|
||||||
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1764,7 +1764,7 @@ if(!hsh_initialized){
|
|||||||
|
|
||||||
if (m_TargetTonnage == -1)
|
if (m_TargetTonnage == -1)
|
||||||
{
|
{
|
||||||
//When target is not a mech..
|
//타켓이 메크가 아닐때..
|
||||||
Verify (!m_ArmorMode); // only mechs show armor mode
|
Verify (!m_ArmorMode); // only mechs show armor mode
|
||||||
if (m_TargetVehicle.GetCurrent()->IsDerivedFrom (MWObject::DefaultData))
|
if (m_TargetVehicle.GetCurrent()->IsDerivedFrom (MWObject::DefaultData))
|
||||||
{
|
{
|
||||||
@@ -1805,7 +1805,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//When target is a mech..
|
//타켓이 메크일때..
|
||||||
Verify (m_TargetVehicle.GetCurrent ()->IsDerivedFrom (Mech::DefaultData));
|
Verify (m_TargetVehicle.GetCurrent ()->IsDerivedFrom (Mech::DefaultData));
|
||||||
Mech *mech = Cast_Object(Mech *, m_TargetVehicle.GetCurrent());
|
Mech *mech = Cast_Object(Mech *, m_TargetVehicle.GetCurrent());
|
||||||
Check_Object (mech);
|
Check_Object (mech);
|
||||||
@@ -1826,7 +1826,7 @@ if(!hsh_initialized){
|
|||||||
|
|
||||||
if (m_ArmorMode)
|
if (m_ArmorMode)
|
||||||
{
|
{
|
||||||
//When target is a mech and in armor mode
|
//타켓이 메크이고 아머 모드일때
|
||||||
int x,y;
|
int x,y;
|
||||||
size = m_Textures[20]->Size ();
|
size = m_Textures[20]->Size ();
|
||||||
|
|
||||||
@@ -1897,7 +1897,7 @@ if(!hsh_initialized){
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//sanghoon
|
//상훈
|
||||||
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1910,7 +1910,7 @@ if(!hsh_initialized){
|
|||||||
fred = 0;
|
fred = 0;
|
||||||
|
|
||||||
for (i=0;i<11;i++)
|
for (i=0;i<11;i++)
|
||||||
{//What does the number 13 mean here?
|
{//13이라는 숫자가 의미하는 것은 무엇일까?
|
||||||
#if 0
|
#if 0
|
||||||
if (i != fred)
|
if (i != fred)
|
||||||
{
|
{
|
||||||
@@ -1983,7 +1983,7 @@ else
|
|||||||
|
|
||||||
if (m_TargetVehicle.GetCurrent ())
|
if (m_TargetVehicle.GetCurrent ())
|
||||||
{
|
{
|
||||||
//Draw 3D target or 2D target.
|
//3D target 또는 2D Target을 그린다.
|
||||||
if (!m_ArmorMode)
|
if (!m_ArmorMode)
|
||||||
{
|
{
|
||||||
if(g_f3dtarget)
|
if(g_f3dtarget)
|
||||||
@@ -2006,19 +2006,19 @@ else
|
|||||||
int mechindex=GetMechIndex(model->mechID);
|
int mechindex=GetMechIndex(model->mechID);
|
||||||
if(mechindex>=0)
|
if(mechindex>=0)
|
||||||
{
|
{
|
||||||
//Draw only supported mechs.
|
//지원되는 mech만 그린다.
|
||||||
// MSL 5.02 Target MFD Image
|
// MSL 5.02 Target MFD Image
|
||||||
int x=(mechindex%8)*128;
|
int x=(mechindex%8)*128;
|
||||||
int y=(mechindex/8)*128;
|
int y=(mechindex/8)*128;
|
||||||
// int x=(mechindex%4)*128;
|
// int x=(mechindex%4)*128;
|
||||||
// int y=(mechindex/4)*128;
|
// int y=(mechindex/4)*128;
|
||||||
|
|
||||||
//Draw target in 2D.
|
//Target을 2D로 그린다.
|
||||||
mfd_device.pD3DDevice->SetTexture(0,mfd_device.pDDSMechTexture);
|
mfd_device.pD3DDevice->SetTexture(0,mfd_device.pDDSMechTexture);
|
||||||
mfd_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
|
mfd_device.pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
|
||||||
mfd_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTFG_LINEAR);
|
mfd_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTFG_LINEAR);
|
||||||
mfd_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTFG_LINEAR);
|
mfd_device.pD3DDevice->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTFG_LINEAR);
|
||||||
//Need to write routine to calculate coordinates per mech type...
|
//메크의 종류별로 좌표를 계산하는.. 루틴을 작성하여 집어 넣을것...
|
||||||
// MSL 5.02 Target MFD Image
|
// MSL 5.02 Target MFD Image
|
||||||
mfd_device.tw=1024,mfd_device.th=1024;
|
mfd_device.tw=1024,mfd_device.th=1024;
|
||||||
// MSL 5.02 Target MFD Image Resize
|
// MSL 5.02 Target MFD Image Resize
|
||||||
@@ -2060,7 +2060,7 @@ else
|
|||||||
radar_device.pDDSTarget->Blt(&rc,NULL,NULL,DDBLT_COLORFILL ,&fx);
|
radar_device.pDDSTarget->Blt(&rc,NULL,NULL,DDBLT_COLORFILL ,&fx);
|
||||||
|
|
||||||
for (int i=0;i<11;i++)
|
for (int i=0;i<11;i++)
|
||||||
{//What does the number 13 mean here?
|
{//13이라는 숫자가 의미하는 것은 무엇일까?
|
||||||
int dv=m_DamageValues[i];
|
int dv=m_DamageValues[i];
|
||||||
DWORD color=0xFF000000;
|
DWORD color=0xFF000000;
|
||||||
if(0<=dv && dv<=5)
|
if(0<=dv && dv<=5)
|
||||||
@@ -2103,7 +2103,7 @@ else
|
|||||||
if (m_ShowData)
|
if (m_ShowData)
|
||||||
{
|
{
|
||||||
|
|
||||||
//Routine to display weapon status of target in lower-left..
|
//좌측 하단의 target의 무기의 상태를 표시하는 루틴..
|
||||||
if (!m_ArmorMode)
|
if (!m_ArmorMode)
|
||||||
{
|
{
|
||||||
stlport::vector<WeaponData>::iterator iter;
|
stlport::vector<WeaponData>::iterator iter;
|
||||||
@@ -2134,7 +2134,7 @@ else
|
|||||||
|
|
||||||
if (m_TargetTonnage == -1)
|
if (m_TargetTonnage == -1)
|
||||||
{
|
{
|
||||||
//When target is not a mech..
|
//타켓이 메크가 아닐때..
|
||||||
Verify (!m_ArmorMode); // only mechs show armor mode
|
Verify (!m_ArmorMode); // only mechs show armor mode
|
||||||
if (m_TargetVehicle.GetCurrent()->IsDerivedFrom (MWObject::DefaultData))
|
if (m_TargetVehicle.GetCurrent()->IsDerivedFrom (MWObject::DefaultData))
|
||||||
{
|
{
|
||||||
@@ -2145,7 +2145,7 @@ else
|
|||||||
m_ArmorValues[0] = (veh->m_HitPoints / veh->m_MaxHitPoints);
|
m_ArmorValues[0] = (veh->m_HitPoints / veh->m_MaxHitPoints);
|
||||||
if (m_ArmorValues[0] != -1)
|
if (m_ArmorValues[0] != -1)
|
||||||
{
|
{
|
||||||
//Draw damage bar graph. Height and color are expressed simultaneously.
|
//데미지 막대 그래프를 그린다. 높이와 색상 동시에 표현된다.
|
||||||
int level;
|
int level;
|
||||||
level = (int) ((m_ArmorValues[0]*(MAX_HUD_DAMAGE_LEVEL))+0.5f);
|
level = (int) ((m_ArmorValues[0]*(MAX_HUD_DAMAGE_LEVEL))+0.5f);
|
||||||
level = MAX_HUD_DAMAGE_LEVEL - level;
|
level = MAX_HUD_DAMAGE_LEVEL - level;
|
||||||
@@ -2160,7 +2160,7 @@ else
|
|||||||
}//When the target is not a mech.
|
}//When the target is not a mech.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//When target is a mech..
|
//타켓이 메크일때..
|
||||||
Verify (m_TargetVehicle.GetCurrent ()->IsDerivedFrom (Mech::DefaultData));
|
Verify (m_TargetVehicle.GetCurrent ()->IsDerivedFrom (Mech::DefaultData));
|
||||||
Mech *mech = Cast_Object(Mech *, m_TargetVehicle.GetCurrent());
|
Mech *mech = Cast_Object(Mech *, m_TargetVehicle.GetCurrent());
|
||||||
Check_Object (mech);
|
Check_Object (mech);
|
||||||
@@ -2178,7 +2178,7 @@ else
|
|||||||
|
|
||||||
if (m_ArmorMode)
|
if (m_ArmorMode)
|
||||||
{
|
{
|
||||||
//When target is a mech and in armor mode
|
//타켓이 메크이고 아머 모드일때
|
||||||
for (i=0;i<MAX_HUD_DAMAGE_ZONE;i++)
|
for (i=0;i<MAX_HUD_DAMAGE_ZONE;i++)
|
||||||
{
|
{
|
||||||
int tr=trans_array[i];
|
int tr=trans_array[i];
|
||||||
@@ -2208,12 +2208,12 @@ else
|
|||||||
// MSL 5.03 Target Damage Display
|
// MSL 5.03 Target Damage Display
|
||||||
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
||||||
|
|
||||||
//When target is a mech and NOT in armor mode..
|
//타켓이 메크이고 아머 모드가 아닐때..
|
||||||
if(mfd_device.pDDSTargetTexture==0)
|
if(mfd_device.pDDSTargetTexture==0)
|
||||||
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
mfd_device.LoadTargetTexture(texturename[m_TargetMechID]);
|
||||||
|
|
||||||
for (i=0;i<11;i++)
|
for (i=0;i<11;i++)
|
||||||
{//What does the number 13 mean here?
|
{//13이라는 숫자가 의미하는 것은 무엇일까?
|
||||||
int dv=m_DamageValues[i];
|
int dv=m_DamageValues[i];
|
||||||
DWORD color=0xFF000000;
|
DWORD color=0xFF000000;
|
||||||
if(0<=dv && dv<=5)color=SH_DamageColor[dv];
|
if(0<=dv && dv<=5)color=SH_DamageColor[dv];
|
||||||
|
|||||||
@@ -77,11 +77,11 @@ namespace MechWarrior4
|
|||||||
int m_TargetMechID;
|
int m_TargetMechID;
|
||||||
bool m_ShowData;
|
bool m_ShowData;
|
||||||
bool m_LastMechMode;
|
bool m_LastMechMode;
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
public:
|
public:
|
||||||
char hsh_targetname[64];
|
char hsh_targetname[64];
|
||||||
char hsh_targetrange[64];
|
char hsh_targetrange[64];
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HUDTargetDamage();
|
HUDTargetDamage();
|
||||||
@@ -97,10 +97,10 @@ namespace MechWarrior4
|
|||||||
void TargetName (char *name)
|
void TargetName (char *name)
|
||||||
{
|
{
|
||||||
m_TargetName->UpdateText (name);
|
m_TargetName->UpdateText (name);
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
strncpy(hsh_targetname,name,sizeof(hsh_targetname));
|
strncpy(hsh_targetname,name,sizeof(hsh_targetname));
|
||||||
hsh_targetname[sizeof(hsh_targetname)-1]=0;
|
hsh_targetname[sizeof(hsh_targetname)-1]=0;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
}
|
}
|
||||||
void TargetRange (Stuff::Scalar value)
|
void TargetRange (Stuff::Scalar value)
|
||||||
{
|
{
|
||||||
@@ -108,10 +108,10 @@ namespace MechWarrior4
|
|||||||
int temp = (int) value;
|
int temp = (int) value;
|
||||||
sprintf (text,"%dm",temp);
|
sprintf (text,"%dm",temp);
|
||||||
m_TargetRangeText->UpdateText (text);
|
m_TargetRangeText->UpdateText (text);
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
strncpy(hsh_targetrange,text,sizeof(hsh_targetrange));
|
strncpy(hsh_targetrange,text,sizeof(hsh_targetrange));
|
||||||
hsh_targetrange[sizeof(hsh_targetrange)-1]=0;
|
hsh_targetrange[sizeof(hsh_targetrange)-1]=0;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
}
|
}
|
||||||
void TargetTonnage (Stuff::Scalar value);
|
void TargetTonnage (Stuff::Scalar value);
|
||||||
void TargetAlignment (int value)
|
void TargetAlignment (int value)
|
||||||
|
|||||||
@@ -8,14 +8,14 @@
|
|||||||
#include "mwapplication.hpp"
|
#include "mwapplication.hpp"
|
||||||
// MSL 5.02 Nav Points
|
// MSL 5.02 Nav Points
|
||||||
#include "navpoint.hpp"
|
#include "navpoint.hpp"
|
||||||
//sanghoon begin
|
//상훈짱 begin
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddraw.h>
|
#include <ddraw.h>
|
||||||
#include <d3d.h>
|
#include <d3d.h>
|
||||||
|
|
||||||
#include <GameOS\render.hpp>
|
#include <GameOS\render.hpp>
|
||||||
extern char AssetsDirectory1[MAX_PATH];
|
extern char AssetsDirectory1[MAX_PATH];
|
||||||
//sanghoon end
|
//상훈짱 end
|
||||||
|
|
||||||
const Stuff::Time SHOT_TIME = 2.0;
|
const Stuff::Time SHOT_TIME = 2.0;
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ HUDMap::HUDMap():
|
|||||||
AddTexture ("hud\\map",0,28,28,228,228);
|
AddTexture ("hud\\map",0,28,28,228,228);
|
||||||
else{
|
else{
|
||||||
AddTexture (model->m_HudMap,0,0,0,255,255);
|
AddTexture (model->m_HudMap,0,0,0,255,255);
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
radar_device.MapDrawn=false;
|
radar_device.MapDrawn=false;
|
||||||
/*
|
/*
|
||||||
if(hsh_initialized){
|
if(hsh_initialized){
|
||||||
@@ -49,7 +49,7 @@ HUDMap::HUDMap():
|
|||||||
radar_device.MapDrawn=true;
|
radar_device.MapDrawn=true;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
}
|
}
|
||||||
|
|
||||||
Location (Point3D (301,399,0.9f));
|
Location (Point3D (301,399,0.9f));
|
||||||
@@ -154,7 +154,7 @@ void HUDMap::DrawImplementation(void)
|
|||||||
Point3D loc,size;
|
Point3D loc,size;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
//Draw the map.
|
//맵을 그린다.
|
||||||
Vehicle *vehicle = m_Vehicle.GetCurrent();
|
Vehicle *vehicle = m_Vehicle.GetCurrent();
|
||||||
|
|
||||||
loc = Location ();
|
loc = Location ();
|
||||||
@@ -163,7 +163,7 @@ void HUDMap::DrawImplementation(void)
|
|||||||
// loc.y -= (size.y/2.0f);
|
// loc.y -= (size.y/2.0f);
|
||||||
m_Textures[0]->Draw (loc,size,MakeColor (255,255,255,255),HUDTexture::NO_FLIP,true);
|
m_Textures[0]->Draw (loc,size,MakeColor (255,255,255,255),HUDTexture::NO_FLIP,true);
|
||||||
|
|
||||||
//Display Torso Sweep (pie-shaped field-of-view indicator).
|
//Torso Sweep(파이모양 시야각 표시도형)을 표시한다.
|
||||||
if (NULL == vehicle)
|
if (NULL == vehicle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ void HUDMap::DrawImplementation(void)
|
|||||||
|
|
||||||
|
|
||||||
//Draw Radar Blips
|
//Draw Radar Blips
|
||||||
//Display radar objects.
|
//레이다의 오브젝트들을 표시한다.
|
||||||
|
|
||||||
MWObject *current_object;
|
MWObject *current_object;
|
||||||
for(i=0;i<vehicle->GetSensor()->numberOfContacts;i++)
|
for(i=0;i<vehicle->GetSensor()->numberOfContacts;i++)
|
||||||
@@ -332,7 +332,7 @@ void HUDMap::DrawImplementation(void)
|
|||||||
color = MakeColor (255,255,255,250);
|
color = MakeColor (255,255,255,250);
|
||||||
m_Textures[id+20]->Draw (Point3D (object_display_pos.x,object_display_pos.y,0.9f),size,color,HUDTexture::NO_FLIP,true);
|
m_Textures[id+20]->Draw (Point3D (object_display_pos.x,object_display_pos.y,0.9f),size,color,HUDTexture::NO_FLIP,true);
|
||||||
}
|
}
|
||||||
//Operation boundary display polygon (orange-red)
|
//작전 범위(Boundary) 표시 다각형(주황빨강)
|
||||||
size = Size ();
|
size = Size ();
|
||||||
loc = Location ();
|
loc = Location ();
|
||||||
Mission *miss;
|
Mission *miss;
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ namespace MechWarrior4
|
|||||||
void DrawImplementation(void);
|
void DrawImplementation(void);
|
||||||
void ConvertMapCoords (float& x,float& y);
|
void ConvertMapCoords (float& x,float& y);
|
||||||
void ConvertMapCoords (Point3D& pt);
|
void ConvertMapCoords (Point3D& pt);
|
||||||
//sanghoon begin
|
//상훈 앞
|
||||||
bool hsh_fdraw;
|
bool hsh_fdraw;
|
||||||
//sanghoon end
|
//상훈 뒤
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HUDMap();
|
HUDMap();
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ get_score:
|
|||||||
HUDScore::HUDScore()
|
HUDScore::HUDScore()
|
||||||
{
|
{
|
||||||
m_AnimTime = 0;
|
m_AnimTime = 0;
|
||||||
//sanghoon
|
//상훈
|
||||||
Location (Point3D (0,0,0.9f));
|
Location (Point3D (0,0,0.9f));
|
||||||
// Location (Point3D (200,100,0.9f));
|
// Location (Point3D (200,100,0.9f));
|
||||||
Size (Point3D (310,300,0.9f));
|
Size (Point3D (310,300,0.9f));
|
||||||
@@ -128,7 +128,7 @@ HUDScore::HUDScore()
|
|||||||
|
|
||||||
m_PingHeader = new HUDText ();
|
m_PingHeader = new HUDText ();
|
||||||
m_PingHeader ->SetAsAlt();
|
m_PingHeader ->SetAsAlt();
|
||||||
//sanghoon
|
//상훈
|
||||||
/*
|
/*
|
||||||
m_PingHeader->Justification (HUDText::LEFT_ALIGN);
|
m_PingHeader->Justification (HUDText::LEFT_ALIGN);
|
||||||
m_PingHeader->UpdateText (app->GetLocString (IDS_PINGHEADER));
|
m_PingHeader->UpdateText (app->GetLocString (IDS_PINGHEADER));
|
||||||
@@ -444,7 +444,7 @@ void HUDScore::DrawImplementation(void)
|
|||||||
m_TimeLeftText->UpdateText (text);
|
m_TimeLeftText->UpdateText (text);
|
||||||
}
|
}
|
||||||
|
|
||||||
//sanghoon
|
//상훈
|
||||||
count+=1;
|
count+=1;
|
||||||
loc = Location ();
|
loc = Location ();
|
||||||
loc.y=600-count*LINE_HEIGHT;
|
loc.y=600-count*LINE_HEIGHT;
|
||||||
@@ -455,7 +455,7 @@ void HUDScore::DrawImplementation(void)
|
|||||||
|
|
||||||
DWORD bcolor = BrighterColor (Color ());
|
DWORD bcolor = BrighterColor (Color ());
|
||||||
|
|
||||||
//sanghoon
|
//상훈..
|
||||||
{
|
{
|
||||||
Stuff::Point3D loc2(800-size.x,600-LINE_HEIGHT-1,0.9f);
|
Stuff::Point3D loc2(800-size.x,600-LINE_HEIGHT-1,0.9f);
|
||||||
LDrawRect (loc2,0,0,size.x,LINE_HEIGHT,MakeColor (0,150,0,128));
|
LDrawRect (loc2,0,0,size.x,LINE_HEIGHT,MakeColor (0,150,0,128));
|
||||||
@@ -481,7 +481,7 @@ void HUDScore::DrawImplementation(void)
|
|||||||
m_PlayerTitle->Draw (Point3D (loc.x+10,yvalue,0.9f));
|
m_PlayerTitle->Draw (Point3D (loc.x+10,yvalue,0.9f));
|
||||||
|
|
||||||
DWORD h;
|
DWORD h;
|
||||||
//sanghoon
|
//상훈
|
||||||
//m_PingHeader->DrawSize (pingwidth,h);
|
//m_PingHeader->DrawSize (pingwidth,h);
|
||||||
//pingx = loc.x + size.x - pingwidth - 10;
|
//pingx = loc.x + size.x - pingwidth - 10;
|
||||||
pingx = loc.x + size.x ;
|
pingx = loc.x + size.x ;
|
||||||
|
|||||||
@@ -367,10 +367,10 @@ void HUDReticle::DrawImplementation(void)
|
|||||||
m_Textures[36]->Draw (loc,size,m_LeftCenterColor);
|
m_Textures[36]->Draw (loc,size,m_LeftCenterColor);
|
||||||
m_Textures[37]->Draw (loc,size,m_RightCenterColor);
|
m_Textures[37]->Draw (loc,size,m_RightCenterColor);
|
||||||
|
|
||||||
for (i=0;i<3;i++)//sanghoon: originally 6
|
for (i=0;i<3;i++)//상훈 원래 6이었음
|
||||||
{
|
{
|
||||||
size = m_Textures[20+i]->Size ();
|
size = m_Textures[20+i]->Size ();
|
||||||
//CanHit is set in Hudweapon...
|
//CanHit는 Hudweapon에서 set한다...
|
||||||
if (m_Weapons->CanHit (i))
|
if (m_Weapons->CanHit (i))
|
||||||
color = MakeColor (0,255,0,255);
|
color = MakeColor (0,255,0,255);
|
||||||
else {
|
else {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user