Author Topic: Scripting  (Read 5655 times)

0 Members and 1 Guest are viewing this topic.

Offline WMCoolmon

  • Purveyor of space crack
  • 213
We don't have an official thread so I figured I'd start one.

The basics:
Function/class list

Hooks
All hooks have a +Override: attribute after them. If it's coded in for that particular hook, it controls whether original behavior is added to or overriden. "yes" "no", and various other equivelants in other languages are acceptable values.

Also, there are three types of hooks...

File - Use [[*.lua]]. This will run the contents of a file for the hook. (Note: the file is loaded and parsed when the hook is, so it's not really any different from using a normal hook.
Normal - Use [] with scripting inside the []. This will run the scripting.
Return - Here, the scripting must evaluate to a number and is constrained to a single line. Like, "ship.HitpointsLeft/ship.HitpointsMax". Generally this value will be used in some way. You can return values with a normal code block by using the "return" Lua command, if you want more than one line to work with.

Code: [Select]
#Global Hooks
$Global: ;;Executes every single time a frame is displayed
$Splash: ;;Executes once, when the splash screen is displayed (Override disables default splash). Override disables default splash.
$GameInit: ;;Executes after everything has been loaded, but the splash screen is still displayed. An ideal spot to put mn.loadMission(). Override does nothing.
$Simulation: ;;Executes after physics and such has been calculated. Should also be run before the player enters the mission.
$HUD: ;;Executes every frame that the HUD is displayed. +Override disables Game HUD
#End

#State Hooks
$State: ;;Can be any state. Look up GS_state_text in gamesequence.cpp for the full list. +Override disables normal FS2 state.
#End

gamesequence.cpp (Where you can find the list of states for state hooks)

SEXP
There's also a script-eval-num in CVS. This will take Normal and Return hook types. (You must use [] if the scripting doesn't return a number).

New stuff tonight

I've added some new weapons functions tonight, and it may not be clear on how they're used, because I haven't been able to get arrays working properly. So I'm using sub-objects for now. :doubt:

Anyway, something like this:

Code: [Select]
ship.PrimaryBanks[1].AmmoLeft
Should get you the number of rounds left for the first primary bank in a ship. Sub in SecondaryBanks for secondary weapons. It's totally untested ATM, but I figured that I should mention it before I forgot. ;)

EDIT: More info. It'd be nice if someone could add this stuff to the wiki...for some reason, I haven't been writing online very well.
« Last Edit: January 31, 2006, 01:33:44 am by WMCoolmon »
-C

 

Offline Vasudan Admiral

  • Member
  • 211
    • Twisted Infinities
Well, it looks awesome and incredibly powerful, so big kudos for that, :) but I'm still rather confused about what it actually does.
I've had absolutely no experience in scripting, so forgive me if these are silly questions: ;)
  • 1) Can it be used as an extension of the SEXP system? Ie, a SEXP can trigger a certain script, and in turn a script can fire a SEXP?
  • 2) The hooks and game states suggest you can create whole new screens in the game for various purposes, such as a mission select screen, a weapon effects viewer (if we could combine that with a weapons table editor that would be awesome!) or if someone wanted to, money stuff in a Freelancer style mod. Is that right?
  • 3) Can we use it in conjunction with the submodel animation stuff? Like a scripted sequence of model parts animations where each part can do more than the one action. (In conjunction with the random function, you could conceivably create some very organic looking bits on ships.)
  • 4) Can we affect things like persistant variables with scripts to make more complex mission interactions?
  • 5) Can we create and modify new items on the HUD?
  • 6) Can we/how deeply can we affect the games physics engine? Ie, could we use a script to fake gravity (if used in conjunction with Goob's main gravity feature, it could be pretty interesting ;) ), slow down/speed up time compression and generally cause chaos?
  • 7) What else can it do?
Get the 2014 Media VPs and report any bugs you find in them to the FSU Mantis so that we may squish them. || Blender to POF model conversion guide
Twisted Infinities

 

Offline WMCoolmon

  • Purveyor of space crack
  • 213
1) Yeah, sort of. What you'd do is you'd make a function in scripting, and then call it like:

script-eval-num "[function()]"

2) Yeah. You'd have to use campaign-persistent variables to save the $$ tho.

3) Not yet, I don't understand how the submodel animation code works...I tried adding it for an afterburner animation but didn't manage to get it to do anything.

4) You can do it via SEXPs with script-eval-num, at least for number values. I haven't implemented anything directly to let you set campaign variables yet, tho.

5) You should be able to add new things to the HUD with the HUD hook, or remove everything and start from scratch by specifying "+Override: YES" for the hud hook.

6) Hmm...you might be able to fake gravity with what's in now. Not very accurately, but you should be able to run through all the ships in the mission and set their position/velocity.

7) It can almost do render-to-texture for ships in D3D, it's just the texture replacement stuff that isn't working. You can also warp the same ship in as many times as you like. Grab information about previous missions from the campaign file. A lot of it needs to be tested before it can be verified 100%, but most of the functions are not too exotic.
-C

 

Offline Vasudan Admiral

  • Member
  • 211
    • Twisted Infinities
Awesome stuff. :)

1) Kewl. Are there plans to let it go the other way as well? Script > SEXP?

2) Does that mean the weapons effects viewer should be possible to script in? Ie, pretty much like your ships lab, but with weaponry. I've been hoping to eventually make something like that for ages, but I've just had the slight hinderance of not yet knowing how to code in C#/C++. ;)

3) Ok, fair enough. Might be something to keep in mind for future though, since script controlled animation would be incredibly useful for a huge number of things. :D

5) That's pretty awesome. So can we define things like graphic files to display and such?
Get the 2014 Media VPs and report any bugs you find in them to the FSU Mantis so that we may squish them. || Blender to POF model conversion guide
Twisted Infinities

 

Offline WMCoolmon

  • Purveyor of space crack
  • 213
1 & 2) Those sound useful enough to warrant a look, my coding comp is on the blink again though so no timeframe on that.

3) What I'd really like is the search function to find where Bobb posted how the animation system works. Unless it's in the internal (which has far fewer topics) it could take ages.

5) Yes, you just need to use gr.drawImage(name, x position, y position)
-C

 

Offline Vasudan Admiral

  • Member
  • 211
    • Twisted Infinities
1 & 2) That'd be awesome, and good luck with your machine too. :\

3) Well.... I found this, this and this from an old post of Nuke's, but I get the feeling none of them are quite what you're after - they show how to use it rather than how it works.

5) Ok, and final related question from me for now: Can/will we be able to eventually create scripted stuff in the 3d engine while in-game? Stuff not just on the hud, but in 3d space - such as creating flat/shaped planes on which to draw special effects, 'virtual' lines that appear like the jump nodes as paths for the player to follow and stuff like that?
Get the 2014 Media VPs and report any bugs you find in them to the FSU Mantis so that we may squish them. || Blender to POF model conversion guide
Twisted Infinities

 

Offline Nuke

  • Ka-Boom!
  • 212
  • Mutants Worship Me
3)  i think he wants to see code on the internal, not the modder's side of things. the lack of a search feature is really really annoying. they should at least give it to coders.

5) will be cool. i plan to eventually do proper carrier landings complete with a proper ils gauge. not sure about scripted environments yet give them time. script functionality is progressing at an alarming rate. eventually wel get to the point where we ask for features and the coders will tell us to use the script :D
I can no longer sit back and allow communist infiltration, communist indoctrination, communist subversion, and the international communist conspiracy to sap and impurify all of our precious bodily fluids.

Nuke's Scripting SVN

 

Offline Bobboau

  • Just a MODern kinda guy
    Just MODerately cool
    And MODest too
  • 213
that's the idea
Bobboau, bringing you products that work... in theory
learn to use PCS
creator of the ProXimus Procedural Texture and Effect Generator
My latest build of PCS2, get it while it's hot!
PCS 2.0.3


DEUTERONOMY 22:11
Thou shalt not wear a garment of diverse sorts, [as] of woollen and linen together

 

Offline WMCoolmon

  • Purveyor of space crack
  • 213
My last commit to CVS removed all the "resize" variables from the 2D functions.
-C

  

Offline WMCoolmon

  • Purveyor of space crack
  • 213
:bump:

Right before "$Impact Explosion:", I've added two new fields

I've also added "Weapon" and "Team" handles with some member variables/functions.

$Collide Ship:
Globals: "Self", weapon with class that the hook is defined in. "Ship", ship that the weapon collided with.
Override: Turns off all damage effects from weapon, as well as weapon being destroyed.

Executed whenever a weapon has hit a ship's hull.

$Collide Weapon:
Globals: "Self", weapon with class that the hook is defined in. "Weapon", other weapon.
Override: Turns off weapon killing types with bombs. If two weapons, weapon "A" (arbitrary) is preferred

This might be better as a global hook, but basically it's executed whenever two weapons collide. If you want to kill weapons like the code does here, set LifeLeft to 0.01 and DestroyedByWeapon to true.

Questions
Would the globals be better as "slf" "shp" "wpn", or should they be full names?



http://fs2source.warpcore.org/temp/wmc/C14022006.zip


Two words..."Freespace pong"
« Last Edit: February 15, 2006, 01:39:24 am by WMCoolmon »
-C

 

Offline FireCrack

  • 210
  • meh...
Hmm.. we could kind of use a function for applying damage...

Another function for spawning stuff would be cool too...
actualy, mabye not.
"When ink and pen in hands of men Inscribe your form, bipedal P They draw an altar on which God has slaughtered all stability, no eyes could ever soak in all the places you anoint, and yet to see you all at once we only need the point. Flirting with infinity, your geometric progeny that fit inside you oh so tight with triangles that feel so right."
3.141592653589793238462643383279502884197169399375105820974944 59230781640628620899862803482534211706...
"Your ever-constant homily says flaw is discipline, the patron saint of imperfection frees us from our sin. And if our transcendental lift shall find a final floor, then Man will know the death of God where wonder was before."

 

Offline Trivial Psychic

  • 212
  • Snoop Junkie
$Collide Weapon:
Globals: "Self", weapon with class that the hook is defined in. "Weapon", other weapon.
Override: Turns off weapon killing types with bombs. If two weapons, weapon "A" (arbitrary) is preferred

This might be better as a global hook, but basically it's executed whenever two weapons collide. If you want to kill weapons like the code does here, set LifeLeft to 0.01 and DestroyedByWeapon to true.
Would this allow for interceptable primaries, such as the B5 defence grid?
The Trivial Psychic Strikes Again!

 

Offline FireCrack

  • 210
  • meh...
It should, only problem will be getting the AI to target primary laserbolts....
actualy, mabye not.
"When ink and pen in hands of men Inscribe your form, bipedal P They draw an altar on which God has slaughtered all stability, no eyes could ever soak in all the places you anoint, and yet to see you all at once we only need the point. Flirting with infinity, your geometric progeny that fit inside you oh so tight with triangles that feel so right."
3.141592653589793238462643383279502884197169399375105820974944 59230781640628620899862803482534211706...
"Your ever-constant homily says flaw is discipline, the patron saint of imperfection frees us from our sin. And if our transcendental lift shall find a final floor, then Man will know the death of God where wonder was before."

 

Offline WMCoolmon

  • Purveyor of space crack
  • 213
Yup.

What do you mean by "applying damage" and "spawning stuff"? I can probably write createShip and createWeapon functions easily enough. For applying damage, you should be able to subtract damage from HitpointsLeft. Apparently I never coded the damage var in weapons.tbl, is that all you'd need?
-C

 

Offline FireCrack

  • 210
  • meh...
Well, it is possible to subtract damage from what's left, but doesnt that ten override a bunch of things, like the ship being jostled, the impat explosion, the flashing damage% in the target box, even the fancy new armour system.
Ofcourse, i realise that scripting is still in it's early stages.

By spawning stuff, i meant a generic "creat object" function would be optimal, but prehaps weapons have funky initilsation doo-dads that reqire special stuff. Either way.

Just me feeling a bit nitpicky when fiddling with the luascript stuff...
actualy, mabye not.
"When ink and pen in hands of men Inscribe your form, bipedal P They draw an altar on which God has slaughtered all stability, no eyes could ever soak in all the places you anoint, and yet to see you all at once we only need the point. Flirting with infinity, your geometric progeny that fit inside you oh so tight with triangles that feel so right."
3.141592653589793238462643383279502884197169399375105820974944 59230781640628620899862803482534211706...
"Your ever-constant homily says flaw is discipline, the patron saint of imperfection frees us from our sin. And if our transcendental lift shall find a final floor, then Man will know the death of God where wonder was before."

 

Offline Goober5000

  • HLP Loremaster
  • Moderator
  • 214
    • Goober5000 Productions
There's already create-ship and create-weapon sexps...

 

Offline WMCoolmon

  • Purveyor of space crack
  • 213
:bump: I've made some updates to the drawImage functions, and the Afterburner variables. drawImage functions now take x2, y2 instead of width, height; the afterburner variables have been changed/added to AfterburnerFuelLeft and AfterburnerFuelMax for 'ship' and 'shipclass' handles.
-C

 

Offline At

  • 26
  • Eklektikon
Hope this is a good place to ask. <.< >.>

I try to do this
Code: [Select]
DasShip = mn.getShipByIndex( Index )

-- checky stuff here

X, Y = DasShip.Position:getScreenCoords()

if X then
DrawTarget( X, Y )
end
Code: [Select]
function DrawTarget( X, Y )
gr.drawString( X, 5, 20 )
end
and FS dies.  Seems to die when ever I try to do something with X (or Y).  But it passes the "if X then" part. :x

If I replace the function's contents with gr.drawString( "p", 5, 20 ), it works fine.  And "p"s on my screen a million times because it's called a million times.

Here's what the whole thing looks like :
Code: [Select]
-- TestHud.lua
-- Test things here.

XMax = gr.getScreenWidth()
YMax = gr.getScreenHeight()
Index = 1

-- We do this so we don't have to call the function billions of times.
-- A variable is cheaper than a function call, performance wise.
NumShips = mn.getNumShips()

gr.setColor( 0, 255, 0, 96 )
gr.drawString( NumShips, 5, 5 )

-- Reticle
gr.drawLine( XMax / 2, YMax / 2 - 5, XMax / 2, YMax / 2 + 5 )
gr.drawLine( XMax / 2 - 5, YMax / 2, XMax / 2 + 5, YMax / 2 )



while Index < NumShips do
DasShip = mn.getShipByIndex( Index )

-- Is this ship alive? --
if DasShip then

if DasShip.HitpointsLeft > 0 then
-- Returning multiple values! :O
X, Y = DasShip.Position:getScreenCoords()


if X then
DrawTarget( X, Y )
end

end

end

Index = Index + 1
end
Code: [Select]
-- TestInit.lua
-- Initialize things for testing here.

-- Set these in the hud code.
XMax = 0
YMax = 0

function DrawTarget( X, Y )
gr.drawString( X, 5, 20 ) -- Always dies if X is used... Is X a number/int/real/whatever?  Or something far more sinister...?
end
Does there exist a StarFox Mod?  Yes!  Check out Shadows of Lylat!

That thing…its just too persistant.

Sadhal thought to himself in between his pants. After a few seconds, his breathing came under control, and the pain subsided. Sadhal couldn’t help but feel a significant amount of fear and apprehension.

 

Offline At

  • 26
  • Eklektikon
Hope I'm not being annoying by doing this, but earlier, I asked about a piece of script I was trying to get working, and didn't even get an "I don't know."  So, I thought I'd ask again.

I was using the 20060326 Mac OSX build.  I havn't tried this on my PC yet.

(Edit)
I tried this with the 20060421 Win32 build, and got the same result.  Well, not completely, I get a nice little errorbox telling what variable it failed on.  But it still dies in the same place.  Just thought it'd be good to mention I tried it here.
« Last Edit: April 25, 2006, 05:48:01 am by At »
Does there exist a StarFox Mod?  Yes!  Check out Shadows of Lylat!

That thing…its just too persistant.

Sadhal thought to himself in between his pants. After a few seconds, his breathing came under control, and the pain subsided. Sadhal couldn’t help but feel a significant amount of fear and apprehension.

 

Offline WMCoolmon

  • Purveyor of space crack
  • 213
Erg, right. I did take a look at this but didn't see a good reason for it to just crash...but got derailed with something else bfore I could investigate it more fully.

Could you mantis this? :) Even just a link to the thread would be good...you don't need to repost the whole post, just a link would be fine. ;)
-C