293 lines
8.9 KiB
C#
293 lines
8.9 KiB
C#
//-----------------------------------------------------------------------------
|
|
|
|
// Variables used by client scripts & code. The ones marked with (c)
|
|
// are accessed from code. Variables preceeded by Pref:: are client
|
|
// preferences and stored automatically in the ~/client/prefs.cs file
|
|
// in between sessions.
|
|
//
|
|
// (c) Client::MissionFile Mission file name
|
|
// ( ) Client::Password Password for server join
|
|
|
|
// (?) Pref::Player::CurrentFOV
|
|
// (?) Pref::Player::DefaultFov
|
|
// ( ) Pref::Input::KeyboardTurnSpeed
|
|
|
|
// (c) pref::Master[n] List of master servers
|
|
// (c) pref::Net::RegionMask
|
|
// (c) pref::Client::ServerFavoriteCount
|
|
// (c) pref::Client::ServerFavorite[FavoriteCount]
|
|
// .. Many more prefs... need to finish this off
|
|
|
|
// Moves, not finished with this either...
|
|
// (c) firstPerson
|
|
// $mv*Action...
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// These are variables used to control the shell scripts and
|
|
// can be overriden by mods:
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function initClient()
|
|
{
|
|
echo("\n--------- Initializing FPS: Client ---------");
|
|
|
|
// Make sure this variable reflects the correct state.
|
|
$Server::Dedicated = false;
|
|
|
|
// Game information used to query the master server
|
|
$Client::GameTypeQuery = "Test App";
|
|
$Client::MissionTypeQuery = "Any";
|
|
|
|
// Default level qualification
|
|
if (!$pref::QualifiedLevel["Beginner"])
|
|
$pref::QualifiedLevel["Beginner"] = 1;
|
|
if (!$pref::QualifiedLevel["Intermediate"])
|
|
$pref::QualifiedLevel["Intermediate"] = 1;
|
|
if (!$pref::QualifiedLevel["Advanced"])
|
|
$pref::QualifiedLevel["Advanced"] = 1;
|
|
if (!$pref::QualifiedLevel["Expert"])
|
|
$pref::QualifiedLevel["Expert"] = 1;
|
|
|
|
// The common module provides basic client functionality
|
|
initBaseClient();
|
|
|
|
// InitCanvas starts up the graphics system.
|
|
// The canvas needs to be constructed before the gui scripts are
|
|
// run because many of the controls assume the canvas exists at
|
|
// load time.
|
|
initCanvas(" Kevin Blast 1.4.1 - Created by KevinSoftware");
|
|
|
|
/// Load client-side Audio Profiles/Descriptions
|
|
exec("./scripts/audioProfiles.cs");
|
|
|
|
// Load up the Game GUIs
|
|
exec("./ui/defaultGameProfiles.cs");
|
|
exec("./ui/PlayGui.gui");
|
|
|
|
// Load up the shell GUIs
|
|
exec("./ui/ignitionGui.gui");
|
|
exec("./ui/ignitionStatusGui.gui");
|
|
exec("./ui/presentsGui.gui");
|
|
exec("./ui/productionGui.gui");
|
|
exec("./ui/titleGui.gui");
|
|
exec("./ui/playMissionGui.gui");
|
|
exec("./ui/mainMenuGui.gui");
|
|
exec("./ui/aboutDlg.gui");
|
|
exec("./ui/startMissionGui.gui"); // to be deleted
|
|
exec("./ui/chooseGui.gui");
|
|
exec("./ui/joinServerGui.gui");
|
|
exec("./ui/endGameGui.gui");
|
|
exec("./ui/upsell/UpsellGui.gui");
|
|
EndGameGui.preload();
|
|
exec("./ui/loadingGui.gui");
|
|
exec("./ui/optionsDlg.gui");
|
|
exec("./ui/remapDlg.gui");
|
|
exec("./ui/MOTDGui.gui");
|
|
exec("./ui/EnterNameDlg.gui");
|
|
EnterNameDlg.preload();
|
|
exec("./ui/HelpCreditsGui.gui");
|
|
exec("./ui/ExitGameDlg.gui");
|
|
exec("./ui/MiniShotGui.gui");
|
|
// custom gui files
|
|
exec("./ui/congratsGui.gui");
|
|
|
|
// Client scripts
|
|
exec("./scripts/client.cs");
|
|
exec("./scripts/helpCredits.cs");
|
|
exec("./scripts/missionDownload.cs");
|
|
exec("./scripts/serverConnection.cs");
|
|
exec("./scripts/playerList.cs");
|
|
exec("./scripts/loadingGui.cs");
|
|
exec("./scripts/optionsDlg.cs");
|
|
exec("./scripts/chatHud.cs");
|
|
exec("./scripts/messageHud.cs");
|
|
exec("./scripts/playGui.cs");
|
|
exec("./scripts/centerPrint.cs");
|
|
exec("./scripts/game.cs");
|
|
exec("./scripts/version.cs");
|
|
// custom gui scripts
|
|
exec("./scripts/MarbleSkinSelectionDlg.cs");
|
|
|
|
// Default player key bindings
|
|
exec("./scripts/default.bind.cs");
|
|
exec("./config.cs");
|
|
|
|
// Really shouldn't be starting the networking unless we are
|
|
// going to connect to a remote server, or host a multi-player
|
|
// game.
|
|
// setNetPort(0);
|
|
|
|
// Copy saved script prefs into C++ code.
|
|
setShadowDetailLevel( $pref::shadows );
|
|
setDefaultFov( $pref::Player::defaultFov );
|
|
setZoomSpeed( $pref::Player::zoomSpeed );
|
|
|
|
// Start up the main menu... this is separated out into a
|
|
// method for easier mod override.
|
|
loadMainMenu();
|
|
|
|
// Connect to server if requested.
|
|
if ($JoinGameAddress !$= "") {
|
|
connect($JoinGameAddress, "", $Pref::Player::Name);
|
|
}
|
|
else if($missionArg !$= "") {
|
|
%file = findNamedFile($missionArg, ".mis");
|
|
if(%file !$= "")
|
|
{
|
|
%this.io = new IgnitionObject();
|
|
%status = %this.io.validate();
|
|
echo("Ignition: " @ %status);
|
|
|
|
doCreateGame(%file);
|
|
}
|
|
}
|
|
else if($interiorArg !$= "") {
|
|
%file = findNamedFile($interiorArg, ".dif");
|
|
if(%file !$= "")
|
|
{
|
|
onServerCreated(); // gotta hack here to get the datablocks loaded...
|
|
|
|
%this.io = new IgnitionObject();
|
|
%status = %this.io.validate();
|
|
echo("Ignition: " @ %status);
|
|
|
|
%missionGroup = createEmptyMission($interiorArg);
|
|
%interior = new InteriorInstance() {
|
|
position = "0 0 0";
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
interiorFile = %file;
|
|
};
|
|
%missionGroup.add(%interior);
|
|
%interior.magicButton();
|
|
|
|
if(!isObject(StartPoint))
|
|
{
|
|
%pt = new StaticShape(StartPoint) {
|
|
position = "0 -5 100";
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "StartPad";
|
|
};
|
|
MissionGroup.add(%pt);
|
|
}
|
|
|
|
if(!isObject(EndPoint))
|
|
{
|
|
%pt = new StaticShape(EndPoint) {
|
|
position = "0 5 100";
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "EndPad";
|
|
};
|
|
MissionGroup.add(%pt);
|
|
}
|
|
%box = %interior.getWorldBox();
|
|
%mx = getWord(%box, 0);
|
|
%my = getWord(%box, 1);
|
|
%mz = getWord(%box, 2);
|
|
%MMx = getWord(%box, 3);
|
|
%MMy = getWord(%box, 4);
|
|
%MMz = getWord(%box, 5);
|
|
%pos = (%mx - 3) SPC (%MMy + 3) SPC (%mz - 3);
|
|
%scale = (%MMx - %mx + 6) SPC (%MMy - %my + 6) SPC (%MMz - %mz + 20);
|
|
echo(%box);
|
|
echo(%pos);
|
|
echo(%scale);
|
|
|
|
new Trigger(Bounds) {
|
|
position = %pos;
|
|
scale = %scale;
|
|
rotation = "1 0 0 0";
|
|
dataBlock = "InBoundsTrigger";
|
|
polyhedron = "0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 0.0000000 1.0000000";
|
|
};
|
|
MissionGroup.add(Bounds);
|
|
|
|
|
|
%missionGroup.save("marble/data/missions/testMission.mis");
|
|
%missionGroup.delete();
|
|
doCreateGame("marble/data/missions/testMission.mis");
|
|
}
|
|
}
|
|
}
|
|
|
|
function doCreateGame(%file)
|
|
{
|
|
echo("creating game!");
|
|
createServer("SinglePlayer", %file);
|
|
%conn = new GameConnection(ServerConnection);
|
|
RootGroup.add(ServerConnection);
|
|
%conn.setConnectArgs($pref::Player::Name);
|
|
%conn.setJoinPassword($Client::Password);
|
|
%conn.connectLocal();
|
|
}
|
|
|
|
function findNamedFile(%file, %ext)
|
|
{
|
|
if(fileExt(%file) !$= %ext)
|
|
%file = %file @ %ext;
|
|
|
|
%found = findFirstFile(%file);
|
|
if(%found $= "")
|
|
%found = findFirstFile("*/" @ %file);
|
|
return %found;
|
|
}
|
|
|
|
function setPlayMissionGui()
|
|
{
|
|
// save game too
|
|
export("$pref::*", "./prefs.cs", False);
|
|
Canvas.setContent(playMissionGui);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function loadMainMenu()
|
|
{
|
|
// Startup the client with the Main menu...
|
|
runPresentation();
|
|
buildMissionList();
|
|
Canvas.setCursor("DefaultCursor");
|
|
playShellMusic();
|
|
}
|
|
|
|
function createEmptyMission(%interiorArg)
|
|
{
|
|
return new SimGroup(MissionGroup) {
|
|
new ScriptObject(MissionInfo) {
|
|
level = "001";
|
|
desc = "A test mission for an interior";
|
|
type = "Template";
|
|
name = "Interior Test: " @ %interiorArg;
|
|
time = 0;
|
|
};
|
|
new MissionArea(MissionArea) {
|
|
area = "-360 -648 720 1296";
|
|
flightCeiling = "300";
|
|
flightCeilingRange = "20";
|
|
locked = "true";
|
|
};
|
|
new Sky(Sky) {
|
|
position = "336 136 0";
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
visibleDistance = "500";
|
|
useSkyTextures = "1";
|
|
renderBottomTexture = "1";
|
|
SkySolidColor = "0.600000 0.600000 0.600000 1.000000";
|
|
fogDistance = "300";
|
|
fogColor = "0.600000 0.600000 0.600000 1.000000";
|
|
materialList = "~/data/skies/sky_day.dml";
|
|
noRenderBans = "1";
|
|
};
|
|
new Sun() {
|
|
direction = "0.57735 0.57735 -0.57735";
|
|
color = "0.600000 0.600000 0.600000 1.000000";
|
|
ambient = "0.400000 0.400000 0.400000 1.000000";
|
|
};
|
|
};
|
|
}
|
|
|