-- Copyright (c) 2024 - Ognjen 'xolatile' Milan Robovic -- -- GNU General Public Licence (version 3 or later) with ada.text_io, ada.strings.unbounded, interfaces.c, ray, system; use ada.text_io, ada.strings.unbounded, interfaces.c, ray, system; with ada.sequential_io; with ray; package core is ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ type echo_status is ( failure, warning, success, comment, import, export ); type cursor_code is ( cursor_none, cursor_left, cursor_right, cursor_middle ); type signal_code is ( signal_none, signal_space, signal_0, signal_1, signal_2, signal_3, signal_4, signal_5, signal_6, signal_7, signal_8, signal_9, signal_a, signal_b, signal_c, signal_d, signal_e, signal_f, signal_g, signal_h, signal_i, signal_j, signal_k, signal_l, signal_m, signal_n, signal_o, signal_p, signal_q, signal_r, signal_s, signal_t, signal_u, signal_v, signal_w, signal_x, signal_y, signal_z, signal_grave, signal_escape, signal_enter, signal_tab, signal_backspace, signal_right, signal_left, signal_down, signal_up, signal_kp_0, signal_kp_1, signal_kp_2, signal_kp_3, signal_kp_4, signal_kp_5, signal_kp_6, signal_kp_7, signal_kp_8, signal_kp_9, signal_kp_subtract, signal_kp_add, signal_left_shift, signal_left_control, signal_f1, signal_f2, signal_f3, signal_f4, signal_f5, signal_f6, signal_f7, signal_f8, signal_f9, signal_f10, signal_f11, signal_f12 ); type animation is ( idle, walk, melee, shoot, wounded, dead ); ------------------------------------------------------------------------------------------ type colour_range is range 0 .. 2 ** 8 - 1; for colour_range'size use 8; type colour is record r, g, b, a : colour_range; end record; type pointer is access procedure; type address is new ray.pointer; type vector is record x, y : integer; end record; type sprite is record index, width, height, frames, states : integer; end record; type font is record index, scale, space : integer; end record; type song is record index : integer; end record; type point is record value, limit : natural; end record; type string_box_data is record data : access string := null; text : unbounded_string := null_unbounded_string; size : vector := (0, 0); end record; package io is new ada.sequential_io (integer); subtype unstring is ada.strings.unbounded.unbounded_string; -- function bound (data : in unstring) return string renames ada.strings.unbounded.to_string; function unbound (data : in string) return unstring renames ada.strings.unbounded.to_unbounded_string; ------------------------------------------------------------------------------------------ terminator : constant character := character'val (0); tabulator : constant character := character'val (9); line_feed : constant character := character'val (10); folder : constant string := "."; icon : constant natural := 32; base : constant natural := 16; more : constant natural := 10; less : constant natural := 5; gameplay_framerate : constant natural := 60; animation_framerate : constant natural := 4; echo_mark : constant array (echo_status) of boolean := ( failure => true, warning => true, success => true, comment => true, import => true, export => true ); engine_active : boolean := false; cursor : vector := (0, 0); camera : vector := (0, 0); cursor_mode : cursor_code := cursor_none; signal_mode : signal_code := signal_none; framerate : integer := 0; global_time : natural := 0; gameplay_time : natural := 0; animation_time : natural := 0; wheel : float := 0.0; zoom : natural := 1; help_box : string_box_data; global_image : ray.image; end_turn : boolean := false; ------------------------------------------------------------------------------------------ function "=" (a, b : in signal_code) return boolean; function "=" (a, b : in cursor_code) return boolean; function "/" (a, b : in signal_code) return boolean; function "/" (a, b : in cursor_code) return boolean; function "+" (data : in point; modifier : in natural) return point; function "-" (data : in point; modifier : in natural) return point; function "*" (data : in point; modifier : in natural) return point; function "/" (data : in point; modifier : in natural) return point; procedure echo ( status : in echo_status; text : in string); procedure echo_when (condition : in boolean; status : in echo_status; text : in string); procedure dash; procedure semi_dash; function time return float; function compress (data : in address; size : in integer; used : out integer) return address; function decompress (data : in address; size : in integer; used : out integer) return address; --~procedure compress_file (file_path : in string); --~procedure decompress_file (file_path : in string); procedure zoom_in; procedure zoom_out; function c_string (ada_string : in string) return string; function string_width (data : in string) return natural; function string_height (data : in string) return natural; function random (minimum, maximum : in integer) return integer; procedure clip (value : in out integer; minimum, maximum : in integer); function lowercase (text : in string) return string; function window_width return integer; function window_height return integer; function center_x (width : in integer) return integer; function center_y (height : in integer) return integer; function cursor_inside (x, y, width, height : in integer) return boolean; function import_sprite (file_path : in string; frames, states : in integer) return sprite; function import_font (file_path : in string; scale, space : in integer) return font; function import_song (file_path : in string) return song; procedure import_text (data : in out string_box_data; file_path : in string); procedure create_image (width, height : in integer); procedure render_image (data : in sprite; x, y, u, v, width, height : in integer); procedure draw_pixel (x, y : in integer; tint : in colour); procedure export_image (file_path : in string); procedure draw (data : in sprite := (others => 0); x : in integer := 0; y : in integer := 0; u : in integer := 0; v : in integer := 0; width : in integer := 0; height : in integer := 0; ignore : in boolean := false; state : in animation := idle; factor : in integer := zoom; tint : in colour := (others => 255)); procedure draw_horizontally (data : in sprite; x, y, width, factor : in integer; tint : in colour := (others => 255)); procedure draw_vertically (data : in sprite; x, y, height, factor : in integer; tint : in colour := (others => 255)); procedure write (text : in string := ""; x : in integer := 0; y : in integer := 0; tint : in colour := (others => 255); size : in integer := 0; data : in font := (others => 0)); procedure play (index : in integer); procedure stop (index : in integer); procedure overlay; function read_help_box return string; procedure write_help_box (text : in string); procedure save_point (here : in core.io.file_type; data : in point); procedure load_point (here : in core.io.file_type; data : out point); procedure increment (value : in out integer; super : in natural := 1); procedure decrement (value : in out integer; super : in natural := 1); procedure idle_skip; procedure toggle_fullscreen; procedure initialize; procedure deinitialize; procedure synchronize; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ end core;