Random hero scripting using TFU random script [solved]

In this forum you will find and post information regarding the modding of Star Wars Battlefront 2. DO NOT POST MOD IDEAS/REQUESTS.

Moderator: Moderators

Post Reply
YaNkFaN
Field Commander
Field Commander
Posts: 943
Joined: Sat Dec 13, 2008 8:17 am

Random hero scripting using TFU random script [solved]

Post by YaNkFaN »

So i tried my hand at adding random heros to my map. I tried to simplify Mav's TFU script to just a simple math.random script for both hero factions and it failed miserably can anyone help me fix this up because I'm completely clueless at why it's not working.

my hero script
Hidden/Spoiler:
[code]--
-- by Maveritchell
--
--



heroRep = 0
heroCis = 0



herocisand = math.random(1, 3)
function heroCis()

if herocisand == 1 then
heroCis = "cis_inf_officer"

elseif herocisand == 2 then
heroCis = "cis_hero_grievous"

elseif herocisand == 3 then
heroCis = "cis_hero_durge"


end
end

herorepand = math.random(1, 3)
function heroRep()

if herorep == 1 then
heroRep = "rep_hero_fisto"

elseif heroreprand == 2 then
heroRep = "rep_hero_drallig"

elseif heroreprand == 3 then
heroRep = "rep_hero_commander"


end
end




[/code]
my .lua
Hidden/Spoiler:
[code]--
-- Copyright (c) 2005 Pandemic Studios, LLC. All rights reserved.
--

-- load the gametype script
ScriptCB_DoFile("ObjectiveConquest")
ScriptCB_DoFile("setup_teams")
ScriptCB_DoFile("herorandom")
ScriptCB_DoFile("AIHeroSupport")


-- REP Attacking (attacker is always #1)
REP = 1;
CIS = 2;
-- These variables do not change
ATT = REP;
DEF = CIS;


function ScriptPostLoad()

WeatherMode = math.random(1,3)
weather()

--This defines the CPs. These need to happen first
cp1 = CommandPost:New{name = "cp1"}
cp2 = CommandPost:New{name = "cp2"}
cp3 = CommandPost:New{name = "cp3"}
cp4 = CommandPost:New{name = "cp4"}
cp5 = CommandPost:New{name = "cp5"}
cp6 = CommandPost:New{name = "cp6"}
cp7 = CommandPost:New{name = "cp7"}


--This sets up the actual objective. This needs to happen after cp's are defined
conquest = ObjectiveConquest:New{teamATT = ATT, teamDEF = DEF,
textATT = "game.modes.con",
textDEF = "game.modes.con2",
multiplayerRules = true}

--This adds the CPs to the objective. This needs to happen after the objective is set up
conquest:AddCommandPost(cp1)
conquest:AddCommandPost(cp2)
conquest:AddCommandPost(cp3)
conquest:AddCommandPost(cp4)
conquest:AddCommandPost(cp5)
conquest:AddCommandPost(cp6)
conquest:AddCommandPost(cp7)
conquest:Start()
SetUberMode(1);

if not ScriptCB_InMultiplayer() then
herosupport = AIHeroSupport:New{AIATTHeroHealth = 4000, AIDEFHeroHealth = 4000, gameMode = "Conquest",}
herosupport:SetHeroClass(CIS, heroCis)
herosupport:SetHeroClass(REP, heroRep)
herosupport:AddSpawnCP("cp1","cp1_spawn")
herosupport:AddSpawnCP("cp2","cp2_spawn")
herosupport:AddSpawnCP("cp3","cp3_spawn")
herosupport:AddSpawnCP("cp4","cp4_spawn")
herosupport:AddSpawnCP("cp5","cp5_spawn")
herosupport:AddSpawnCP("cp6","cp6_spawn")
herosupport:AddSpawnCP("cp7","cp7_spawn")
herosupport:Start()
else
end
end

function weather()
if WeatherMode == 1 then
ReadDataFile("dc:BHA\\sky.lvl", "sun")
elseif WeatherMode == 2 then
ReadDataFile("dc:BHA\\sky.lvl", "set")
elseif WeatherMode == 3 then
ReadDataFile("dc:BHA\\sky.lvl", "rain")
end
end

---------------------------------------------------------------------------
-- FUNCTION: ScriptInit
-- PURPOSE: This function is only run once
-- INPUT:
-- OUTPUT:
-- NOTES: The name, 'ScriptInit' is a chosen convention, and each
-- mission script must contain a version of this function, as
-- it is called from C to start the mission.
---------------------------------------------------------------------------
function ScriptInit()
ReadDataFile("dc:Load\\common.lvl")
ReadDataFile("ingame.lvl")



if ScriptCB_InMultiplayer() then
heroCis = "cis_hero_grievous"
heroRep = "rep_hero_fisto"
end

SetMaxFlyHeight(90)
SetMaxPlayerFlyHeight (90)


SetMemoryPoolSize("SoldierAnimation", 600)

SetMemoryPoolSize ("Combo",170) -- should be ~ 2x number of jedi classes
SetMemoryPoolSize ("Combo::State",1850) -- should be ~12x #Combo
SetMemoryPoolSize ("Combo::Transition",1850) -- should be a bit bigger than #Combo::State
SetMemoryPoolSize ("Combo::Condition",1850) -- should be a bit bigger than #Combo::State
SetMemoryPoolSize ("Combo::Attack",1750) -- should be ~8-12x #Combo
SetMemoryPoolSize ("Combo::DamageSample",14000) -- should be ~8-12x #Combo::Attack
SetMemoryPoolSize ("Combo::Deflect",1140) -- should be ~1x #combo -- should be ~1x #combo

ReadDataFile("sound\\geo.lvl;geo1cw")
ReadDataFile("sound\\bha.lvl;bhacw")
ReadDataFile("SIDE\\BHA\\kit.lvl",
"rep_hero_fisto")



ReadDataFile("SIDE\\BHA\\rep.lvl",
"rep_inf_ep3_rifleman",
"rep_inf_ep3_rocketeer",
"rep_inf_ep3_engineer",
"rep_inf_ep3_sniper",
"rep_inf_ep3_officer",
"rep_inf_ep3_jettrooper",
"rep_inf_ep3_marine",
"rep_inf_ep3_pilot",
"rep_fly_gunship",
"rep_hero_drallig",
"rep_hero_commander",
"rep_walk_atte")
ReadDataFile("SIDE\\BHA\\cis.lvl",
"cis_inf_rifleman",
"cis_inf_rocketeer",
"cis_inf_engineer",
"cis_inf_sniper",
"cis_inf_droideka",
"cis_inf_pilot",
"cis_inf_marine",
"cis_inf_officer",
"cis_fly_droidgunship",
"cis_walk_dwarfspider",
"cis_hero_droideka",
"cis_hero_durge",
"cis_hero_grievous",
"cis_walk_spider")


ReadDataFile("SIDE\\BHA\\tur.lvl",
"tur_bldg_chaingun")

SetupTeams{
rep = {
team = REP,
units = 55,
reinforcements = 350,
soldier = {"rep_inf_ep3_rifleman",28, 28},
assault = { "rep_inf_ep3_pilot",5, 5},
engineer = {"rep_inf_ep3_engineer",5, 5},
sniper = { "rep_inf_ep3_sniper",5, 5},
officer = { "rep_inf_ep3_rocketeer",5, 5},
special = {"rep_inf_ep3_marine",5, 5},
extra1 = {"rep_inf_ep3_officer",1, 1},

},
cis = {
team = CIS,
units = 60,
reinforcements = 350,
soldier = { "cis_inf_marine",33, 33},
assault = { "cis_inf_pilot",5, 5},
engineer = { "cis_inf_engineer",5, 5},
sniper = { "cis_inf_sniper",5, 5},
officer = {"cis_inf_rocketeer",5, 5},
special = { "cis_inf_rifleman",5, 5},
extra1 = {"cis_hero_droideka", 5, 5},
}
}


if ScriptCB_InMultiplayer() then
SetHeroClass(CIS, heroCis)
SetHeroClass(REP, heroRep)
else
end

-- Level Stats
-- ClearWalkers()
AddWalkerType(0, 4) -- special -> droidekas
AddWalkerType(1, 0) -- 1x2 (1 pair of legs)
AddWalkerType(2, 6) -- 2x2 (2 pairs of legs)
AddWalkerType(3, 2) -- 3x2 (3 pairs of legs)
local weaponCnt = 1024
SetMemoryPoolSize("Aimer", 75)
SetMemoryPoolSize("CommandWalker", 2)
SetMemoryPoolSize( "ParticleTransformer::ColorTrans", 1600)
SetMemoryPoolSize("ParticleTransformer::SizeTransf", 1100)
SetMemoryPoolSize("MountedTurret", 40)
SetMemoryPoolSize("AmmoCounter", weaponCnt)
SetMemoryPoolSize("BaseHint", 1024)

SetMemoryPoolSize("OrdnanceTowCable", 40)
SetMemoryPoolSize("EnergyBar", weaponCnt)
SetMemoryPoolSize("RedShadingState", 40)
SetMemoryPoolSize("EntityCloth", 32)
SetMemoryPoolSize ("ClothData",20)
SetMemoryPoolSize("EntityFlyer", 32)
SetMemoryPoolSize("EntityHover", 32)
SetMemoryPoolSize("EntityLight", 200)
SetMemoryPoolSize("EntitySoundStream", 4)
SetMemoryPoolSize("EntitySoundStatic", 32)
SetMemoryPoolSize("MountedTurret", 32)
SetMemoryPoolSize("Navigator", 128)
SetMemoryPoolSize("Obstacle", 1024)
SetMemoryPoolSize("PathNode", 1024)
SetMemoryPoolSize("SoundSpaceRegion", 64)
SetMemoryPoolSize("TreeGridStack", 1024)
SetMemoryPoolSize("UnitAgent", 128)
SetMemoryPoolSize("UnitController", 128)
SetMemoryPoolSize("Weapon", weaponCnt)

SetSpawnDelay(10.0, 0.25)
--ReadDataFile("dc:BHA\\BHA.lvl", "BHA_conquest")
ReadDataFile("dc:BHA\\BHA.lvl", "BHA_conquest")
SetDenseEnvironment("false")

-- Birdies
SetNumBirdTypes(1)
SetBirdType(0,1.0,"bird")

-- Fishies
SetNumFishTypes(1)
SetFishType(0,0.8,"fish")


-- Sound

SetSoundEffect("ScopeDisplayZoomIn", "binocularzoomin")
SetSoundEffect("ScopeDisplayZoomOut", "binocularzoomout")

voiceSlow = OpenAudioStream("sound\\global.lvl", "rep_unit_vo_slow")
AudioStreamAppendSegments("sound\\global.lvl", "cis_unit_vo_slow", voiceSlow)
AudioStreamAppendSegments("sound\\global.lvl", "global_vo_slow", voiceSlow)

voiceQuick = OpenAudioStream("sound\\global.lvl", "rep_unit_vo_quick")
AudioStreamAppendSegments("sound\\global.lvl", "cis_unit_vo_quick", voiceQuick)

OpenAudioStream("sound\\global.lvl", "cw_music")
-- OpenAudioStream("sound\\global.lvl", "global_vo_quick")
-- OpenAudioStream("sound\\global.lvl", "global_vo_slow")
OpenAudioStream("sound\\geo.lvl", "geo1")
OpenAudioStream("sound\\geo.lvl", "geo1")
OpenAudioStream("sound\\geo.lvl", "geo1_emt")

SetBleedingVoiceOver(REP, REP, "rep_off_com_report_us_overwhelmed", 1)
SetBleedingVoiceOver(REP, CIS, "rep_off_com_report_enemy_losing", 1)
SetBleedingVoiceOver(CIS, REP, "cis_off_com_report_enemy_losing", 1)
SetBleedingVoiceOver(CIS, CIS, "cis_off_com_report_us_overwhelmed", 1)

SetOutOfBoundsVoiceOver(2, "cisleaving")
SetOutOfBoundsVoiceOver(1, "repleaving")

SetAmbientMusic(REP, 1.0, "rep_geo_amb_start", 0,1)
SetAmbientMusic(REP, 0.8, "rep_geo_amb_middle", 1,1)
SetAmbientMusic(REP, 0.2, "rep_geo_amb_end", 2,1)
SetAmbientMusic(CIS, 1.0, "cis_geo_amb_start", 0,1)
SetAmbientMusic(CIS, 0.8, "cis_geo_amb_middle", 1,1)
SetAmbientMusic(CIS, 0.2, "cis_geo_amb_end", 2,1)

SetVictoryMusic(REP, "rep_geo_amb_victory")
SetDefeatMusic (REP, "rep_geo_amb_defeat")
SetVictoryMusic(CIS, "cis_geo_amb_victory")
SetDefeatMusic (CIS, "cis_geo_amb_defeat")

SetSoundEffect("ScopeDisplayZoomIn", "binocularzoomin")
SetSoundEffect("ScopeDisplayZoomOut", "binocularzoomout")
--SetSoundEffect("BirdScatter", "birdsFlySeq1")
--SetSoundEffect("WeaponUnableSelect", "com_weap_inf_weaponchange_null")
--SetSoundEffect("WeaponModeUnableSelect", "com_weap_inf_modechange_null")
SetSoundEffect("SpawnDisplayUnitChange", "shell_select_unit")
SetSoundEffect("SpawnDisplayUnitAccept", "shell_menu_enter")
SetSoundEffect("SpawnDisplaySpawnPointChange", "shell_select_change")
SetSoundEffect("SpawnDisplaySpawnPointAccept", "shell_menu_enter")
SetSoundEffect("SpawnDisplayBack", "shell_menu_exit")


--OpeningSateliteShot
AddCameraShot(0.997105, -0.045995, -0.060478, -0.002790, -102.114746, 11.716051, 161.346924);
AddCameraShot(0.962279, -0.068268, -0.262698, -0.018637, -4.812125, 11.900499, 117.251816);
AddCameraShot(0.972676, -0.050413, 0.226325, 0.011730, -115.687424, 11.900499, 137.729477);


AddCameraShot(-0.481173, 0.024248, -0.875181, -0.044103, 14.767292, -30.602322, -144.506851);
AddCameraShot(0.999914, -0.012495, -0.004416, -0.000055, 1.143253, -33.602314, -76.884430);
AddCameraShot(0.839161, 0.012048, -0.543698, 0.007806, 19.152437, -49.802273, 24.337317);
AddCameraShot(0.467324, 0.006709, -0.883972, 0.012691, 11.825212, -49.802273, -7.000720);
AddCameraShot(0.861797, 0.001786, -0.507253, 0.001051, -11.986043, -59.702248, 23.263165);
AddCameraShot(0.628546, -0.042609, -0.774831, -0.052525, 20.429928, -48.302277, 9.771714);
AddCameraShot(0.765213, -0.051873, 0.640215, 0.043400, 57.692474, -48.302277, 16.540724);
AddCameraShot(0.264032, -0.015285, -0.962782, -0.055734, -16.681797, -42.902290, 129.553268);
AddCameraShot(-0.382320, 0.022132, -0.922222, -0.053386, 20.670977, -42.902290, 135.513001);


end
[/code]
and relavent errors in error log
Hidden/Spoiler:
[code]Message Severity: 3
.\Source\LuaHelper.cpp(312)
CallProc failed: bad argument #2 to `RetailSetHeroClass' (string expected, got function)
stack traceback:
[C]: in function `RetailSetHeroClass'
(none): in function `SetHeroClass'
(none): in function `SetHeroClass'
(none): in function `ScriptPostLoad'[/code]
Last edited by YaNkFaN on Sat Jun 06, 2009 7:27 am, edited 1 time in total.
User avatar
Maveritchell
Jedi Admin
Jedi Admin
Posts: 7366
Joined: Mon Aug 21, 2006 11:03 pm

Re: random hero scripting using TFU random script

Post by Maveritchell »

You have functions that aren't doing anything and you aren't calling them in your .lua. If all you want is random heroes, all you need to do is use the math.random() in your .lua itself.
User avatar
[RDH]Zerted
Gametoast Staff
Gametoast Staff
Posts: 2982
Joined: Sun Feb 26, 2006 7:36 am
Projects :: Bos Wars AI - a RTS game
Games I'm Playing :: SWBF2 and Bos Wars
xbox live or psn: No gamertag set
Location: USA
Contact:

Re: random hero scripting using TFU random script

Post by [RDH]Zerted »

A breakdown of how the error message comes to be:

* The game starts loading your map. It loads your lua script and starts processing it. The first lines in your script are the ScriptCB_DoFile lines. The game pauses loading your main lua script and goes to load those files.

* The game loads ObjectiveConquest and setup_teams.

* The game is now loading your hero script. I'm going to ignore everything related to heroCIS... It sets heroRep to 0 (heroRep = 0). herorepand is set to a random number between 1 and 3. Next, the game creates a new function stored in the heroRep variable. That variable no longer holds 0, but instead a function. In Lua, a function is just a variable and the name of a function is also the name of its variable. (Also, the first if statement in function heroRep() has a typo.)

* The game loads AIHeroSupport which contains its own function called SetHeroClass. This function when called, does stuff for AI hero support, then calls the game's SetHeroClass funciton.

* The game is done loading the ScriptCB_DoFile lines and goes back to your main lua script. It defines the variables REP, CIS, ATT, DEF, ScriptPostLoad, weather, and ScriptInit then is finished loading your main script.

* The game loads some other stuff it uses (we don't really know what exactly...)

* The game calls your ScriptInit function. It does ReadDataFile("ingame.lvl"). Inside ingame.lvl, the v1.3 patch copies the normal SetHeroClass function variable to a new variable named RetailSetHeroClass (RetailSetHeroClass = SetHeroClass). Then it sets SetHeroClass equal to a new function which tracks the unit class (argument #2) so the FakeConsole commands will work on that unit class. After the v1.3's function records the unit class, it 'fowards' the function call to the original SetHeroClass function which is now stored in RetailSetHeroClass. (Still following along? If not, then forget that paragraph)

* The game is done loading ingame.lvl and continues with your ScriptInit function. You are not in multiplayer so heroRep is not set to the string rep_herp_fisto. heroRep is still has the value of a function. The memory pools are setup and the sides are setup. Again, you are not in multiplayer so SetHeroClass(REP, heroRep) is not called. ScriptInit finishes loading.

* At this point the game does a few other things and the map is loaded and the map selection screen gets displayed.

* The game calls your ScriptPostLoad function. Your weather function is called and the Conquest objective is setup. Now you are not in multiplayer, so the game attempts to setup AIHeroSupport. The herosupport:SetHeroClass(REP, heroRep) line is run. Remember, right now REP (argument #1) is a variable containing 1 and heroRep (argument #2) is a variable containing the function from your hero script. The AIHeroSupport's SetHeroClass function is called which does some processing then calls what it thinks is the game's SetHeroClass function, but is really v1.3's SetHeroClass function. The v1.3's SetHeroClass function does some processing then calls the game's real function which has been moved to RetailSetHeroClass. Thus the current stack trace is ScriptPostLoad -> SetHeroClass (AIHeroSupport's version) -> SetHeroClass (v1.3's version) -> RetailSetHeroClass (SWBF2's original SetHeroClass function). And the related segment in the error message:
stack traceback
[C]: in function `RetailSetHeroClass'
(none): in function `SetHeroClass'
(none): in function `SetHeroClass'
(none): in function `ScriptPostLoad'
The first argument through all these functions calls has been REP and the second heroRep. RetailSetHeroClass expects argument #1 to be a team number and argument #2 to be a unit class. However, heroRep still holds a function, thus the error message:
bad argument #2 to 'RetailSetHeroClass' (string expected, got function)
Too much info? To fix it, just do what Maveritchell said and move the code (not the functions themselves, just their inside code) from your heroCis() and heroRep() functions to right before they are used in your ScriptPostLoad() function.
YaNkFaN
Field Commander
Field Commander
Posts: 943
Joined: Sat Dec 13, 2008 8:17 am

Re: Random hero scripting using TFU random script

Post by YaNkFaN »

thanks it works perfectly now and thanks zerted for the explanation really told me a lot about what was going on this can be locked
Post Reply