This is good - it's similar to what i started, a lot of things here are basically states (jumping, dead, running), and a lot can be implemented in scripting itself (line of sight, proximity triggers, etc.. )
The game engine only differentiate between actors, vehicles, particles and pickups.
(map) objects are vehicles, and are therefore easier to work with (no need for duplicate code to sync and handle - all that works on vehicles works on objects too)
This is the current script as used, it shows what is done, but is not everything yet - some things like getting car seats still need internal js framework wrappers to work in a object-oriented way.
Code:
'use strict';
console.log(version());
var game_interface = NewGameInstance();
game_interface.OnCreatePlayer = function(Player) {
console.log('OnCreatePlayer');
console.log(Player.playername);
Player.spawn(true); // sets stuff
if (Player.IsLocal == 1) { // if local player, create a car to play with.
var somecar = new Vehicle('four', 53.5, 87.5, 2, 90); //
Player.EnterExitThisVehicle(somecar, false, true);
}
// Player.health = 1.0; // default test
Player.EchoMessage('~O~Top down city test! ' + '~T~Enjoy!', constants.fontSize.font_b);
}
game_interface.OnDestroyPlayer = function(Player, Reason) {
console.log('OnDestroyPlayer');
console.log(Player.playername);
if (Player.IsLocal == 1) {
console.log('game shutting down.');
} else {
console.log('Player disconnected: ' + constants.disconnectReason.toString(Reason));
}
}
game_interface.OnModeChange = function() {
console.log('engine mode has changed to: ');
console.log(constants.engineState.toString(game_interface.EngineMode) + ' (' + game_interface.EngineMode + ')');
}
game_interface.OnDamagePlayer = function(player_actor, player_actor_2, HitOrigin, OldHealth, NewHealth, DamageType) {
if (NewHealth == 0)
console.log('KILL ' + player_actor.playername + ' was damaged by ' + (player_actor_2 == null ? "AI" : player_actor_2.playername) + ' (' + OldHealth + ' -> ' + NewHealth + ') ' + constants.damageType.toString(DamageType));
else
console.log('Damage ' + player_actor.playername + ' was damaged by ' + (player_actor_2 == null ? "AI" : player_actor_2.playername) + ' (' + OldHealth + ' -> ' + NewHealth + ') ' + constants.damageType.toString(DamageType));
}
game_interface.OnTick = function() {
for (var i in actor_stack) {
var Player = actor_stack[i];
if (Player.health <= 0) {
if (Player.DeadTime < 3000) // 3 seconds delay
continue;
console.log("player " + i + " has died and has been respawned.");
Player.EchoMessage('~O~Oh no!~T~Enjoy!', constants.fontSize.font_b);
Player.spawn(true);
}
}
}
// todo: should be global.console and prototyped from that.
Actor.spawn = function(position_too) {
this.health = 100;
//console.log(this.WeaponData());
this.StripWeapons();
this.GiveWeapon('m4gl', 5000);
this.GiveWeapon('gren', 5000);
this.GiveWeapon('gun1', 5000);
this.GiveWeapon('flam', 5000);
if (position_too == true)
this.move(53.5, 86.5, 2, true);
this.WantedLevel = 0;
this.State = constants.actorState.AsNormal;
this.ExtinguishFires();
this.SetActorAnimation(constants.animation.anm_stand, false, false, true);
this.NetworkSync(); // Synchronize player over network, if remote player.
if (this.IsActorLocal() == true)
game_interface.ResetCamera(53.5, 87.5, 2);
}
var somecar = new Vehicle('tank', 53.5, 89.5, 2, 45);
//console.log(somecar.health);
somecar.health = 10;
//console.log(somecar.health);
somecar.move(53.5, 89.5, 2, 45);
/*var myseats = somecar.seats();
console.log(typeof myseats);
console.log(myseats);*/
//somecar.free();
//console.log('valid: ' + somecar.valid());
/*
var loop = function() {
}
*/