read javascript code from a js file!
the wii does the game loop now, as i passed some c functions to javascript. those functions are inside objects to make the js api easier to read and use.
This commit is contained in:
parent
c6be391b8b
commit
e5dfbf0e0c
6 changed files with 124 additions and 24 deletions
|
@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.13)
|
||||||
|
|
||||||
if (DEFINED ENV{DEVKITPRO})
|
if (DEFINED ENV{DEVKITPRO})
|
||||||
set(DEVKITPRO $ENV{DEVKITPRO})
|
set(DEVKITPRO $ENV{DEVKITPRO})
|
||||||
|
else()
|
||||||
|
message("Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitpro")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_TOOLCHAIN_FILE "${DEVKITPRO}/cmake/Wii.cmake")
|
set(CMAKE_TOOLCHAIN_FILE "${DEVKITPRO}/cmake/Wii.cmake")
|
||||||
|
|
1
source/.gitignore
vendored
Normal file
1
source/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
game.c
|
|
@ -1,3 +1,10 @@
|
||||||
add_executable(WiiDuktape main.c)
|
add_custom_command(
|
||||||
|
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/asset_generator.py ${CMAKE_CURRENT_SOURCE_DIR}/game.js ${CMAKE_CURRENT_SOURCE_DIR}/game.c
|
||||||
|
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/game.c
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/game.js
|
||||||
|
COMMENT "Creating game.c from game.js"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(WiiDuktape main.c game.c)
|
||||||
target_link_libraries(WiiDuktape duktape)
|
target_link_libraries(WiiDuktape duktape)
|
||||||
ogc_create_dol(WiiDuktape)
|
ogc_create_dol(WiiDuktape)
|
||||||
|
|
20
source/asset_generator.py
Executable file
20
source/asset_generator.py
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
|
parser.add_argument("input")
|
||||||
|
parser.add_argument("output")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
script = Path(args.input).read_text().replace("\n", "\\n").replace('"', '\\"')
|
||||||
|
|
||||||
|
code = f"""
|
||||||
|
const char* program = "{script}";
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(args.output, 'w') as f:
|
||||||
|
f.write(code)
|
19
source/game.js
Normal file
19
source/game.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
const PAD_BUTTON_START = 0x1000;
|
||||||
|
const PAD_BUTTON_A = 0x0100;
|
||||||
|
|
||||||
|
while (wii.running) {
|
||||||
|
wii.pad.scan_pads();
|
||||||
|
|
||||||
|
const pressed = wii.pad.buttons_down();
|
||||||
|
|
||||||
|
if (pressed & PAD_BUTTON_START) {
|
||||||
|
wii.print("exiting from js");
|
||||||
|
wii.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pressed & PAD_BUTTON_A) {
|
||||||
|
wii.print("a pressed");
|
||||||
|
}
|
||||||
|
|
||||||
|
wii.video.wait_vsync();
|
||||||
|
}
|
|
@ -1,23 +1,88 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <gccore.h>
|
#include <gccore.h>
|
||||||
#include <wiiuse/wpad.h>
|
#include <ogcsys.h>
|
||||||
#include <duktape.h>
|
#include <duktape.h>
|
||||||
|
|
||||||
static void *xfb = NULL;
|
static void *xfb = NULL;
|
||||||
static GXRModeObj *rmode = NULL;
|
static GXRModeObj *rmode = NULL;
|
||||||
|
extern const char* program;
|
||||||
|
|
||||||
static duk_ret_t native_print(duk_context *ctx) {
|
static duk_ret_t native_print(duk_context *ctx) {
|
||||||
printf("%s\n", duk_to_string(ctx, 0));
|
printf("%s\n", duk_to_string(ctx, 0));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static duk_ret_t native_exit(duk_context *ctx) {
|
||||||
|
duk_push_global_object(ctx);
|
||||||
|
duk_push_string(ctx, "wii");
|
||||||
|
duk_get_prop(ctx, -2);
|
||||||
|
duk_push_boolean(ctx, false);
|
||||||
|
duk_put_prop_string(ctx, -2, "running");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void duk_fatal_error(void *udata, const char *msg) {
|
||||||
|
printf("an error has occured: %s\n", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static duk_ret_t video_wait_vsync(duk_context *ctx) {
|
||||||
|
VIDEO_WaitVSync();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static duk_ret_t pad_scan_pads() {
|
||||||
|
PAD_ScanPads();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static duk_ret_t pad_buttons_down(duk_context *ctx) {
|
||||||
|
u32 pressed = PAD_ButtonsDown(0);
|
||||||
|
duk_push_number(ctx, pressed);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void define_pad_object(duk_context *ctx) {
|
||||||
|
duk_idx_t pad_obj = duk_push_object(ctx);
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, pad_scan_pads, 0);
|
||||||
|
duk_put_prop_string(ctx, pad_obj, "scan_pads");
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, pad_buttons_down, 0);
|
||||||
|
duk_put_prop_string(ctx, pad_obj, "buttons_down");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void define_video_object(duk_context *ctx) {
|
||||||
|
duk_idx_t video_obj = duk_push_object(ctx);
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, video_wait_vsync, 0);
|
||||||
|
duk_put_prop_string(ctx, video_obj, "wait_vsync");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void define_wii_object(duk_context *ctx) {
|
||||||
|
duk_idx_t wii_obj = duk_push_object(ctx);
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, native_print, 1);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "print");
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, native_exit, 0);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "exit");
|
||||||
|
|
||||||
|
define_pad_object(ctx);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "pad");
|
||||||
|
|
||||||
|
define_video_object(ctx);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "video");
|
||||||
|
|
||||||
|
duk_push_boolean(ctx, true);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "running");
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
// Initialise the video system
|
// Initialise the video system
|
||||||
VIDEO_Init();
|
VIDEO_Init();
|
||||||
|
|
||||||
// This function initialises the attached controllers
|
// This function initialises the attached controllers
|
||||||
WPAD_Init();
|
PAD_Init();
|
||||||
|
|
||||||
// Obtain the preferred video mode from the system
|
// Obtain the preferred video mode from the system
|
||||||
// This will correspond to the settings in the Wii menu
|
// This will correspond to the settings in the Wii menu
|
||||||
|
@ -51,31 +116,17 @@ int main(int argc, char **argv) {
|
||||||
// e.g. printf ("\x1b[%d;%dH", row, column );
|
// e.g. printf ("\x1b[%d;%dH", row, column );
|
||||||
printf("\x1b[2;0H");
|
printf("\x1b[2;0H");
|
||||||
|
|
||||||
// printf("Hello World!");
|
duk_context *ctx = duk_create_heap(NULL, NULL, NULL, NULL, duk_fatal_error);
|
||||||
|
|
||||||
duk_context *ctx = duk_create_heap_default();
|
define_wii_object(ctx);
|
||||||
duk_push_c_function(ctx, native_print, 1);
|
duk_put_global_string(ctx, "wii");
|
||||||
duk_put_global_string(ctx, "print");
|
|
||||||
|
|
||||||
duk_eval_string_noresult(ctx, "while (1) {print('hello world')}");
|
duk_eval_string_noresult(ctx, program);
|
||||||
|
|
||||||
while(1) {
|
printf("destroying heap\n");
|
||||||
|
duk_destroy_heap(ctx);
|
||||||
|
|
||||||
// Call WPAD_ScanPads each loop, this reads the latest controller states
|
printf("exit time\n");
|
||||||
// WPAD_ScanPads();
|
|
||||||
|
|
||||||
// WPAD_ButtonsDown tells us which buttons were pressed in this loop
|
|
||||||
// this is a "one shot" state which will not fire again until the button has been released
|
|
||||||
// u32 pressed = WPAD_ButtonsDown(0);
|
|
||||||
|
|
||||||
// We return to the launcher application via exit
|
|
||||||
// if ( pressed & WPAD_BUTTON_HOME ) exit(0);
|
|
||||||
// printf("Hello World!");
|
|
||||||
// duk_eval_string_noresult(ctx, "print('hello, world!');");
|
|
||||||
|
|
||||||
// Wait for the next frame
|
|
||||||
VIDEO_WaitVSync();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue