aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/main.felan129
-rw-r--r--src/compiler/ast-tree.c32
-rw-r--r--src/runner/runner.c3
3 files changed, 158 insertions, 6 deletions
diff --git a/code/main.felan b/code/main.felan
index c146dce..92cc4e4 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,11 +1,132 @@
@import("basic.felan");
-t :: (comptime b:u8) -> void {
- print(b);
+raylib :: @c_library("/usr/lib/libraylib.so.5.5.0");
+InitWindow :: @c_function(raylib,"InitWindow",(i32,i32,*u8)->void);
+SetTargetFPS :: @c_function(raylib,"SetTargetFPS",(i32)->void);
+WindowShouldClose :: @c_function(raylib,"WindowShouldClose",()->bool);
+CloseWindow :: @c_function(raylib,"CloseWindow",()->void);
+BeginDrawing :: @c_function(raylib,"BeginDrawing",()->void);
+ClearBackground :: @c_function(raylib,"ClearBackground",(Color)->void);
+EndDrawing :: @c_function(raylib,"EndDrawing",()->void);
+IsKeyPressed :: @c_function(raylib,"IsKeyPressed",(i32)->bool);
+IsGestureDetected :: @c_function(raylib,"IsGestureDetected",(u32)->bool);
+DrawText :: @c_function(raylib,"DrawText",(*u8,i32,i32,i32,Color)->void);
+DrawRectangle :: @c_function(raylib,"DrawRectangle",(i32,i32,i32,i32,Color)->void);
+
+Color :: struct {
+ r:u8;
+ g:u8;
+ b:u8;
+ a:u8;
};
+KEY_ENTER :: 257i32;
+
+GESTURE_TAP :: 1u32;
+
+LOGO :: 0;
+TITLE :: 1;
+GAMEPLAY :: 2;
+ENDING :: 3;
+
main :: () -> void {
- a := 3u8;
- t(2u8);
+ SCREEN_WIDTH :: 800i32;
+ SCREEN_HEIGHT :: 450i32;
+
+ RAYWHITE := color(245u8,245u8,245u8,255u8);
+ LIGHTGRAY := color(200u8,200u8,200u8,255u8);
+ GRAY := color(130u8,130u8,130u8,255u8);
+ GREEN := color(0u8,228u8,48u8,255u8);
+ DARKGREEN := color(0u8,117u8,44u8,255u8);
+ BLUE := color(0u8,121u8,241u8,255u8);
+ DARKBLUE := color(0u8,82u8,172u8,255u8);
+ PURPLE := color(200u8,122u8,255u8,255u8);
+ MAROON := color(100u8,33u8,55u8,255u8);
+
+ title := "Hello\0";
+
+ InitWindow(SCREEN_WIDTH,SCREEN_HEIGHT,&title[0]);
+
+ currentScreen := LOGO;
+
+ framesCounter := 0;
+
+ SetTargetFPS(60i32);
+
+ while(!WindowShouldClose()){
+ if currentScreen == LOGO {
+ framesCounter += 1;
+ if framesCounter > 120 {
+ currentScreen = TITLE;
+ }
+ } else if currentScreen == TITLE {
+ if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
+ currentScreen = GAMEPLAY;
+ }
+ } else if currentScreen == GAMEPLAY {
+ if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
+ currentScreen = ENDING;
+ }
+ } else if currentScreen == ENDING {
+ if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
+ currentScreen = TITLE;
+ }
+ }
+
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if currentScreen == LOGO {
+ title := "LOGO SCREEN\0";
+ DrawText(&title[0],20i32,20i32,40i32,LIGHTGRAY);
+ text := "WAIT for 2 SECONDS...\0";
+ DrawText(&text[0],290i32,220i32,20i32,LIGHTGRAY);
+ } else if currentScreen == TITLE {
+ DrawRectangle(0i32,0i32,SCREEN_WIDTH,SCREEN_HEIGHT,GREEN);
+ title := "TITLE SCREEN\0";
+ DrawText(&title[0],20i32,20i32,40i32,DARKGREEN);
+ text := "PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN\0";
+ DrawText(&text[0],120i32,220i32,20i32,DARKGREEN);
+ } else if currentScreen == GAMEPLAY {
+ DrawRectangle(0i32,0i32,SCREEN_WIDTH,SCREEN_HEIGHT,PURPLE);
+ title := "GAMEPLAY SCREEN\0";
+ DrawText(&title[0],20i32,20i32,40i32,MAROON);
+ text := "PRESS ENTER or TAP to JUMP to ENDING SCREEN\0";
+ DrawText(&text[0],120i32,220i32,20i32,MAROON);
+ } else if currentScreen == ENDING {
+ DrawRectangle(0i32,0i32,SCREEN_WIDTH,SCREEN_HEIGHT,BLUE);
+ title := "ENDING SCREEN\0";
+ DrawText(&title[0],20i32,20i32,40i32,DARKBLUE);
+ text := "PRESS ENTER or TAP to JUMP to TITLE SCREEN\0";
+ DrawText(&text[0],120i32,220i32,20i32,DARKBLUE);
+ }
+
+ EndDrawing();
+ }
+
+ CloseWindow();
+};
+
+color :: (r:u8,g:u8,b:u8,a:u8)->Color {
+ result:Color = undefined;
+
+ result.r = r;
+ result.g = g;
+ result.b = b;
+ result.a = a;
+
+ return result;
};
+
+color :: (value : u32) -> Color {
+ result:Color = undefined;
+
+ result.r = @cast(value >> @cast(3*8,u32),u8);
+ result.g = @cast(value >> @cast(2*8,u32),u8);
+ result.b = @cast(value >> @cast(1*8,u32),u8);
+ result.a = @cast(value >> @cast(0*8,u32),u8);
+
+ return result;
+};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 280b820..ad696f6 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -6256,6 +6256,36 @@ bool setTypesOperatorGeneral(AstTree *tree, AstTreeSetTypesHelper _helper,
if (metadata->function->type->token == AST_TREE_TOKEN_TYPE_FUNCTION) {
AstTreeTypeFunction *function = metadata->function->type->metadata;
tree->type = copyAstTree(function->returnType);
+ } else if (metadata->function->type->token == AST_TREE_TOKEN_TYPE_MACRO) {
+ metadata->function = getValue(metadata->function, false, helper.scope);
+ if (metadata->function->token != AST_TREE_TOKEN_VALUE_MACRO) {
+ UNREACHABLE;
+ }
+ AstTreeMacro *macro = metadata->function->metadata;
+ AstTreeFunction *function =
+ copyAstTreeFunction(macro->function, NULL, NULL, 0, true);
+
+ if (!setTypesAstFunction(function, NULL, helper)) {
+ astTreeFunctionDestroy(*function);
+ free(function);
+ return false;
+ }
+
+ AstTree *functionType = makeTypeOfFunction(function, NULL, NULL);
+
+ if (!doesFunctionMatch(functionType->metadata, metadata, helper)) {
+ printError(tree->str_begin, tree->str_end, "Function call doesn't match");
+ return NULL;
+ }
+
+ const char *str_begin = metadata->function->str_begin;
+ const char *str_end = metadata->function->str_end;
+ astTreeDelete(metadata->function);
+
+ metadata->function = newAstTree(AST_TREE_TOKEN_FUNCTION, function,
+ functionType, str_begin, str_end);
+
+ tree->type = copyAstTree(function->returnType);
} else if (metadata->function->type->token ==
AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER) {
AstTree *function = getShapeShifterElement(metadata, helper);
@@ -6266,6 +6296,7 @@ bool setTypesOperatorGeneral(AstTree *tree, AstTreeSetTypesHelper _helper,
AstTreeTypeFunction *functionType = metadata->function->type->metadata;
tree->type = copyAstTree(functionType->returnType);
} else {
+ printLog("%s", AST_TREE_TOKEN_STRINGS[metadata->function->type->token]);
UNREACHABLE;
}
@@ -8313,7 +8344,6 @@ AstTree *getShapeShifterElement(AstTreeFunctionCall *metadata,
shapeShifter->generateds.functions = a404m_realloc(
shapeShifter->generateds.functions,
generateds_size * sizeof(*shapeShifter->generateds.functions));
- printLog("%ld", generateds_size);
shapeShifter->generateds.calls = a404m_realloc(
shapeShifter->generateds.calls,
generateds_size * sizeof(*shapeShifter->generateds.calls));
diff --git a/src/runner/runner.c b/src/runner/runner.c
index f376710..c9f2dd1 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -7,8 +7,8 @@
#include "utils/type.h"
#include <dlfcn.h>
#include <ffi.h>
-#include <stdio.h>
#include <memory.h>
+#include <stdio.h>
#define doOperation(op0, op1, operator, originalType, type) \
*((originalType *)(op0)->metadata) = \
@@ -1284,6 +1284,7 @@ AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments,
[((AstTreeSingleChild *)arguments[i]->type->metadata)->token]);
UNREACHABLE;
} else if (arguments[i]->token != AST_TREE_TOKEN_RAW_VALUE) {
+ printLog("%s", AST_TREE_TOKEN_STRINGS[arguments[i]->type->token]);
UNREACHABLE;
}
values[i] = arguments[i]->metadata;