This commit is contained in:
2025-04-09 02:36:37 +02:00
parent 6420554df2
commit d533ffd7a8
18 changed files with 576 additions and 77 deletions

View File

@@ -0,0 +1,369 @@
package;
#if macro
import haxe.macro.Compiler;
import haxe.macro.Context;
import haxe.macro.Expr;
#end
@:access(lime.app.Application)
@:access(lime.system.System)
@:access(openfl.display.Stage)
@:access(openfl.events.UncaughtErrorEvents)
@:dox(hide)
class ApplicationMain
{
#if !macro
public static function main()
{
lime.system.System.__registerEntryPoint("::APP_FILE::", create);
#if (js && html5)
#if (munit || (utest && openfl_enable_utest_legacy_mode))
lime.system.System.embed("::APP_FILE::", null, ::WIN_WIDTH::, ::WIN_HEIGHT::);
#end
#else
create(null);
#end
}
public static function create(config):Void
{
var app = new openfl.display.Application();
#if !disable_preloader_assets
ManifestResources.init(config);
#end
app.meta["build"] = "::meta.buildNumber::";
app.meta["company"] = "::meta.company::";
app.meta["file"] = "::APP_FILE::";
app.meta["name"] = "::meta.title::";
app.meta["packageName"] = "::meta.packageName::";
app.meta["version"] = "::meta.version::";
::if (config.hxtelemetry != null)::#if hxtelemetry
app.meta["hxtelemetry-allocations"] = "::config.hxtelemetry.allocations::";
app.meta["hxtelemetry-host"] = "::config.hxtelemetry.host::";
#end::end::
#if !flash
::foreach windows::
var attributes:lime.ui.WindowAttributes = {
allowHighDPI: ::allowHighDPI::,
alwaysOnTop: ::alwaysOnTop::,
borderless: ::borderless::,
// display: ::display::,
element: null,
frameRate: ::fps::,
#if !web fullscreen: ::fullscreen::, #end
height: ::height::,
hidden: #if munit true #else ::hidden:: #end,
maximized: ::maximized::,
minimized: ::minimized::,
parameters: ::parameters::,
resizable: ::resizable::,
title: "::title::",
width: ::width::,
x: ::x::,
y: ::y::,
};
attributes.context = {
antialiasing: ::antialiasing::,
background: ::background::,
colorDepth: ::colorDepth::,
depth: ::depthBuffer::,
hardware: ::hardware::,
stencil: ::stencilBuffer::,
type: null,
vsync: ::vsync::
};
if (app.window == null)
{
if (config != null)
{
for (field in Reflect.fields(config))
{
if (Reflect.hasField(attributes, field))
{
Reflect.setField(attributes, field, Reflect.field(config, field));
}
else if (Reflect.hasField(attributes.context, field))
{
Reflect.setField(attributes.context, field, Reflect.field(config, field));
}
}
}
#if sys
lime.system.System.__parseArguments(attributes);
#end
}
app.createWindow(attributes);
::end::
#elseif air
app.window.title = "::meta.title::";
#else
app.window.context.attributes.background = ::WIN_BACKGROUND::;
app.window.frameRate = ::WIN_FPS::;
#end
var preloader = getPreloader();
app.preloader.onProgress.add (function(loaded, total)
{
@:privateAccess preloader.update(loaded, total);
});
app.preloader.onComplete.add(function()
{
@:privateAccess preloader.start();
});
preloader.onComplete.add(start.bind((cast app.window:openfl.display.Window).stage));
#if !disable_preloader_assets
for (library in ManifestResources.preloadLibraries)
{
app.preloader.addLibrary(library);
}
for (name in ManifestResources.preloadLibraryNames)
{
app.preloader.addLibraryName(name);
}
#end
app.preloader.load();
var result = app.exec();
#if (sys && !ios && !nodejs && !emscripten)
lime.system.System.exit(result);
#end
}
public static function start(stage:openfl.display.Stage):Void
{
#if flash
ApplicationMain.getEntryPoint();
#else
if (stage.__uncaughtErrorEvents.__enabled)
{
try
{
ApplicationMain.getEntryPoint();
stage.dispatchEvent(new openfl.events.Event(openfl.events.Event.RESIZE, false, false));
if (stage.window.fullscreen)
{
stage.dispatchEvent(new openfl.events.FullScreenEvent(openfl.events.FullScreenEvent.FULL_SCREEN, false, false, true, true));
}
}
catch (e:Dynamic)
{
#if !display
stage.__handleError(e);
#end
}
}
else
{
ApplicationMain.getEntryPoint();
stage.dispatchEvent(new openfl.events.Event(openfl.events.Event.RESIZE, false, false));
if (stage.window.fullscreen)
{
stage.dispatchEvent(new openfl.events.FullScreenEvent(openfl.events.FullScreenEvent.FULL_SCREEN, false, false, true, true));
}
}
#end
}
#end
macro public static function getEntryPoint()
{
var hasMain = false;
switch (Context.follow(Context.getType("::APP_MAIN::")))
{
case TInst(t, params):
var type = t.get();
for (method in type.statics.get())
{
if (method.name == "main")
{
hasMain = true;
break;
}
}
if (hasMain)
{
return Context.parse("@:privateAccess ::APP_MAIN::.main()", Context.currentPos());
}
else if (type.constructor != null)
{
return macro
{
var current = stage.getChildAt (0);
if (current == null || !(current is openfl.display.DisplayObjectContainer))
{
current = new openfl.display.MovieClip();
stage.addChild(current);
}
new DocumentClass(cast current);
};
}
else
{
Context.fatalError("Main class \"::APP_MAIN::\" has neither a static main nor a constructor.", Context.currentPos());
}
default:
Context.fatalError("Main class \"::APP_MAIN::\" isn't a class.", Context.currentPos());
}
return null;
}
macro public static function getPreloader()
{
::if (PRELOADER_NAME != "")::
var type = Context.getType("::PRELOADER_NAME::");
switch (type)
{
case TInst(classType, _):
var searchTypes = classType.get();
while (searchTypes != null)
{
if (searchTypes.pack.length == 2 && searchTypes.pack[0] == "openfl" && searchTypes.pack[1] == "display" && searchTypes.name == "Preloader")
{
return macro
{
new ::PRELOADER_NAME::();
};
}
if (searchTypes.superClass != null)
{
searchTypes = searchTypes.superClass.t.get();
}
else
{
searchTypes = null;
}
}
default:
}
return macro
{
new openfl.display.Preloader(new ::PRELOADER_NAME::());
}
::else::
return macro
{
new openfl.display.Preloader(new openfl.display.Preloader.DefaultPreloader());
};
::end::
}
#if !macro
@:noCompletion @:dox(hide) public static function __init__()
{
var init = lime.app.Application;
#if neko
// Copy from https://github.com/HaxeFoundation/haxe/blob/development/std/neko/_std/Sys.hx#L164
// since Sys.programPath () isn't available in __init__
var sys_program_path = {
var m = neko.vm.Module.local().name;
try
{
sys.FileSystem.fullPath(m);
}
catch (e:Dynamic)
{
// maybe the neko module name was supplied without .n extension...
if (!StringTools.endsWith(m, ".n"))
{
try
{
sys.FileSystem.fullPath(m + ".n");
}
catch (e:Dynamic)
{
m;
}
}
else
{
m;
}
}
};
var loader = new neko.vm.Loader(untyped $loader);
loader.addPath(haxe.io.Path.directory(#if (haxe_ver >= 3.3) sys_program_path #else Sys.executablePath() #end));
loader.addPath("./");
loader.addPath("@executable_path/");
#end
}
#end
}
#if !macro
@:build(DocumentClass.build())
@:keep @:dox(hide) class DocumentClass extends ::APP_MAIN:: {}
#else
class DocumentClass
{
macro public static function build():Array<Field>
{
var classType = Context.getLocalClass().get();
var searchTypes = classType;
while (searchTypes != null)
{
if (searchTypes.module == "openfl.display.DisplayObject" || searchTypes.module == "flash.display.DisplayObject")
{
var fields = Context.getBuildFields();
var method = macro
{
current.addChild(this);
super();
dispatchEvent(new openfl.events.Event(openfl.events.Event.ADDED_TO_STAGE, false, false));
}
fields.push({ name: "new", access: [ APublic ], kind: FFun({ args: [ { name: "current", opt: false, type: macro :openfl.display.DisplayObjectContainer, value: null } ], expr: method, params: [], ret: macro :Void }), pos: Context.currentPos() });
return fields;
}
if (searchTypes.superClass != null)
{
searchTypes = searchTypes.superClass.t.get();
}
else
{
searchTypes = null;
}
}
return null;
}
}
#end

View File

@@ -1,3 +1,4 @@
import openfl.display.Window;
import assets.Scanner;
import game.video.Mode;
import openfl.events.KeyboardEvent;
@@ -12,8 +13,6 @@ class Main extends Sprite {
public function new () {
super ();
this.addEventListener(Event.ADDED_TO_STAGE, onInit);
//stage.application.window.resize(1920, 1080);
//stage.application.window.title = "Kanker";
}
private function onInit(e:Event)
{
@@ -28,8 +27,23 @@ class Main extends Sprite {
//Mode.setVideoMode(1280, 960);
}
private function onResize (event:Event):Void {
//Here we can do shit with window scaling
//stage.stageWidth;
//stage.stageHeight;
}
// static function main () {
// // Bootstrap the OpenFL project
// var application = new lime.app.Application();
// application.createWindow({
// hidden: false,
// x: 0,
// y: 0,
// width: 800,
// height: 600,
// title: "DSTEngine Window"
// });
// }
}

View File

@@ -58,6 +58,7 @@ class ConVarDecorators {
// Process command fields
private static function processCommandField(field:Field, cmdMeta:MetadataEntry, extraFields:Array<Field>):Void {
if (!isFieldKind(field, "FFun")) {
Context.error("The @:concmd metadata can only be applied to functions", field.pos);
return;
@@ -246,19 +247,20 @@ class ConVarDecorators {
}
public static macro function build():Array<Field> {
var fields = Context.getBuildFields();
var extraFields:Array<Field> = [];
var fields = Context.getBuildFields(); // Get all fields in the class
var extraFields:Array<Field> = []; // Extra fields to be added
for (field in fields) {
if (field.meta == null) continue;
if (field.meta == null) continue; // Skip fields without metadata
var cmdMeta = Lambda.find(field.meta, function(m) return m.name == ":concmd");
var cvarMeta = Lambda.find(field.meta, function(m) return m.name == ":convar");
var cmdDecorator = Lambda.find(field.meta, function(m) return m.name == ":concmd"); // Check for command decorator
var cvarDecorator = Lambda.find(field.meta, function(m) return m.name == ":convar"); // Check for convar decorator
if (cmdMeta != null) {
processCommandField(field, cmdMeta, extraFields);
} else if (cvarMeta != null && cvarMeta.params.length > 0) {
processConVarField(field, cvarMeta, extraFields);
if (cmdDecorator != null) {
processCommandField(field, cmdDecorator, extraFields);
} else if (cvarDecorator != null && cvarDecorator.params.length > 0) {
processConVarField(field, cvarDecorator, extraFields);
}
}

View File

@@ -92,26 +92,28 @@ class Input{
{
bindMap[input] = action;
}
private static var bind:CCmd = ConVar.registerCCmd("bind", (cArgs:Array<String>)->{
cArgs[0] = cArgs[0].toUpperCase();
if(cArgs.length == 2){
if(keyCodeMap[cArgs[0]]!= null) {
if(cArgs[1].indexOf('"') == 0 && cArgs[1].lastIndexOf('"') == cArgs[1].length-1){
bindKey(cArgs[0], cArgs[1].substring(1,cArgs[1].length-1));
@:concmd("bind")
private static function bind(args:Array<String>):Void
{
args[0] = args[0].toUpperCase();
if(args.length == 2){
if(keyCodeMap[args[0]]!= null) {
if(args[1].indexOf('"') == 0 && args[1].lastIndexOf('"') == args[1].length-1){
bindKey(args[0], args[1].substring(1,args[1].length-1));
}
else{
bindKey(cArgs[0], cArgs[1]);
bindKey(args[0], args[1]);
}
}
}
else if(cArgs.length == 1){
Console.devMsg(bindMap[cArgs[0]]);
else if(args.length == 1){
Console.devMsg(bindMap[args[0]]);
}
else{
Console.devMsg("usage: bind <key> <command>");
}
});
};
public static function onEnterFrame()
{
if( keys[Kb.BACKQUOTE]){

View File

@@ -42,10 +42,13 @@ class Console extends Sprite {
public static var scvar_mat_consolebg:CVar;
public var cvar_mat_consolebg:CVar;
public var ccmd_visible:CCmd = ConVar.registerCCmd("toggleconsole", (cArgs:Array<String>) -> {
// public function cCmdToggleConsole(args:Array<String>) {
// toggle();
// }
@:concmd("toggleconsole")
public function ccmd_toggleconsole(cArgs:Array<String>) {
toggle();
});
};
public function new() {
super();

View File

@@ -1,5 +1,6 @@
package game.video;
import game.ui.console.Console;
import engine.ConVar;
import engine.typedefs.console.CCmd;
import openfl.Lib;
@@ -14,22 +15,26 @@ class Mode
public static function setVideoMode(width:Int, height:Int, fs:Int = null){
getWindow().resize(width,height);
if(fs == null){
return;
}
switchFsMode(fs);
}
@:concmd("mat_setvideomode")
public static function cCmdMatSetVideoMode(args:Array<String>){
Console.devMsg("Setting video mode to: "+args[0]+"x"+args[1]+"x"+args[2]);
Mode.setVideoMode(Std.parseInt(args[0]), Std.parseInt(args[1]), Std.parseInt(args[2]));
}
public static function switchFsMode(toState:Int = 0){
Console.devMsg("Switching fullscreen mode to: "+toState);
if(toState == 0){
if(Lib.current.stage.displayState != StageDisplayState.FULL_SCREEN_INTERACTIVE){
Lib.current.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
}
else{
Lib.current.stage.displayState = StageDisplayState.NORMAL;
}
Lib.current.stage.displayState = StageDisplayState.FULL_SCREEN;
}
else if(toState == 1){
Lib.current.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
}
else{
Lib.current.stage.displayState = StageDisplayState.NORMAL;
}
}
}