TIC-80-guile/src/studio.h

270 lines
6.2 KiB
C
Raw Normal View History

2017-09-26 08:59:34 +02:00
// MIT License
// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#pragma once
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
2018-02-06 20:15:56 +01:00
// #include <SDL.h>
2017-09-26 08:59:34 +02:00
#if defined(__EMSCRIPTEN__)
#include <emscripten.h>
#endif
#include "tic.h"
#include "ticapi.h"
#include "defines.h"
#include "tools.h"
2018-02-07 16:21:24 +01:00
#include "net.h"
2018-02-08 12:26:17 +01:00
#include "ext/file_dialog.h"
2017-09-26 08:59:34 +02:00
#define TIC_LOCAL ".local/"
#define TIC_CACHE TIC_LOCAL "cache/"
2018-02-06 20:15:56 +01:00
// #define TIC_MOD_CTRL (KMOD_GUI|KMOD_CTRL)
2017-09-26 08:59:34 +02:00
2017-10-20 09:32:31 +02:00
#define TOOLBAR_SIZE 7
2017-09-26 08:59:34 +02:00
#define STUDIO_TEXT_WIDTH (TIC_FONT_WIDTH)
#define STUDIO_TEXT_HEIGHT (TIC_FONT_HEIGHT+1)
#define STUDIO_TEXT_BUFFER_WIDTH (TIC80_WIDTH / STUDIO_TEXT_WIDTH)
#define STUDIO_TEXT_BUFFER_HEIGHT (TIC80_HEIGHT / STUDIO_TEXT_HEIGHT)
2017-10-20 09:37:30 +02:00
#define TIC_COLOR_BG (tic_color_black)
2017-09-26 08:59:34 +02:00
#define DEFAULT_CHMOD 0755
#define CONFIG_TIC "config " TIC_VERSION_LABEL ".tic"
#define CONFIG_TIC_PATH TIC_LOCAL CONFIG_TIC
2018-01-24 15:56:55 +01:00
#define KEYMAP_COUNT (sizeof(tic80_gamepads) * BITS_IN_BYTE)
#define KEYMAP_SIZE (KEYMAP_COUNT)
2017-09-26 08:59:34 +02:00
#define KEYMAP_DAT "keymap.dat"
#define KEYMAP_DAT_PATH TIC_LOCAL KEYMAP_DAT
2017-11-19 15:44:01 +01:00
#define CART_EXT ".tic"
#define PROJECT_LUA_EXT ".lua"
#define PROJECT_MOON_EXT ".moon"
#define PROJECT_JS_EXT ".js"
2018-02-05 14:52:55 +01:00
#define PROJECT_WREN_EXT ".wren"
2017-11-19 15:44:01 +01:00
2017-09-26 08:59:34 +02:00
typedef struct
{
struct
{
struct
{
s32 sprite;
bool pixelPerfect;
} cursor;
struct
{
2017-12-23 16:19:51 +01:00
tic_code_theme syntax;
2017-09-26 08:59:34 +02:00
u8 bg;
u8 select;
u8 cursor;
bool shadow;
2017-09-26 08:59:34 +02:00
} code;
struct
{
struct
{
u8 alpha;
} touch;
} gamepad;
} theme;
s32 gifScale;
s32 gifLength;
bool checkNewVersion;
bool noSound;
bool useVsync;
bool showSync;
2017-09-26 08:59:34 +02:00
} StudioConfig;
typedef enum
{
TIC_START_MODE,
TIC_CONSOLE_MODE,
TIC_RUN_MODE,
TIC_CODE_MODE,
TIC_SPRITE_MODE,
TIC_MAP_MODE,
TIC_WORLD_MODE,
TIC_SFX_MODE,
TIC_MUSIC_MODE,
TIC_DIALOG_MODE,
TIC_MENU_MODE,
TIC_SURF_MODE,
} EditorMode;
2018-02-01 17:34:42 +01:00
typedef struct
{
s32 x, y;
} tic_point;
typedef struct
{
s32 x, y, w, h;
} tic_rect;
2018-01-24 10:20:05 +01:00
// SDL_Event* pollEvent();
2018-02-06 20:15:56 +01:00
void setCursor(tic_cursor id);
2017-09-26 08:59:34 +02:00
s32 getMouseX();
s32 getMouseY();
2018-02-01 17:34:42 +01:00
bool checkMousePos(const tic_rect* rect);
bool checkMouseClick(const tic_rect* rect, s32 button);
bool checkMouseDown(const tic_rect* rect, s32 button);
2017-09-26 08:59:34 +02:00
2018-02-01 17:34:42 +01:00
bool getGesturePos(tic_point* pos);
2017-09-26 08:59:34 +02:00
2018-01-24 17:09:22 +01:00
// const u8* getKeyboard();
2017-09-26 08:59:34 +02:00
void drawToolbar(tic_mem* tic, u8 color, bool bg);
void drawBitIcon(s32 x, s32 y, const u8* ptr, u8 color);
void studioRomLoaded();
void studioRomSaved();
void studioConfigChanged();
void setStudioMode(EditorMode mode);
2017-12-19 12:02:56 +01:00
void resumeRunMode();
2017-09-26 08:59:34 +02:00
EditorMode getStudioMode();
void exitStudio();
u32 unzip(u8** dest, const u8* source, size_t size);
2017-11-11 12:44:41 +01:00
void str2buf(const char* str, s32 size, void* buf, bool flip);
2017-09-26 08:59:34 +02:00
void toClipboard(const void* data, s32 size, bool flip);
bool fromClipboard(void* data, s32 size, bool flip, bool remove_white_spaces);
2017-09-26 08:59:34 +02:00
typedef enum
{
TIC_CLIPBOARD_NONE,
TIC_CLIPBOARD_CUT,
TIC_CLIPBOARD_COPY,
TIC_CLIPBOARD_PASTE,
} ClipboardEvent;
2018-02-12 17:15:05 +01:00
ClipboardEvent getClipboardEvent();
2017-09-26 08:59:34 +02:00
typedef enum
{
TIC_TOOLBAR_CUT,
TIC_TOOLBAR_COPY,
TIC_TOOLBAR_PASTE,
TIC_TOOLBAR_UNDO,
TIC_TOOLBAR_REDO,
} StudioEvent;
void setStudioEvent(StudioEvent event);
void showTooltip(const char* text);
2018-01-24 15:56:55 +01:00
tic_key* getKeymap();
2017-09-26 08:59:34 +02:00
2018-02-07 16:21:24 +01:00
TIC80_API const StudioConfig* getConfig();
2017-09-26 08:59:34 +02:00
void setSpritePixel(tic_tile* tiles, s32 x, s32 y, u8 color);
u8 getSpritePixel(tic_tile* tiles, s32 x, s32 y);
typedef void(*DialogCallback)(bool yes, void* data);
void showDialog(const char** text, s32 rows, DialogCallback callback, void* data);
void hideDialog();
void hideGameMenu();
bool studioCartChanged();
void playSystemSfx(s32 id);
void runGameFromSurf();
void gotoCode();
2017-09-28 16:20:27 +02:00
void gotoSurf();
void exitFromGameMenu();
2017-10-20 08:58:35 +02:00
void runProject();
2017-12-13 21:04:22 +01:00
2017-12-14 15:08:04 +01:00
tic_tiles* getBankTiles();
tic_map* getBankMap();
2018-01-24 10:20:05 +01:00
2018-01-24 12:01:19 +01:00
typedef struct
{
tic_mem* tic;
2018-01-24 17:09:22 +01:00
bool quit;
2018-01-24 12:01:19 +01:00
} Studio;
2018-02-07 16:21:24 +01:00
typedef struct
{
void (*setClipboardText)(const char* text);
bool (*hasClipboardText)();
char* (*getClipboardText)();
u64 (*getPerformanceCounter)();
u64 (*getPerformanceFrequency)();
void* (*netGetRequest)(Net* net, const char* path, s32* size);
Net* (*createNet)();
void (*closeNet)(Net* net);
2018-02-08 12:26:17 +01:00
void (*file_dialog_load)(file_dialog_load_callback callback, void* data);
void (*file_dialog_save)(file_dialog_save_callback callback, const char* name, const u8* buffer, size_t size, void* data, u32 mode);
2018-02-07 16:21:24 +01:00
} System;
TIC80_API Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* appFolder, System* system);
TIC80_API void studioTick(void* pixels);
TIC80_API void studioClose();
2018-01-24 14:39:29 +01:00
char getKeyboardText();
2018-02-12 17:16:37 +01:00
bool isKeyBeenPressed(tic_key key);
bool isAnyKeyBeenPressed();
2018-02-06 20:15:56 +01:00
void setClipboardText(const char* text);
bool hasClipboardText();
char* getClipboardText();
u64 getPerformanceCounter();
u64 getPerformanceFrequency();
2018-02-07 16:21:24 +01:00
void* _netGetRequest(Net* net, const char* path, s32* size);
Net* _createNet();
void _closeNet(Net* net);
2018-02-08 12:26:17 +01:00
void _file_dialog_load(file_dialog_load_callback callback, void* data);
void _file_dialog_save(file_dialog_save_callback callback, const char* name, const u8* buffer, size_t size, void* data, u32 mode);
2018-02-08 13:29:14 +01:00
typedef struct
{
s32 major;
s32 minor;
s32 patch;
} NetVersion;
NetVersion netVersionRequest(Net* net);
void netDirRequest(Net* net, const char* path, ListCallback callback, void* data);