Page 2 of 5

Re: New scripting ideas for KaM Remake

PostPosted: 18 Nov 2012, 15:25
by Krom
I will do tests to see how much of Remakes code could be accessed from script.

Scripting is an extremely powerful tool, it can be used to create a KaM Remake by itself! With proper rigging it can access anything within games code, including, but not limited to even calling OS actions. That is a great flexibility in one hand, but also danger in others, someone could forge a virus or just call a "ShellExec('format c: /y')". Of course we would not like that to be possible ))) Another danger is that exposing too much of internal handles, we get hostages of compatibility: once we publish fPlayer[0].Stats.UnitCountWithinRect we will need to carry it on through all the later versions to not break the missions that used it. So we need to carefully pick an abstraction layer to avoid exposing low-level functions that might change in future.

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 10:54
by Krom
Okay, so there are some problems:

Events operated with Triggers only, if something happened - see if we could process it and act. Scripts bring in states, that is "if something is in this state" do something. This means there's a difference between HouseBuilt event (fired when player builds a house) and HousesBuilt state (how many built houses player has). That is a good thing.

Another issue is with variables script would need to use. When you want to show a message 2seconds after house was built - you will need to add a variable into script. Whole construct will look like so:
  Code:
var i: integer; begin if HouseBuilt then i := GameTime + 20; if i = GameTime then ShowMsg; end.
Let's try to make a test script (skipping most of the conditions for simplicity) for a TowerDefence:
  Code:
var AttackPlaced: Boolean; begin if GameTime = 10 then ShowMsg(0); //Message 0 = 'Hello player' if GameTime = 50 then begin GiveUnits(AI, warriors, 40); OrderAttack(AI, takeAll, X, Y); //X,Y = coordinates of players Store AttackPlaced := True; end; if AttackPlaced and UnitCount(AI) = 0 then begin AttackPlaced := False; GiveWares(Player, Gold, 50); ShowMsg(1, 50); //Message 1 = 'Attack repelled, here's your reward - N gold', where N gets replaced with 50 end; end.

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 11:12
by The Dark Lord
Back in the days I've learned a little Pascal, so it seems a bit familiar. :P I think I'll be able to find my way, especially with these examples. :)

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 11:32
by Krom
@TDL: It would be good to get in touch and start testing/rigging it :)
Do you have ICQ or Skype or GTalk or something where I could explain it and send modified executables?

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 13:01
by pawel95
If you need testers, tell m HAHA
Good job up to here.

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 15:30
by The Dark Lord
@TDL: It would be good to get in touch and start testing/rigging it :)
Do you have ICQ or Skype or GTalk or something where I could explain it and send modified executables?
No I don't have any of these. I do have Teamspeak now though, maybe that's an option? Also, I might be the first one to use this, but certainly not the last one; in that aspect it might be profitable to write a general explanation about the most important features, rather than just explain it to me? :)

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 17:28
by Krom
@TDL: It is not final yet, I need someone to help me test it and give feedback (point at weak spots, unexpected behavior, etc), depending on which I will tweak and improve the whole thing. Also it would be great if that someone could help writing the doc/tutorial. I'm still newbie at scripting and I would certainly need some guidance from a Pro ;)

Re: New scripting ideas for KaM Remake

PostPosted: 21 Nov 2012, 19:02
by The Dark Lord
I have quite some experience with scripting in TPR, but this is new to me so don't call me a pro. :P But sure, if I have time I can help. ;)

Re: New scripting ideas for KaM Remake

PostPosted: 22 Nov 2012, 08:11
by Encaitar
Let's try to make a test script (skipping most of the conditions for simplicity) for a TowerDefence:
  Code:
var AttackPlaced: Boolean; begin if GameTime = 10 then ShowMsg(0); //Message 0 = 'Hello player' if GameTime = 50 then begin GiveUnits(AI, warriors, 40); OrderAttack(AI, takeAll, X, Y); //X,Y = coordinates of players Store AttackPlaced := True; end; if AttackPlaced and UnitCount(AI) = 0 then begin AttackPlaced := False; GiveWares(Player, Gold, 50); ShowMsg(1, 50); //Message 1 = 'Attack repelled, here's your reward - N gold', where N gets replaced with 50 end; end.
I read the script but I do not understand one thing. Line 2 states:
  Code:
if GameTime = 10 then ShowMsg(0);
Line 3 states:
  Code:
if GameTime = 50 then
This TowerDefence script, is it executed constantly? I mean, if this would be a function, only once the function would be fired, and only one if could apply. But if this script is checked constantly, than first after 10 seconds (or minutes?) the first if would apply and after 50 seconds the second if. I understand i do sound somewhat vague, but I do not know how to express myself clearer...

Re: New scripting ideas for KaM Remake

PostPosted: 22 Nov 2012, 09:14
by Krom
We have discussed with Lewin and decided to split all the functions into 3 big pools: Events, States and Actions.
- Event, when something has happened (e.g. House was built)
- State, describing the state of something (e.g. Houses.Count >= 1)
- Action, when we need to perform something (e.g. show a message)

The usage is as follows:
  Code:
if State.GameTime = 10 then Action.ShowMsg(0,1);
The script gets to run each tick to make sure no time gets skipped (e.g. if State.GameTime = UnitCount then ..).
Global variables declared in script are stored between runs.

@Encaitar: Write if there's anything unclear )

Re: New scripting ideas for KaM Remake

PostPosted: 23 Nov 2012, 05:05
by Krom
Concept keeps on changing. I made more experiments with Events and callable functions in PascalScript.

This is a proper working event handler, that gets called when a player gets defeated:
  Code:
function OnPlayerDefeat(aPlayer: Integer): string; //ignore return string, it seems PS only allows functions(?) begin if aPlayer = 2 then Action.ShowMsg(0,1); end;
Event handlers let process events separately, yet allowing to take full advantage of global variables and main loop (begin .. end.) if you need one :)

Experiments continue..

Re: New scripting ideas for KaM Remake

PostPosted: 23 Nov 2012, 13:39
by Encaitar
@Encaitar: Write if there's anything unclear )
Of course! Your answer was clear to me :D.

  Code:
function OnPlayerDefeat(aPlayer: Integer): string; //ignore return string, it seems PS only allows functions(?)
According to this turorial, you are right about Pascal Script only allowing functions: "Functions are supported but procedures are not". But a wiki page shows a example that do uses procedures though. Maybe you could just give it a try, and see if it works...

Re: New scripting ideas for KaM Remake

PostPosted: 23 Nov 2012, 13:51
by Krom
I have discovered this today as well :)
Now it's perfect - "procedure OnPlayerDefeat(aPlayer: Integer); begin .. end;"

Re: New scripting ideas for KaM Remake

PostPosted: 23 Nov 2012, 18:36
by Krom
Here's the code I wrote for Town Tutorial:
  Code:
//Global variables we can use in script var NextMsg: Integer; NextTime: Integer; //Event handler procedure OnHouseBuilt(aIndex: Integer; aHouseType: Integer); begin if aIndex = 0 then //Make sure we process only human player case aHouseType of 13: begin Actions.ShowMsg(0,4); NextMsg := 5; NextTime := States.GameTime + 100; end; 27: Actions.ShowMsg(0,6); 14: Actions.ShowMsg(0,7); 9: Actions.ShowMsg(0,8); 0: Actions.ShowMsg(0,9); 6: Actions.ShowMsg(0,10); 8: Actions.ShowMsg(0,11); 22: Actions.ShowMsg(0,12); 7: Actions.ShowMsg(0,13); 28: Actions.ShowMsg(0,14); 16: Actions.ShowMsg(0,15); 24: Actions.ShowMsg(0,16); 21: begin Actions.ShowMsg(0,17); NextMsg := 18; NextTime := States.GameTime + 100; end; 19: begin Actions.ShowMsg(0,19); NextMsg := 20; NextTime := States.GameTime + 100; end; 25: Actions.ShowMsg(0,21); 20: begin Actions.ShowMsg(0,22); NextMsg := 23; NextTime := States.GameTime + 100; end; end; end; //Event handler procedure OnPlayerDefeated(aIndex: Integer); begin if aIndex = 1 then Actions.ShowMsg(0, 24); if aIndex = 2 then Actions.ShowMsg(0, 25); end; //Main section that gets checked each tick begin if States.GameTime = 30 then Actions.ShowMsg(0,1); if States.GameTime = 160 then Actions.ShowMsg(0,2); if States.GameTime = 340 then Actions.ShowMsg(0,3); if States.GameTime = NextTime then Actions.ShowMsg(0,NextMsg); end.
It is almost twice more lines than previous events approach, but I guess thats the price for more flexibility ;)

Re: New scripting ideas for KaM Remake

PostPosted: 24 Nov 2012, 21:49
by The Dark Lord
And everything works fine? Could I start working on a script for TD? :)