Command & Conquer: Red Alert script to display various data on screen (didn't test it for the Allies disc but it should work fine for it too)
--Xrange 3456
--Yrange 2592
-- 0x2A780 nb vehicles
-- 0x2A3BC nb enemy vehicles
-- 0x8023C nb enemy infantry ?
-- 0x2A578 Player
-- 0x2A1B4 Computer
-- 0x29DF0 Other
--Border of the screen with gui.drawText standard
local XMIN = 80
local XMAX = 722
local YMIN = -8
local YMAX = 470
local NBENT
local ADENT
local DATASIZE
local ENTDATA
local DISPLAY
local VTYPE
local RIFLE
local ROCKET
local DOG
local RANGER
local LIGHT
local MEDIUM
local TRUCK
local STRUCTURE
local X, Y
local ENT_NAME = { --Entity name (1 or 2 letters = infantry)
"","","","","","","","","","", --000
"","","","","","","","","","", --010
"","","","","","","","","","", --020
"","","","","","","","","","", --030
"","","","","","","","","","", --040
"","","light","heavy","medium","mammoth","SAM","ranger","chinook","truck", --050
"art.","R","G","Ro","F","longbow","hind","APC","dome","helipad", --060
"airfield","silo","constr","ore ref","civ","civ","civ","civ","civ","civ", --070
"civ","civ","civ","civ","civ","civ","civ","civ","civ","civ", --080
"civ","civ","","civ","civ","civ","civ","civ","civ","civ", --090
"civ","civ","civ","civ","civ","civ","civ","civ","civ","civ", --100
"civ","tech","tur","MCV","plant","plant+","hospital","barracks","civ","sand", --110
"chain","wall","barb","wood","factory","biolab","depot","","","", --120
"","","","","","","","","","", --130
"","","C","C","C","C","C","C","C","C", --140
"C","Ei","","","","","","","","", --150
"","","","","","","","","","", --160
"","","","","","","","","","", --170
"","","","","","","","","","", --180
"","","","","","","","","","", --190
"","","","","","","","","","", --200
"","","","","","","","","","", --210
"","","","","","","","","","", --220
"","","","","","","","","","", --230
"","","","","","","","","E","S", --240
"","","","","","","","C","","", --250
"","","","","","","","","","", --260
"","","","C","","","","","","", --270
"","","","","","","","","","", --280
"","","","","","","","","","", --290
"","mine","mine","","T","jammer","gap","pill","pill+","chrono", --300
"","","","","","","","","","", --310
"sub","destr","cruiser","transp","boat","","","","","", --320
"","","","","","tesla","mobile","flame","AA","kennel", --330
"tech","bomber","mig","yak","barb","M","Ge","T","","", --340
"naval","pen","","","plane","D","","","","", --350
"supply","","iron","tech","V2R","forward","layer","fake","fake","fake", --360
"fake","fake","","","","","","","","", --370
"","","","","","","","","","", --380
"","","","","bar","","","","","", --390
"","missile","","","","","","","","" --400
}
local X_AJUST = { --X size of the entity
0,0,0,0,0,0,0,0,0,0, --000
0,0,0,0,0,0,0,0,0,0, --010
0,0,0,0,0,0,0,0,0,0, --020
0,0,0,0,0,0,0,0,0,0, --030
0,0,0,0,0,0,0,0,0,0, --040
0,0,1,1,1,1,1,1,1,1, --050
1,1,1,1,1,1,1,0,2,2, --060
3,1,3,3,2,1,1,2,1,2, --070
1,1,1,1,1,1,1,1,1,1, --080
1,1,0,1,1,1,1,1,1,1, --090
1,1,1,1,1,1,1,1,1,1, --100
1,3,1,1,2,3,0,2,1,1, --110
1,1,1,1,3,0,3,0,0,0, --120
0,0,0,0,0,0,0,0,0,0, --130
0,0,1,1,1,1,1,1,1,1, --140
1,1,0,0,0,0,0,0,0,0, --150
0,0,0,0,0,0,0,0,0,0, --160
0,0,0,0,0,0,0,0,0,0, --170
0,0,0,0,0,0,0,0,0,0, --180
0,0,0,0,0,0,0,0,0,0, --190
0,0,0,0,0,0,0,0,0,0, --200
0,0,0,0,0,0,0,0,0,0, --210
0,0,0,0,0,0,0,0,0,0, --220
0,0,0,0,0,0,0,0,0,0, --230
0,0,0,0,0,0,0,0,1,1, --240
0,0,0,0,0,0,0,1,0,0, --250
0,0,0,0,0,0,0,0,0,0, --260
0,0,0,1,0,0,0,0,0,0, --270
0,0,0,0,0,0,0,0,0,0, --280
0,0,0,0,0,0,0,0,0,0, --290
0,1,1,0,1,1,1,1,1,2, --300
0,0,0,0,0,0,0,0,0,0, --310
1,1,1,2,1,0,0,0,0,0, --320
0,0,0,0,0,1,1,1,1,1, --330
3,0,1,1,1,1,1,1,0,0, --340
0,0,0,0,0,1,1,0,0,0, --350
1,0,2,3,1,2,1,0,0,0, --360
0,0,0,0,0,0,0,0,0,0, --370
0,0,0,0,0,0,0,0,0,0, --380
0,0,0,0,1,0,0,0,0,0, --390
0,2,0,0,0,0,0,0,0,0 --400
}
local Y_AJUST = { --Y size of the entity
0,0,0,0,0,0,0,0,0,0, --000
0,0,0,0,0,0,0,0,0,0, --010
0,0,0,0,0,0,0,0,0,0, --020
0,0,0,0,0,0,0,0,0,0, --030
0,0,0,0,0,0,0,0,0,0, --040
0,0,1,1,1,1,1,1,1,1, --050
1,1,1,1,1,1,1,0,3,3, --060
2,1,3,4,3,1,1,3,1,1, --070
1,1,1,1,1,1,1,1,1,1, --080
1,1,0,1,1,1,1,1,1,1, --090
1,1,1,1,1,1,1,1,1,1, --100
1,3,1,1,2,3,0,3,1,1, --110
1,1,1,1,3,0,3,0,0,0, --120
0,0,0,0,0,0,0,0,0,0, --130
0,0,1,1,1,1,1,1,1,1, --140
1,1,0,0,0,0,0,0,0,0, --150
0,0,0,0,0,0,0,0,0,0, --160
0,0,0,0,0,0,0,0,0,0, --170
0,0,0,0,0,0,0,0,0,0, --180
0,0,0,0,0,0,0,0,0,0, --190
0,0,0,0,0,0,0,0,0,0, --200
0,0,0,0,0,0,0,0,0,0, --210
0,0,0,0,0,0,0,0,0,0, --220
0,0,0,0,0,0,0,0,0,0, --230
0,0,0,0,0,0,0,0,1,1, --240
0,0,0,0,0,0,0,1,0,0, --250
0,0,0,0,0,0,0,0,0,0, --260
0,0,0,1,0,0,0,0,0,0, --270
0,0,0,0,0,0,0,0,0,0, --280
0,0,0,0,0,0,0,0,0,0, --290
0,1,1,0,1,1,1,1,1,2, --300
0,0,0,0,0,0,0,0,0,0, --310
1,1,1,2,1,0,0,0,0,0, --320
0,0,0,0,0,1,1,1,1,1, --330
3,0,1,1,1,1,1,1,0,0, --340
0,0,0,0,0,1,1,0,0,0, --350
1,0,2,3,1,2,1,0,0,0, --360
0,0,0,0,0,0,0,0,0,0, --370
0,0,0,0,0,0,0,0,0,0, --380
0,0,0,0,1,0,0,0,0,0, --390
0,2,0,0,0,0,0,0,0,0 --400
}
while true do
local X1 = memory.read_s16_le(0x1BBAAC)
local X2 = math.abs(memory.read_s16_le(0x1B3964))
local XF = X1+X2*256/24 --X coordinate at the top left of the screen
local Y1 = memory.read_s16_le(0x1BBAAE)
local Y2 = memory.read_s16_le(0x1BBAA8)
local YF = Y1+Y2*256/24 --Y coordinate at the top left of the screen
-- local XSIZE = memory.read_u8(0x16BAFC) --Total X size of the map
-- local YSIZE = memory.read_u8(0x16BB00) --Total Y size of the map
gui.drawText(1, 80, math.floor(XF), "white")
gui.drawText(1, 100, math.floor(YF), "white")
gui.drawText(1, 140, memory.read_u8(0x2A3BC), "white")
gui.drawText(1, 160, memory.read_u8(0x8023C), "white")
if XF>0 then
RIFLE = 0
ROCKET = 0
DOG = 0
RANGER = 0
LIGHT = 0
MEDIUM = 0
TRUCK = 0
STRUCTURE = 0
-----------------------------------------Vehicles-------------------------------------------
-- ENTDATA = 0x87578 --Where the data starts in the RAM
DATASIZE = 0x108 --Size of the data of one entity
NBENT = memory.read_u32_le(0x9776C) --Number of entites followed by their data addresses
if NBENT>0 and NBENT<251 and memory.read_u32_le(0x9776C + 0x4)>0x80000000 then
for i=1, NBENT do
ADENT = memory.read_u32_le(0x9776C + i*0x4) - 0x80000000
if memory.read_u32_le(ADENT + 0x14)>0x8009E000 and memory.read_u32_le(ADENT + 0x14)<0x800A5000 then
ENT_NUM = math.min(memory.read_u16_le(memory.read_u32_le(ADENT + 0x14) - 0x80000000 + 0x2), 410)
DISPLAY = memory.read_s16_le(ADENT+0x1E) -- HP
-- DISPLAY = string.format("%05X", ADENT) -- Address
-- DISPLAY = string.format("%08X", memory.read_u32_le(ADENT+0x7C)) -- Owner
-- DISPLAY = string.format("%08X", memory.read_u32_le(ADENT+0x14)) -- Address ID
-- DISPLAY = ENT_NAME[ENT_NUM] -- Name
X = memory.read_s16_le(ADENT) + 32*X_AJUST[ENT_NUM]
Y = memory.read_s16_le(ADENT+0x2) + 32*Y_AJUST[ENT_NUM]
VTYPE = memory.read_u32_le(ADENT+0x14)
if VTYPE==0x800A45D0 then
-- DISPLAY = memory.read_u8(ADENT+0x105) -- Ore cargo display
-- COLOR = "red"
gui.drawText(
XMIN + (X-XF)/3456*(XMAX-XMIN),
YMIN + (Y-YF)/2592*(YMAX-YMIN) + 15,
memory.read_u8(ADENT+0x105),
"red",
null,null,null,null,"center"
)
end
if memory.read_u32_le(ADENT+0x7C)==0x8002A1B4 then
if VTYPE==0x800A4564 then RANGER = RANGER + 1
elseif VTYPE==0x800A4420 then LIGHT = LIGHT + 1
elseif VTYPE==0x800A43B4 then MEDIUM = MEDIUM + 1
elseif VTYPE==0x800A45D0 then TRUCK = TRUCK + 1
end
end
if X>XF and X<(XF+3456) and Y>YF and Y<(YF+2592) then
gui.drawText(
XMIN + (X-XF)/3456*(XMAX-XMIN),
YMIN + (Y-YF)/2592*(YMAX-YMIN),
DISPLAY,
"white",
null,null,null,null,"center")
end
end
end
end
-----------------------------------------Infantry-------------------------------------------
-- ENTDATA = 0x2DA94
DATASIZE = 0xF0 --Size of the data of one entity
NBENT = memory.read_u32_le(0x3C518) --Number of entites followed by their data addresses
if NBENT>0 and NBENT<251 and memory.read_u32_le(0x3C518 + 0x4)>0x80000000 then
for i=1, NBENT do
ADENT = memory.read_u32_le(0x3C518 + i*0x4) - 0x80000000
if memory.read_u32_le(ADENT + 0x14)>0x8009E000 and memory.read_u32_le(ADENT + 0x14)<0x800A5000 then
ENT_NUM = math.min(memory.read_u16_le(memory.read_u32_le(ADENT + 0x14) - 0x80000000 + 0x2), 410)
DISPLAY = memory.read_s16_le(ADENT+0x1E) -- HP
-- DISPLAY = string.format("%05X", ADENT) -- Address
-- DISPLAY = string.format("%08X", memory.read_u32_le(ADENT+0x7C)) -- Owner
-- DISPLAY = ENT_NAME[ENT_NUM] -- Name
X = memory.read_s16_le(ADENT) + 32*X_AJUST[ENT_NUM]
Y = memory.read_s16_le(ADENT+0x2) + 32*Y_AJUST[ENT_NUM]
VTYPE = memory.read_u32_le(ADENT+0x14)
if memory.read_u32_le(ADENT+0x7C)==0x8002A1B4 then
if VTYPE==0x800A227C then RIFLE = RIFLE + 1
elseif VTYPE==0x800A235C then ROCKET = ROCKET + 1
elseif VTYPE==0x800A26DC then DOG = DOG + 1
end
end
if X>XF and X<(XF+3456) and Y>YF and Y<(YF+2592) then
gui.drawText(
XMIN + (X-XF)/3456*(XMAX-XMIN),
YMIN + (Y-YF)/2592*(YMAX-YMIN),
DISPLAY,
"white",
null,null,null,null,"center")
end
end
end
end
-----------------------------------------Aircrafts-------------------------------------------
-- ENTDATA = 0x14B7C
DATASIZE = 0xF8 --Size of the data of one entity
NBENT = memory.read_u32_le(0x1AC70) --Number of entites followed by their data addresses
if NBENT>0 and NBENT<101 and memory.read_u32_le(0x1AC70 + 0x4)>0x80000000 then
for i=1, NBENT do
ADENT = memory.read_u32_le(0x1AC70 + i*0x4) - 0x80000000
if memory.read_u32_le(ADENT + 0x14)>0x8009E000 and memory.read_u32_le(ADENT + 0x14)<0x800A5000 then
ENT_NUM = math.min(memory.read_u16_le(memory.read_u32_le(ADENT + 0x14) - 0x80000000 + 0x2), 410)
DISPLAY = memory.read_s16_le(ADENT+0x1E) -- HP
-- DISPLAY = string.format("%05X", ADENT)
-- DISPLAY = string.format("%08X", memory.read_u32_le(ADENT+0x14)) -- Address ID
-- DISPLAY = ENT_NAME[ENT_NUM] -- Name
X = memory.read_s16_le(ADENT) + 32*X_AJUST[ENT_NUM]
Y = memory.read_s16_le(ADENT+0x2) + 32*Y_AJUST[ENT_NUM] - memory.read_s16_le(ADENT+0x8)
if X>XF and X<(XF+3456) and Y>YF and Y<(YF+2592) then
gui.drawText(
XMIN + (X-XF)/3456*(XMAX-XMIN),
YMIN + (Y-YF)/2592*(YMAX-YMIN),
DISPLAY,
"white",
null,null,null,null,"center")
end
end
end
end
-----------------------------------------Buildings-------------------------------------------
-- ENTDATA = 0x1AE20 --0x1C74C
DATASIZE = 0xC4 --Size of the data of one entity
NBENT = memory.read_u32_le(0x286D8) --Number of entites followed by their data addresses
if NBENT>0 and NBENT<251 and memory.read_u32_le(0x286D8 + 0x4)>0x80000000 then
for i=1, NBENT do
ADENT = memory.read_u32_le(0x286D8 + i*0x4) - 0x80000000
if memory.read_u32_le(ADENT + 0x14)>0x8009E000 and memory.read_u32_le(ADENT + 0x14)<0x800A5000 then
ENT_NUM = math.min(memory.read_u16_le(memory.read_u32_le(ADENT + 0x14) - 0x80000000 + 0x2), 410)
DISPLAY = memory.read_s16_le(ADENT+0x1E) -- HP
-- DISPLAY = string.format("%05X", ADENT) -- Address
-- DISPLAY = string.format("%08X", memory.read_u32_le(ADENT+0x7C)) -- Owner
-- DISPLAY = string.format("%08X", memory.read_u32_le(ADENT+0x14)) -- Address ID
-- DISPLAY = ENT_NAME[ENT_NUM] -- Name
X = memory.read_s16_le(ADENT) + 40 + 128*X_AJUST[ENT_NUM]
Y = memory.read_s16_le(ADENT+0x2) + 128*Y_AJUST[ENT_NUM]
if memory.read_u32_le(ADENT+0x7C)==0x8002A1B4 then
STRUCTURE = STRUCTURE + 1
end
if X>XF and X<(XF+3456) and Y>YF and Y<(YF+2592) then
gui.drawText(
XMIN + (X-XF)/3456*(XMAX-XMIN),
YMIN + (Y-YF)/2592*(YMAX-YMIN),
DISPLAY,
"white",
null,null,null,null,"center")
end
end
end
end
-----------------------------------------Ore-------------------------------------------------
--Limiting the check to the current screen, i.e. 12x15 grid instead of 128x128
local iMIN = math.floor(YF/256)
local jMIN = math.floor(XF/256)
local ORE = 0
local COLOR = "white"
for i=iMIN, iMIN+11 do
for j=jMIN, jMIN+14 do
X = 128 + j*256
Y = 128 + i*256
-- if i==86 and j==102 then
-- gui.drawText(1, 160, string.format("%08X)0x40000 + j*16 + i*2048, "white")
-- end
-- if X>XF and X<(XF+3456) and Y>YF and Y<(YF+2592) then
local BASE = 0x40000 + j*16 + i*2048
--Is it an ore tile ?
if memory.read_u8(BASE + 0xE) == 0x28 or memory.read_u8(BASE + 0xE) == 0x29 then
local ORETYPE = memory.read_u8(BASE + 0xD) % 16
--Is it normal ore ?
if ORETYPE>=5 and ORETYPE<=8 then
ORE = math.floor(memory.read_u8(BASE + 0xD)/32)
if memory.read_u8(BASE + 0xE) == 0x29 then ORE = ORE + 8 end
COLOR = "red"
end
--Is it special ore ?
if ORETYPE>=9 and ORETYPE<=0xC then
ORE = math.floor(memory.read_u8(BASE + 0xD)/32)*4 + 3
if memory.read_u8(BASE + 0xE) == 0x29 then ORE = ORE + 16 end
COLOR = "blue"
end
gui.drawText(
XMIN + (X-XF)/3456*(XMAX-XMIN),
YMIN + (Y-YF)/2592*(YMAX-YMIN),
ORE,
COLOR)
end
end
-- end
end
gui.drawText(1, 200, "Rifle : " .. RIFLE, "white")
gui.drawText(1, 220, "Rocket : " .. ROCKET, "white")
gui.drawText(1, 240, "Dog : " .. DOG, "white")
gui.drawText(1, 260, "Ranger : " .. RANGER, "white")
gui.drawText(1, 280, "Light : " .. LIGHT, "white")
gui.drawText(1, 300, "Medium : " .. MEDIUM, "white")
gui.drawText(1, 320, "Truck : " .. TRUCK, "white")
gui.drawText(1, 340, "Structure : " .. STRUCTURE, "white")
end --if XF>0 then
emu.frameadvance()
end