void main()
{
if(openborvariant("in_titlescreen")){
clearglobalvar();
clearlocalvar();
}
if(openborvariant("in_level")){
if(!openborvariant("pause")){
splitScreen(0, 1);
splitScreen(1, 1);
normalScreen(2);
clearspriteq();
}
}
}
void splitScreen(int player, int type)
{//Simulates a "split screen" feature (Kratus 02-2022)
//Don't forget to set a "wait" in "at 0" on every level to lock the "xpos" scrolling to avoid screen "shaking"
//Most things on the game will need to be scripted, once most native functions will not work in the level design
void ent = getplayerproperty(player, "entity");
//HORIZONTAL
if(type == 0){
if(ent){
void vScreen = openborvariant("vscreen");
float x = getentityproperty(ent, "x");
float z = getentityproperty(ent, "z");
float hRes = openborvariant("hresolution");
float vRes = openborvariant("vresolution");
float xPos = openborvariant("xpos");
float yPos = openborvariant("ypos");
float minZ = openborvariant("PLAYER_MIN_Z");
float maxZ = openborvariant("PLAYER_MAX_Z");
float screenDif = (vRes/2)*player;
float scaleX = 256;
float scaleY = 256;
float zAdd = 500;
float xVel = 1;
float zVel = 1;
//START AND DEFINE VARIABLES
if(getglobalvar("screenP"+player) == NULL()){
changeopenborvariant("viewportx", 0);
changeopenborvariant("viewporty", 0);
changeopenborvariant("viewportw", openborvariant("levelwidth"));
changeopenborvariant("viewporth", openborvariant("levelheight"));
changeentityproperty(ent, "position", xPos+(hRes/6), minZ+(screenDif/8));
setglobalvar("xOffset"+player, 0);
setglobalvar("zOffset"+player, 0);
setglobalvar("screenP"+player, allocscreen(openborvariant("levelwidth"), vRes));
}
//READJUST SCREENS FOR 1 OR TWO PLAYERS IN REAL TIME
//DISABLED BECAUSE NEED IMPROVEMENTS
if(openborvariant("count_players") <= 1){
// scaleX = 512;
// scaleY = 512;
// hRes = hRes/2;
// screenDif = 0;
}
//CLEAR SCREEN
clearscreen(getglobalvar("screenP"+player));
//ADJUST LEVEL OFFSET AS A "FAKE" XPOS FOR EACH SCREEN IN REAL TIME
//USED WHEN THE CHARACTER IS MOVED TO RIGHT DIRECTION IN REAL TIME
if(x + getglobalvar("xOffset"+player) > (hRes/2)){
if(getglobalvar("xOffset"+player) > (hRes-openborvariant("levelwidth"))){
setglobalvar("xOffset"+player, getglobalvar("xOffset"+player)-xVel);
changeentityproperty(ent, "subject_to_screen", 0);
}
}
//USED WHEN THE CHARACTER IS MOVED TO LEFT DIRECTION IN REAL TIME
//DISABLED TO WORK ONLY FOR THE RIGHT DIRECTION, BUT THE LEFT DIRECTION WORKS CORRETLY TOO
if(x + getglobalvar("xOffset"+player) < (hRes/2)){
if(getglobalvar("xOffset"+player) < 0){
setglobalvar("xOffset"+player, getglobalvar("xOffset"+player)+xVel);
changeentityproperty(ent, "subject_to_screen", 0);
}
else
{
changeentityproperty(ent, "subject_to_screen", 1);
}
}
//ADJUST LEVEL OFFSET AS A "FAKE" XPOS FOR EACH SCREEN IN REAL TIME
//USED WHEN THE CHARACTER IS MOVED TO RIGHT DIRECTION IN REAL TIME
if(z + getglobalvar("zOffset"+player) > (vRes/2)){
//setglobalvar("zOffset"+player, getglobalvar("zOffset"+player)-zVel);
}
//USED WHEN THE CHARACTER IS MOVED TO LEFT DIRECTION IN REAL TIME
//DISABLED TO WORK ONLY FOR THE RIGHT DIRECTION, BUT THE LEFT DIRECTION WORKS CORRETLY TOO
if(z + getglobalvar("zOffset"+player) < (vRes/2)){
//setglobalvar("zOffset"+player, getglobalvar("zOffset"+player)+zVel);
}
//DEBUG INFO
// drawstring(getglobalvar("xOffset"+player)/10000, 50+screenDif, 0, openborvariant("levelwidth"), openborconstant("MAX_INT")/100000);
// drawstring(getglobalvar("xOffset"+player)/10000, 60+screenDif, 0, getglobalvar("xOffset"+player), openborconstant("MAX_INT")/100000);
// drawstring(getglobalvar("xOffset"+player)/10000, 70+screenDif, 0, x, openborconstant("MAX_INT")/100000);
//DRAW EVERYTHING IN REAL TIME
drawspriteq(getglobalvar("screenP"+player), 0, openborconstant("MIN_INT"), maxZ+zAdd, getglobalvar("xOffset"+player), getglobalvar("zOffset"+player));
changedrawmethod(NULL(),"reset", 1);
changedrawmethod(NULL(),"enabled", 1);
changedrawmethod(NULL(),"scalex", scaleX);
changedrawmethod(NULL(),"scaley", scaleY);
drawscreen(getglobalvar("screenP"+player), 0, screenDif, (maxZ*9)+player);
drawspriteq(vScreen, 0, openborconstant("MIN_INT"), openborconstant("MAX_INT"), 0, 0);
}
else
{
if(getglobalvar("screenP"+player) != NULL()){setglobalvar("screenP"+player, NULL());}
}
}
//VERTICAL
if(type == 1){
if(ent){
void vScreen = openborvariant("vscreen");
float x = getentityproperty(ent, "x");
float z = getentityproperty(ent, "z");
float hRes = openborvariant("hresolution");
float vRes = openborvariant("vresolution");
float minZ = openborvariant("PLAYER_MIN_Z");
float maxZ = openborvariant("PLAYER_MAX_Z");
float xVel = getlevelproperty("scrollspeed");
float zVel = getlevelproperty("scrollspeed");
float zDif = 40*player;
float scaleX = 256;
float scaleY = 256;
float layerID;
float layerV;
float layerZ;
float panelZ;
float p1Screen;
float p2Screen;
int p1Layer;
int p2Layer;
//START AND DEFINE VARIABLES
if(getglobalvar("screenP"+player) == NULL()){
changeopenborvariant("viewportx", 0);
changeopenborvariant("viewporty", 0);
changeopenborvariant("viewportw", openborvariant("levelwidth"));
changeopenborvariant("viewporth", openborvariant("levelheight"));
changeentityproperty(ent, "position", hRes/6, minZ+zDif);
setglobalvar("xOffset"+player, 0);
setglobalvar("zOffset"+player, 0);
setglobalvar("screenP"+player, allocscreen(hRes/2, vRes));
}
//READJUST SCREENS FOR TWO PLAYERS IN REAL TIME
if(openborvariant("count_players") > 1){
if((getglobalvar("xOffset0")*(-1)) > (getglobalvar("xOffset1")*(-1))+(hRes/2)){
p1Screen = hRes/2;
p2Screen = 0;
p1Layer = 0;
p2Layer = 2;
drawbox(p1Screen, 0, 1, 276, openborconstant("MAX_INT"), rgbcolor(255, 255, 255), 0);
}
else
if((getglobalvar("xOffset1")*(-1)) > (getglobalvar("xOffset0")*(-1))+(hRes/2)){
p1Screen = 0;
p2Screen = hRes/2;
p1Layer = 2;
p2Layer = 0;
drawbox(p2Screen, 0, 1, 276, openborconstant("MAX_INT"), rgbcolor(255, 255, 255), 0);
}
else
{
p1Screen = 0;
p2Screen = 0;
p1Layer = 0;
p2Layer = 0;
}
}
//CLEAR SCREEN
clearscreen(getglobalvar("screenP"+player));
//ADJUST LEVEL OFFSET AS A "FAKE" XPOS FOR EACH SCREEN IN REAL TIME
//USED WHEN THE CHARACTER IS MOVED TO RIGHT DIRECTION IN REAL TIME
if(x > (getglobalvar("xOffset"+player)*(-1)) + (hRes/4)){
if((getglobalvar("xOffset"+player)*(-1)) < (openborvariant("levelwidth")-hRes/2)){
setglobalvar("xOffset"+player, getglobalvar("xOffset"+player)-xVel);
changeentityproperty(ent, "subject_to_screen", 0);
}
}
//USED WHEN THE CHARACTER IS MOVED TO LEFT DIRECTION IN REAL TIME
if(x < (getglobalvar("xOffset"+player)*(-1)) + (hRes/4)){
if((getglobalvar("xOffset"+player)*(-1)) > 0){
setglobalvar("xOffset"+player, getglobalvar("xOffset"+player)+xVel);
changeentityproperty(ent, "subject_to_screen", 0);
}
}
//ADJUST LEVEL OFFSET AS A "FAKE" XPOS FOR EACH SCREEN IN REAL TIME
//USED WHEN THE CHARACTER IS MOVED TO RIGHT DIRECTION IN REAL TIME
if(z + getglobalvar("zOffset"+player) > (vRes/2)){
//setglobalvar("zOffset"+player, getglobalvar("zOffset"+player)-zVel);
}
//USED WHEN THE CHARACTER IS MOVED TO LEFT DIRECTION IN REAL TIME
if(z + getglobalvar("zOffset"+player) < (vRes/2)){
//setglobalvar("zOffset"+player, getglobalvar("zOffset"+player)+zVel);
}
//FGLAYER 0 - BACK LAYER
layerID = 0;
layerZ = getlayerproperty("fglayer", layerID, "z");
layerV = getlayerproperty("fglayer", layerID, "xratio");
panelZ = minZ-50;
//drawspriteq(getglobalvar("screenP"+player), 0, layerZ, panelZ-1, getglobalvar("xOffset"+player)*layerV, getglobalvar("zOffset"+player));
//PANEL
drawspriteq(getglobalvar("screenP"+player), 0, panelZ, minZ-1, getglobalvar("xOffset"+player), getglobalvar("zOffset"+player));
//PLAYABLE AREA
drawspriteq(getglobalvar("screenP"+player), 0, minZ, maxZ, getglobalvar("xOffset"+player), getglobalvar("zOffset"+player));
//FGLAYER 1 - FRONT LAYER
layerID = 1;
layerZ = getlayerproperty("fglayer", layerID, "z");
layerV = getlayerproperty("fglayer", layerID, "xratio");
drawspriteq(getglobalvar("screenP"+player), 0, maxZ+1, layerZ, getglobalvar("xOffset"+player)*layerV, getglobalvar("zOffset"+player));
//DRAW EVERYTHING IN REAL TIME
changedrawmethod(NULL(),"reset", 1);
changedrawmethod(NULL(),"enabled", 1);
changedrawmethod(NULL(),"scalex", scaleX);
changedrawmethod(NULL(),"scaley", scaleY);
//DRAW EACH PLAYER SCREEN SEPARATELLY
if(player == 0){drawscreen(getglobalvar("screenP"+player), p1Screen, 0, (maxZ*9)+p1Layer);}
if(player == 1){drawscreen(getglobalvar("screenP"+player), p2Screen, 0, (maxZ*9)+p2Layer);}
//DRAW EVERYTHING TO THE MAIN SCREEN
drawspriteq(vScreen, 0, openborconstant("MIN_INT"), openborconstant("MAX_INT"), 0, 0);
}
else
{
if(getglobalvar("screenP"+player) != NULL()){setglobalvar("screenP"+player, NULL());}
}
}
}
void normalScreen(int player)
{//Simulates a "split screen" feature (Kratus 02-2022)
//Don't forget to set a "wait" in "at 0" on every level to lock the "xpos" scrolling to avoid screen "shaking"
//Most things on the game will need to be scripted, once most native functions will not work in the level design
void ent = openborvariant("count_players");
if(ent >= 1){
void vScreen = openborvariant("vscreen");
float hRes = openborvariant("hresolution");
float vRes = openborvariant("vresolution");
float minZ = openborvariant("PLAYER_MIN_Z");
float maxZ = openborvariant("PLAYER_MAX_Z");
float xVel = getlevelproperty("scrollspeed");
float zVel = getlevelproperty("scrollspeed");
float zDif = 40*player;
float scaleX = 256;
float scaleY = 256;
float layerID;
float layerV;
float layerZ;
float panelZ;
float pScreen;
float x;
int layer;
//START AND DEFINE VARIABLES
if(getglobalvar("screenP") == NULL()){
changeopenborvariant("viewportx", 0);
changeopenborvariant("viewporty", 0);
changeopenborvariant("viewportw", openborvariant("levelwidth"));
changeopenborvariant("viewporth", openborvariant("levelheight"));
setglobalvar("xOffset", 0);
setglobalvar("zOffset", 0);
setglobalvar("screenP", allocscreen(openborvariant("levelwidth"), vRes));
}
//READJUST SCREENS FOR TWO PLAYERS IN REAL TIME
if(openborvariant("count_players") <= 1){
pScreen = 0;
layer = 0;
x = (getglobalvar("xOffset0")*(-1));
}
else
{
if((getglobalvar("xOffset0")*(-1)) > (getglobalvar("xOffset1")*(-1))){
pScreen = 0;
layer = 1;
x = (getglobalvar("xOffset0")*(-1));
}
else
if((getglobalvar("xOffset1")*(-1)) > (getglobalvar("xOffset0")*(-1))){
pScreen = 0;
layer = 1;
x = (getglobalvar("xOffset1")*(-1));
}
else
{
pScreen = 0;
layer = 3;
x = (getglobalvar("xOffset0")*(-1));
}
}
//CLEAR SCREEN
clearscreen(getglobalvar("screenP"));
//ADJUST LEVEL OFFSET AS A "FAKE" XPOS FOR EACH SCREEN IN REAL TIME
//USED WHEN THE CHARACTER IS MOVED TO RIGHT DIRECTION IN REAL TIME
if(x > (getglobalvar("xOffset")*(-1)) + (hRes/2)){
if((getglobalvar("xOffset")*(-1)) < (openborvariant("levelwidth")-hRes/2)){
setglobalvar("xOffset", getglobalvar("xOffset")-xVel);
}
}
//USED WHEN THE CHARACTER IS MOVED TO LEFT DIRECTION IN REAL TIME
if(x < (getglobalvar("xOffset")*(-1)) + (hRes/2)){
if((getglobalvar("xOffset")*(-1)) > 0){
setglobalvar("xOffset", getglobalvar("xOffset")+xVel);
}
}
//DEBUG INFO
drawstring(getglobalvar("xOffset")/10000, 70+zDif, 0, getlayerproperty("fglayer", 0, "z"), openborconstant("MAX_INT")/100000);
drawstring(getglobalvar("xOffset")/10000, 80+zDif, 0, (getglobalvar("xOffset")*(-1)), openborconstant("MAX_INT")/100000);
//FGLAYER 0 - BACK LAYER
layerID = 0;
layerZ = getlayerproperty("fglayer", layerID, "z");
layerV = getlayerproperty("fglayer", layerID, "xratio");
panelZ = minZ-50;
//drawspriteq(getglobalvar("screenP"), 0, layerZ, panelZ-1, getglobalvar("xOffset")*layerV, getglobalvar("zOffset"));
//PANEL
drawspriteq(getglobalvar("screenP"), 0, panelZ, minZ-1, getglobalvar("xOffset"), getglobalvar("zOffset"));
//PLAYABLE AREA
drawspriteq(getglobalvar("screenP"), 0, minZ, maxZ, getglobalvar("xOffset"), getglobalvar("zOffset"));
//FGLAYER 1 - FRONT LAYER
layerID = 1;
layerZ = getlayerproperty("fglayer", layerID, "z");
layerV = getlayerproperty("fglayer", layerID, "xratio");
drawspriteq(getglobalvar("screenP"), 0, maxZ+1, layerZ, getglobalvar("xOffset")*layerV, getglobalvar("zOffset"));
//DRAW EVERYTHING IN REAL TIME
changedrawmethod(NULL(),"reset", 1);
changedrawmethod(NULL(),"enabled", 1);
changedrawmethod(NULL(),"scalex", scaleX);
changedrawmethod(NULL(),"scaley", scaleY);
drawscreen(getglobalvar("screenP"), pScreen, 0, (maxZ*9)+layer);
drawspriteq(vScreen, 0, openborconstant("MIN_INT"), openborconstant("MAX_INT"), 0, 0);
}
else
{
if(getglobalvar("screenP") != NULL()){setglobalvar("screenP", NULL());}
}
}